xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 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 // VertexBuffer.cpp: Defines the abstract VertexBuffer class and VertexBufferInterface
8*8975f5c5SAndroid Build Coastguard Worker // class with derivations, classes that perform graphics API agnostic vertex buffer operations.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/VertexBuffer.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexAttribute.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/BufferD3D.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ContextD3D.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 // VertexBuffer Implementation
22*8975f5c5SAndroid Build Coastguard Worker unsigned int VertexBuffer::mNextSerial = 1;
23*8975f5c5SAndroid Build Coastguard Worker 
VertexBuffer()24*8975f5c5SAndroid Build Coastguard Worker VertexBuffer::VertexBuffer() : mRefCount(1)
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker     updateSerial();
27*8975f5c5SAndroid Build Coastguard Worker }
28*8975f5c5SAndroid Build Coastguard Worker 
~VertexBuffer()29*8975f5c5SAndroid Build Coastguard Worker VertexBuffer::~VertexBuffer() {}
30*8975f5c5SAndroid Build Coastguard Worker 
updateSerial()31*8975f5c5SAndroid Build Coastguard Worker void VertexBuffer::updateSerial()
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker     mSerial = mNextSerial++;
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker 
getSerial() const36*8975f5c5SAndroid Build Coastguard Worker unsigned int VertexBuffer::getSerial() const
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker     return mSerial;
39*8975f5c5SAndroid Build Coastguard Worker }
40*8975f5c5SAndroid Build Coastguard Worker 
addRef()41*8975f5c5SAndroid Build Coastguard Worker void VertexBuffer::addRef()
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     mRefCount++;
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker 
release()46*8975f5c5SAndroid Build Coastguard Worker void VertexBuffer::release()
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRefCount > 0);
49*8975f5c5SAndroid Build Coastguard Worker     mRefCount--;
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     if (mRefCount == 0)
52*8975f5c5SAndroid Build Coastguard Worker     {
53*8975f5c5SAndroid Build Coastguard Worker         delete this;
54*8975f5c5SAndroid Build Coastguard Worker     }
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker // VertexBufferInterface Implementation
VertexBufferInterface(BufferFactoryD3D * factory,bool dynamic)58*8975f5c5SAndroid Build Coastguard Worker VertexBufferInterface::VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic)
59*8975f5c5SAndroid Build Coastguard Worker     : mFactory(factory), mVertexBuffer(factory->createVertexBuffer()), mDynamic(dynamic)
60*8975f5c5SAndroid Build Coastguard Worker {}
61*8975f5c5SAndroid Build Coastguard Worker 
~VertexBufferInterface()62*8975f5c5SAndroid Build Coastguard Worker VertexBufferInterface::~VertexBufferInterface()
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker     if (mVertexBuffer)
65*8975f5c5SAndroid Build Coastguard Worker     {
66*8975f5c5SAndroid Build Coastguard Worker         mVertexBuffer->release();
67*8975f5c5SAndroid Build Coastguard Worker         mVertexBuffer = nullptr;
68*8975f5c5SAndroid Build Coastguard Worker     }
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker 
getSerial() const71*8975f5c5SAndroid Build Coastguard Worker unsigned int VertexBufferInterface::getSerial() const
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexBuffer);
74*8975f5c5SAndroid Build Coastguard Worker     return mVertexBuffer->getSerial();
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker 
getBufferSize() const77*8975f5c5SAndroid Build Coastguard Worker unsigned int VertexBufferInterface::getBufferSize() const
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexBuffer);
80*8975f5c5SAndroid Build Coastguard Worker     return mVertexBuffer->getBufferSize();
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
setBufferSize(const gl::Context * context,unsigned int size)83*8975f5c5SAndroid Build Coastguard Worker angle::Result VertexBufferInterface::setBufferSize(const gl::Context *context, unsigned int size)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexBuffer);
86*8975f5c5SAndroid Build Coastguard Worker     if (mVertexBuffer->getBufferSize() == 0)
87*8975f5c5SAndroid Build Coastguard Worker     {
88*8975f5c5SAndroid Build Coastguard Worker         return mVertexBuffer->initialize(context, size, mDynamic);
89*8975f5c5SAndroid Build Coastguard Worker     }
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     return mVertexBuffer->setBufferSize(context, size);
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker 
getSpaceRequired(const gl::Context * context,const gl::VertexAttribute & attrib,const gl::VertexBinding & binding,size_t count,GLsizei instances,GLuint baseInstance,unsigned int * spaceInBytesOut) const94*8975f5c5SAndroid Build Coastguard Worker angle::Result VertexBufferInterface::getSpaceRequired(const gl::Context *context,
95*8975f5c5SAndroid Build Coastguard Worker                                                       const gl::VertexAttribute &attrib,
96*8975f5c5SAndroid Build Coastguard Worker                                                       const gl::VertexBinding &binding,
97*8975f5c5SAndroid Build Coastguard Worker                                                       size_t count,
98*8975f5c5SAndroid Build Coastguard Worker                                                       GLsizei instances,
99*8975f5c5SAndroid Build Coastguard Worker                                                       GLuint baseInstance,
100*8975f5c5SAndroid Build Coastguard Worker                                                       unsigned int *spaceInBytesOut) const
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     unsigned int spaceRequired = 0;
103*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mFactory->getVertexSpaceRequired(context, attrib, binding, count, instances,
104*8975f5c5SAndroid Build Coastguard Worker                                                baseInstance, &spaceRequired));
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     // Align to 16-byte boundary
107*8975f5c5SAndroid Build Coastguard Worker     unsigned int alignedSpaceRequired = roundUpPow2(spaceRequired, 16u);
108*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK_GL_ALLOC(GetImplAs<ContextD3D>(context), alignedSpaceRequired >= spaceRequired);
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     *spaceInBytesOut = alignedSpaceRequired;
111*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker 
discard(const gl::Context * context)114*8975f5c5SAndroid Build Coastguard Worker angle::Result VertexBufferInterface::discard(const gl::Context *context)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexBuffer);
117*8975f5c5SAndroid Build Coastguard Worker     return mVertexBuffer->discard(context);
118*8975f5c5SAndroid Build Coastguard Worker }
119*8975f5c5SAndroid Build Coastguard Worker 
getVertexBuffer() const120*8975f5c5SAndroid Build Coastguard Worker VertexBuffer *VertexBufferInterface::getVertexBuffer() const
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mVertexBuffer);
123*8975f5c5SAndroid Build Coastguard Worker     return mVertexBuffer;
124*8975f5c5SAndroid Build Coastguard Worker }
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker // StreamingVertexBufferInterface Implementation
StreamingVertexBufferInterface(BufferFactoryD3D * factory)127*8975f5c5SAndroid Build Coastguard Worker StreamingVertexBufferInterface::StreamingVertexBufferInterface(BufferFactoryD3D *factory)
128*8975f5c5SAndroid Build Coastguard Worker     : VertexBufferInterface(factory, true), mWritePosition(0), mReservedSpace(0)
129*8975f5c5SAndroid Build Coastguard Worker {}
130*8975f5c5SAndroid Build Coastguard Worker 
initialize(const gl::Context * context,std::size_t initialSize)131*8975f5c5SAndroid Build Coastguard Worker angle::Result StreamingVertexBufferInterface::initialize(const gl::Context *context,
132*8975f5c5SAndroid Build Coastguard Worker                                                          std::size_t initialSize)
133*8975f5c5SAndroid Build Coastguard Worker {
134*8975f5c5SAndroid Build Coastguard Worker     return setBufferSize(context, static_cast<unsigned int>(initialSize));
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
reset()137*8975f5c5SAndroid Build Coastguard Worker void StreamingVertexBufferInterface::reset()
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker     if (mVertexBuffer)
140*8975f5c5SAndroid Build Coastguard Worker     {
141*8975f5c5SAndroid Build Coastguard Worker         mVertexBuffer->release();
142*8975f5c5SAndroid Build Coastguard Worker         mVertexBuffer = mFactory->createVertexBuffer();
143*8975f5c5SAndroid Build Coastguard Worker     }
144*8975f5c5SAndroid Build Coastguard Worker }
145*8975f5c5SAndroid Build Coastguard Worker 
~StreamingVertexBufferInterface()146*8975f5c5SAndroid Build Coastguard Worker StreamingVertexBufferInterface::~StreamingVertexBufferInterface() {}
147*8975f5c5SAndroid Build Coastguard Worker 
reserveSpace(const gl::Context * context,unsigned int size)148*8975f5c5SAndroid Build Coastguard Worker angle::Result StreamingVertexBufferInterface::reserveSpace(const gl::Context *context,
149*8975f5c5SAndroid Build Coastguard Worker                                                            unsigned int size)
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker     unsigned int curBufferSize = getBufferSize();
152*8975f5c5SAndroid Build Coastguard Worker     if (size > curBufferSize)
153*8975f5c5SAndroid Build Coastguard Worker     {
154*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(setBufferSize(context, std::max(size, 3 * curBufferSize / 2)));
155*8975f5c5SAndroid Build Coastguard Worker         mWritePosition = 0;
156*8975f5c5SAndroid Build Coastguard Worker     }
157*8975f5c5SAndroid Build Coastguard Worker     else if (mWritePosition + size > curBufferSize)
158*8975f5c5SAndroid Build Coastguard Worker     {
159*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(discard(context));
160*8975f5c5SAndroid Build Coastguard Worker         mWritePosition = 0;
161*8975f5c5SAndroid Build Coastguard Worker     }
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     mReservedSpace = size;
164*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
165*8975f5c5SAndroid Build Coastguard Worker }
166*8975f5c5SAndroid Build Coastguard Worker 
storeDynamicAttribute(const gl::Context * context,const gl::VertexAttribute & attrib,const gl::VertexBinding & binding,gl::VertexAttribType currentValueType,GLint start,size_t count,GLsizei instances,GLuint baseInstance,unsigned int * outStreamOffset,const uint8_t * sourceData)167*8975f5c5SAndroid Build Coastguard Worker angle::Result StreamingVertexBufferInterface::storeDynamicAttribute(
168*8975f5c5SAndroid Build Coastguard Worker     const gl::Context *context,
169*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexAttribute &attrib,
170*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexBinding &binding,
171*8975f5c5SAndroid Build Coastguard Worker     gl::VertexAttribType currentValueType,
172*8975f5c5SAndroid Build Coastguard Worker     GLint start,
173*8975f5c5SAndroid Build Coastguard Worker     size_t count,
174*8975f5c5SAndroid Build Coastguard Worker     GLsizei instances,
175*8975f5c5SAndroid Build Coastguard Worker     GLuint baseInstance,
176*8975f5c5SAndroid Build Coastguard Worker     unsigned int *outStreamOffset,
177*8975f5c5SAndroid Build Coastguard Worker     const uint8_t *sourceData)
178*8975f5c5SAndroid Build Coastguard Worker {
179*8975f5c5SAndroid Build Coastguard Worker     unsigned int spaceRequired = 0;
180*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(
181*8975f5c5SAndroid Build Coastguard Worker         getSpaceRequired(context, attrib, binding, count, instances, baseInstance, &spaceRequired));
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker     // Protect against integer overflow
184*8975f5c5SAndroid Build Coastguard Worker     angle::CheckedNumeric<unsigned int> checkedPosition(mWritePosition);
185*8975f5c5SAndroid Build Coastguard Worker     checkedPosition += spaceRequired;
186*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK_GL_ALLOC(GetImplAs<ContextD3D>(context), checkedPosition.IsValid());
187*8975f5c5SAndroid Build Coastguard Worker 
188*8975f5c5SAndroid Build Coastguard Worker     mReservedSpace = 0;
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker     size_t adjustedCount = count;
191*8975f5c5SAndroid Build Coastguard Worker     GLuint divisor       = binding.getDivisor();
192*8975f5c5SAndroid Build Coastguard Worker 
193*8975f5c5SAndroid Build Coastguard Worker     if (instances != 0 && divisor != 0)
194*8975f5c5SAndroid Build Coastguard Worker     {
195*8975f5c5SAndroid Build Coastguard Worker         // The attribute is an instanced attribute and it's an draw instance call
196*8975f5c5SAndroid Build Coastguard Worker         // Extra number of elements are copied at the beginning to make sure
197*8975f5c5SAndroid Build Coastguard Worker         // the driver is referencing the correct data with non-zero baseInstance
198*8975f5c5SAndroid Build Coastguard Worker         adjustedCount += UnsignedCeilDivide(baseInstance, divisor);
199*8975f5c5SAndroid Build Coastguard Worker     }
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mVertexBuffer->storeVertexAttributes(context, attrib, binding, currentValueType,
202*8975f5c5SAndroid Build Coastguard Worker                                                    start, adjustedCount, instances, mWritePosition,
203*8975f5c5SAndroid Build Coastguard Worker                                                    sourceData));
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker     if (outStreamOffset)
206*8975f5c5SAndroid Build Coastguard Worker     {
207*8975f5c5SAndroid Build Coastguard Worker         *outStreamOffset = mWritePosition;
208*8975f5c5SAndroid Build Coastguard Worker     }
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker     mWritePosition += spaceRequired;
211*8975f5c5SAndroid Build Coastguard Worker 
212*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
213*8975f5c5SAndroid Build Coastguard Worker }
214*8975f5c5SAndroid Build Coastguard Worker 
reserveVertexSpace(const gl::Context * context,const gl::VertexAttribute & attrib,const gl::VertexBinding & binding,size_t count,GLsizei instances,GLuint baseInstance)215*8975f5c5SAndroid Build Coastguard Worker angle::Result StreamingVertexBufferInterface::reserveVertexSpace(const gl::Context *context,
216*8975f5c5SAndroid Build Coastguard Worker                                                                  const gl::VertexAttribute &attrib,
217*8975f5c5SAndroid Build Coastguard Worker                                                                  const gl::VertexBinding &binding,
218*8975f5c5SAndroid Build Coastguard Worker                                                                  size_t count,
219*8975f5c5SAndroid Build Coastguard Worker                                                                  GLsizei instances,
220*8975f5c5SAndroid Build Coastguard Worker                                                                  GLuint baseInstance)
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker     unsigned int requiredSpace = 0;
223*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mFactory->getVertexSpaceRequired(context, attrib, binding, count, instances,
224*8975f5c5SAndroid Build Coastguard Worker                                                baseInstance, &requiredSpace));
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     // Align to 16-byte boundary
227*8975f5c5SAndroid Build Coastguard Worker     auto alignedRequiredSpace = rx::CheckedRoundUp(requiredSpace, 16u);
228*8975f5c5SAndroid Build Coastguard Worker     alignedRequiredSpace += mReservedSpace;
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker     // Protect against integer overflow
231*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK_GL_ALLOC(GetImplAs<ContextD3D>(context), alignedRequiredSpace.IsValid());
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(reserveSpace(context, alignedRequiredSpace.ValueOrDie()));
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker // StaticVertexBufferInterface Implementation
AttributeSignature()239*8975f5c5SAndroid Build Coastguard Worker StaticVertexBufferInterface::AttributeSignature::AttributeSignature()
240*8975f5c5SAndroid Build Coastguard Worker     : formatID(angle::FormatID::NONE), stride(0), offset(0)
241*8975f5c5SAndroid Build Coastguard Worker {}
242*8975f5c5SAndroid Build Coastguard Worker 
matchesAttribute(const gl::VertexAttribute & attrib,const gl::VertexBinding & binding) const243*8975f5c5SAndroid Build Coastguard Worker bool StaticVertexBufferInterface::AttributeSignature::matchesAttribute(
244*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexAttribute &attrib,
245*8975f5c5SAndroid Build Coastguard Worker     const gl::VertexBinding &binding) const
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker     size_t attribStride = ComputeVertexAttributeStride(attrib, binding);
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker     if (formatID != attrib.format->id || static_cast<GLuint>(stride) != attribStride)
250*8975f5c5SAndroid Build Coastguard Worker     {
251*8975f5c5SAndroid Build Coastguard Worker         return false;
252*8975f5c5SAndroid Build Coastguard Worker     }
253*8975f5c5SAndroid Build Coastguard Worker 
254*8975f5c5SAndroid Build Coastguard Worker     size_t attribOffset =
255*8975f5c5SAndroid Build Coastguard Worker         (static_cast<size_t>(ComputeVertexAttributeOffset(attrib, binding)) % attribStride);
256*8975f5c5SAndroid Build Coastguard Worker     return (offset == attribOffset);
257*8975f5c5SAndroid Build Coastguard Worker }
258*8975f5c5SAndroid Build Coastguard Worker 
set(const gl::VertexAttribute & attrib,const gl::VertexBinding & binding)259*8975f5c5SAndroid Build Coastguard Worker void StaticVertexBufferInterface::AttributeSignature::set(const gl::VertexAttribute &attrib,
260*8975f5c5SAndroid Build Coastguard Worker                                                           const gl::VertexBinding &binding)
261*8975f5c5SAndroid Build Coastguard Worker {
262*8975f5c5SAndroid Build Coastguard Worker     formatID = attrib.format->id;
263*8975f5c5SAndroid Build Coastguard Worker     offset = stride = static_cast<GLuint>(ComputeVertexAttributeStride(attrib, binding));
264*8975f5c5SAndroid Build Coastguard Worker     offset          = static_cast<size_t>(ComputeVertexAttributeOffset(attrib, binding)) %
265*8975f5c5SAndroid Build Coastguard Worker              ComputeVertexAttributeStride(attrib, binding);
266*8975f5c5SAndroid Build Coastguard Worker }
267*8975f5c5SAndroid Build Coastguard Worker 
StaticVertexBufferInterface(BufferFactoryD3D * factory)268*8975f5c5SAndroid Build Coastguard Worker StaticVertexBufferInterface::StaticVertexBufferInterface(BufferFactoryD3D *factory)
269*8975f5c5SAndroid Build Coastguard Worker     : VertexBufferInterface(factory, false)
270*8975f5c5SAndroid Build Coastguard Worker {}
271*8975f5c5SAndroid Build Coastguard Worker 
~StaticVertexBufferInterface()272*8975f5c5SAndroid Build Coastguard Worker StaticVertexBufferInterface::~StaticVertexBufferInterface() {}
273*8975f5c5SAndroid Build Coastguard Worker 
matchesAttribute(const gl::VertexAttribute & attrib,const gl::VertexBinding & binding) const274*8975f5c5SAndroid Build Coastguard Worker bool StaticVertexBufferInterface::matchesAttribute(const gl::VertexAttribute &attrib,
275*8975f5c5SAndroid Build Coastguard Worker                                                    const gl::VertexBinding &binding) const
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker     return mSignature.matchesAttribute(attrib, binding);
278*8975f5c5SAndroid Build Coastguard Worker }
279*8975f5c5SAndroid Build Coastguard Worker 
setAttribute(const gl::VertexAttribute & attrib,const gl::VertexBinding & binding)280*8975f5c5SAndroid Build Coastguard Worker void StaticVertexBufferInterface::setAttribute(const gl::VertexAttribute &attrib,
281*8975f5c5SAndroid Build Coastguard Worker                                                const gl::VertexBinding &binding)
282*8975f5c5SAndroid Build Coastguard Worker {
283*8975f5c5SAndroid Build Coastguard Worker     return mSignature.set(attrib, binding);
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker 
storeStaticAttribute(const gl::Context * context,const gl::VertexAttribute & attrib,const gl::VertexBinding & binding,GLint start,GLsizei count,GLsizei instances,const uint8_t * sourceData)286*8975f5c5SAndroid Build Coastguard Worker angle::Result StaticVertexBufferInterface::storeStaticAttribute(const gl::Context *context,
287*8975f5c5SAndroid Build Coastguard Worker                                                                 const gl::VertexAttribute &attrib,
288*8975f5c5SAndroid Build Coastguard Worker                                                                 const gl::VertexBinding &binding,
289*8975f5c5SAndroid Build Coastguard Worker                                                                 GLint start,
290*8975f5c5SAndroid Build Coastguard Worker                                                                 GLsizei count,
291*8975f5c5SAndroid Build Coastguard Worker                                                                 GLsizei instances,
292*8975f5c5SAndroid Build Coastguard Worker                                                                 const uint8_t *sourceData)
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker     unsigned int spaceRequired = 0;
295*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(getSpaceRequired(context, attrib, binding, count, instances, 0, &spaceRequired));
296*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(setBufferSize(context, spaceRequired));
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     ASSERT(attrib.enabled);
299*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mVertexBuffer->storeVertexAttributes(context, attrib, binding,
300*8975f5c5SAndroid Build Coastguard Worker                                                    gl::VertexAttribType::InvalidEnum, start, count,
301*8975f5c5SAndroid Build Coastguard Worker                                                    instances, 0, sourceData));
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker     mSignature.set(attrib, binding);
304*8975f5c5SAndroid Build Coastguard Worker     mVertexBuffer->hintUnmapResource();
305*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
309