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