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