xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/VertexArrayGL.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // VertexArrayGL.h: Defines the class interface for VertexArrayGL.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_GL_VERTEXARRAYGL_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_GL_VERTEXARRAYGL_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/VertexArrayImpl.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ContextGL.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker class FunctionsGL;
22*8975f5c5SAndroid Build Coastguard Worker class StateManagerGL;
23*8975f5c5SAndroid Build Coastguard Worker struct VertexArrayStateGL;
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker class VertexArrayGL : public VertexArrayImpl
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker   public:
28*8975f5c5SAndroid Build Coastguard Worker     VertexArrayGL(const gl::VertexArrayState &data, GLuint id);
29*8975f5c5SAndroid Build Coastguard Worker     VertexArrayGL(const gl::VertexArrayState &data, GLuint id, VertexArrayStateGL *sharedState);
30*8975f5c5SAndroid Build Coastguard Worker     ~VertexArrayGL() override;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncClientSideData(const gl::Context *context,
35*8975f5c5SAndroid Build Coastguard Worker                                      const gl::AttributesMask &activeAttributesMask,
36*8975f5c5SAndroid Build Coastguard Worker                                      GLint first,
37*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei count,
38*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei instanceCount) const;
39*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDrawElementsState(const gl::Context *context,
40*8975f5c5SAndroid Build Coastguard Worker                                         const gl::AttributesMask &activeAttributesMask,
41*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei count,
42*8975f5c5SAndroid Build Coastguard Worker                                         gl::DrawElementsType type,
43*8975f5c5SAndroid Build Coastguard Worker                                         const void *indices,
44*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei instanceCount,
45*8975f5c5SAndroid Build Coastguard Worker                                         bool primitiveRestartEnabled,
46*8975f5c5SAndroid Build Coastguard Worker                                         const void **outIndices) const;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     GLuint getVertexArrayID() const;
49*8975f5c5SAndroid Build Coastguard Worker     VertexArrayStateGL *getNativeState() const;
syncsToSharedState()50*8975f5c5SAndroid Build Coastguard Worker     bool syncsToSharedState() const { return !mOwnsNativeState; }
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const gl::Context *context,
53*8975f5c5SAndroid Build Coastguard Worker                             const gl::VertexArray::DirtyBits &dirtyBits,
54*8975f5c5SAndroid Build Coastguard Worker                             gl::VertexArray::DirtyAttribBitsArray *attribBits,
55*8975f5c5SAndroid Build Coastguard Worker                             gl::VertexArray::DirtyBindingBitsArray *bindingBits) override;
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     angle::Result applyNumViewsToDivisor(const gl::Context *context, int numViews);
58*8975f5c5SAndroid Build Coastguard Worker     angle::Result applyActiveAttribLocationsMask(const gl::Context *context,
59*8975f5c5SAndroid Build Coastguard Worker                                                  const gl::AttributesMask &activeMask);
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     angle::Result validateState(const gl::Context *context) const;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     angle::Result recoverForcedStreamingAttributesForDrawArraysInstanced(
64*8975f5c5SAndroid Build Coastguard Worker         const gl::Context *context) const;
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker   private:
67*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDrawState(const gl::Context *context,
68*8975f5c5SAndroid Build Coastguard Worker                                 const gl::AttributesMask &activeAttributesMask,
69*8975f5c5SAndroid Build Coastguard Worker                                 GLint first,
70*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei count,
71*8975f5c5SAndroid Build Coastguard Worker                                 gl::DrawElementsType type,
72*8975f5c5SAndroid Build Coastguard Worker                                 const void *indices,
73*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei instanceCount,
74*8975f5c5SAndroid Build Coastguard Worker                                 bool primitiveRestartEnabled,
75*8975f5c5SAndroid Build Coastguard Worker                                 const void **outIndices) const;
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     // Apply index data, only sets outIndexRange if attributesNeedStreaming is true
78*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncIndexData(const gl::Context *context,
79*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei count,
80*8975f5c5SAndroid Build Coastguard Worker                                 gl::DrawElementsType type,
81*8975f5c5SAndroid Build Coastguard Worker                                 const void *indices,
82*8975f5c5SAndroid Build Coastguard Worker                                 bool primitiveRestartEnabled,
83*8975f5c5SAndroid Build Coastguard Worker                                 bool attributesNeedStreaming,
84*8975f5c5SAndroid Build Coastguard Worker                                 gl::IndexRange *outIndexRange,
85*8975f5c5SAndroid Build Coastguard Worker                                 const void **outIndices) const;
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     // Returns the amount of space needed to stream all attributes that need streaming
88*8975f5c5SAndroid Build Coastguard Worker     // and the data size of the largest attribute
89*8975f5c5SAndroid Build Coastguard Worker     void computeStreamingAttributeSizes(const gl::AttributesMask &attribsToStream,
90*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei instanceCount,
91*8975f5c5SAndroid Build Coastguard Worker                                         const gl::IndexRange &indexRange,
92*8975f5c5SAndroid Build Coastguard Worker                                         size_t *outStreamingDataSize,
93*8975f5c5SAndroid Build Coastguard Worker                                         size_t *outMaxAttributeDataSize) const;
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker     // Stream attributes that have client data
96*8975f5c5SAndroid Build Coastguard Worker     angle::Result streamAttributes(const gl::Context *context,
97*8975f5c5SAndroid Build Coastguard Worker                                    const gl::AttributesMask &attribsToStream,
98*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei instanceCount,
99*8975f5c5SAndroid Build Coastguard Worker                                    const gl::IndexRange &indexRange,
100*8975f5c5SAndroid Build Coastguard Worker                                    bool applyExtraOffsetWorkaroundForInstancedAttributes) const;
101*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyAttrib(const gl::Context *context,
102*8975f5c5SAndroid Build Coastguard Worker                                   size_t attribIndex,
103*8975f5c5SAndroid Build Coastguard Worker                                   const gl::VertexArray::DirtyAttribBits &dirtyAttribBits);
104*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncDirtyBinding(const gl::Context *context,
105*8975f5c5SAndroid Build Coastguard Worker                                    size_t bindingIndex,
106*8975f5c5SAndroid Build Coastguard Worker                                    const gl::VertexArray::DirtyBindingBits &dirtyBindingBits);
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateAttribEnabled(const gl::Context *context, size_t attribIndex);
109*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateAttribPointer(const gl::Context *context, size_t attribIndex);
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker     bool supportVertexAttribBinding(const gl::Context *context) const;
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateAttribFormat(const gl::Context *context, size_t attribIndex);
114*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateAttribBinding(const gl::Context *context, size_t attribIndex);
115*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateBindingBuffer(const gl::Context *context, size_t bindingIndex);
116*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateBindingDivisor(const gl::Context *context, size_t bindingIndex);
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateElementArrayBufferBinding(const gl::Context *context) const;
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     angle::Result callVertexAttribPointer(const gl::Context *context,
121*8975f5c5SAndroid Build Coastguard Worker                                           GLuint attribIndex,
122*8975f5c5SAndroid Build Coastguard Worker                                           const gl::VertexAttribute &attrib,
123*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei stride,
124*8975f5c5SAndroid Build Coastguard Worker                                           GLintptr offset) const;
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     angle::Result recoverForcedStreamingAttributesForDrawArraysInstanced(
127*8975f5c5SAndroid Build Coastguard Worker         const gl::Context *context,
128*8975f5c5SAndroid Build Coastguard Worker         gl::AttributesMask *attributeMask) const;
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     GLuint mVertexArrayID = 0;
131*8975f5c5SAndroid Build Coastguard Worker     int mAppliedNumViews  = 1;
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     // Remember the program's active attrib location mask so that attributes can be enabled/disabled
134*8975f5c5SAndroid Build Coastguard Worker     // based on whether they are active in the program
135*8975f5c5SAndroid Build Coastguard Worker     gl::AttributesMask mProgramActiveAttribLocationsMask;
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker     bool mOwnsNativeState            = false;
138*8975f5c5SAndroid Build Coastguard Worker     VertexArrayStateGL *mNativeState = nullptr;
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     mutable gl::BindingPointer<gl::Buffer> mElementArrayBuffer;
141*8975f5c5SAndroid Build Coastguard Worker     mutable std::array<gl::BindingPointer<gl::Buffer>, gl::MAX_VERTEX_ATTRIBS> mArrayBuffers;
142*8975f5c5SAndroid Build Coastguard Worker 
143*8975f5c5SAndroid Build Coastguard Worker     mutable size_t mStreamingElementArrayBufferSize = 0;
144*8975f5c5SAndroid Build Coastguard Worker     mutable GLuint mStreamingElementArrayBuffer     = 0;
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker     mutable size_t mStreamingArrayBufferSize = 0;
147*8975f5c5SAndroid Build Coastguard Worker     mutable GLuint mStreamingArrayBuffer     = 0;
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     // Used for Mac Intel instanced draw workaround
150*8975f5c5SAndroid Build Coastguard Worker     mutable gl::AttributesMask mForcedStreamingAttributesForDrawArraysInstancedMask;
151*8975f5c5SAndroid Build Coastguard Worker     mutable gl::AttributesMask mInstancedAttributesMask;
152*8975f5c5SAndroid Build Coastguard Worker     mutable std::array<GLint, gl::MAX_VERTEX_ATTRIBS> mForcedStreamingAttributesFirstOffsets;
153*8975f5c5SAndroid Build Coastguard Worker };
154*8975f5c5SAndroid Build Coastguard Worker 
syncDrawElementsState(const gl::Context * context,const gl::AttributesMask & activeAttributesMask,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instanceCount,bool primitiveRestartEnabled,const void ** outIndices)155*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE angle::Result VertexArrayGL::syncDrawElementsState(
156*8975f5c5SAndroid Build Coastguard Worker     const gl::Context *context,
157*8975f5c5SAndroid Build Coastguard Worker     const gl::AttributesMask &activeAttributesMask,
158*8975f5c5SAndroid Build Coastguard Worker     GLsizei count,
159*8975f5c5SAndroid Build Coastguard Worker     gl::DrawElementsType type,
160*8975f5c5SAndroid Build Coastguard Worker     const void *indices,
161*8975f5c5SAndroid Build Coastguard Worker     GLsizei instanceCount,
162*8975f5c5SAndroid Build Coastguard Worker     bool primitiveRestartEnabled,
163*8975f5c5SAndroid Build Coastguard Worker     const void **outIndices) const
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker     return syncDrawState(context, activeAttributesMask, 0, count, type, indices, instanceCount,
166*8975f5c5SAndroid Build Coastguard Worker                          primitiveRestartEnabled, outIndices);
167*8975f5c5SAndroid Build Coastguard Worker }
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_GL_VERTEXARRAYGL_H_
172