1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 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 // BufferSubDataBenchmark:
7*8975f5c5SAndroid Build Coastguard Worker // Performance test for ANGLE buffer updates.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/draw_call_perf_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker namespace
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 4;
20*8975f5c5SAndroid Build Coastguard Worker
21*8975f5c5SAndroid Build Coastguard Worker struct BufferSubDataParams final : public RenderTestParams
22*8975f5c5SAndroid Build Coastguard Worker {
BufferSubDataParams__anon3ec7aeb30111::BufferSubDataParams23*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams()
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker // Common default values
26*8975f5c5SAndroid Build Coastguard Worker majorVersion = 2;
27*8975f5c5SAndroid Build Coastguard Worker minorVersion = 0;
28*8975f5c5SAndroid Build Coastguard Worker windowWidth = 512;
29*8975f5c5SAndroid Build Coastguard Worker windowHeight = 512;
30*8975f5c5SAndroid Build Coastguard Worker updateSize = 32000;
31*8975f5c5SAndroid Build Coastguard Worker bufferSize = 40000;
32*8975f5c5SAndroid Build Coastguard Worker iterationsPerStep = kIterationsPerStep;
33*8975f5c5SAndroid Build Coastguard Worker updateRate = 1;
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Worker std::string story() const override;
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker GLboolean vertexNormalized;
39*8975f5c5SAndroid Build Coastguard Worker GLenum vertexType;
40*8975f5c5SAndroid Build Coastguard Worker GLint vertexComponentCount;
41*8975f5c5SAndroid Build Coastguard Worker unsigned int updateRate;
42*8975f5c5SAndroid Build Coastguard Worker
43*8975f5c5SAndroid Build Coastguard Worker // static parameters
44*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr updateSize;
45*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr bufferSize;
46*8975f5c5SAndroid Build Coastguard Worker };
47*8975f5c5SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const BufferSubDataParams & params)48*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const BufferSubDataParams ¶ms)
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker os << params.backendAndStory().substr(1);
51*8975f5c5SAndroid Build Coastguard Worker return os;
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker
54*8975f5c5SAndroid Build Coastguard Worker class BufferSubDataBenchmark : public ANGLERenderTest,
55*8975f5c5SAndroid Build Coastguard Worker public ::testing::WithParamInterface<BufferSubDataParams>
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker public:
58*8975f5c5SAndroid Build Coastguard Worker BufferSubDataBenchmark();
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker void initializeBenchmark() override;
61*8975f5c5SAndroid Build Coastguard Worker void destroyBenchmark() override;
62*8975f5c5SAndroid Build Coastguard Worker void drawBenchmark() override;
63*8975f5c5SAndroid Build Coastguard Worker
64*8975f5c5SAndroid Build Coastguard Worker private:
65*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
66*8975f5c5SAndroid Build Coastguard Worker GLuint mBuffer;
67*8975f5c5SAndroid Build Coastguard Worker uint8_t *mUpdateData;
68*8975f5c5SAndroid Build Coastguard Worker int mNumTris;
69*8975f5c5SAndroid Build Coastguard Worker };
70*8975f5c5SAndroid Build Coastguard Worker
GetFloatData(GLint componentCount)71*8975f5c5SAndroid Build Coastguard Worker GLfloat *GetFloatData(GLint componentCount)
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker static GLfloat vertices2[] = {
74*8975f5c5SAndroid Build Coastguard Worker 1, 2, 0, 0, 2, 0,
75*8975f5c5SAndroid Build Coastguard Worker };
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker static GLfloat vertices3[] = {
78*8975f5c5SAndroid Build Coastguard Worker 1, 2, 1, 0, 0, 1, 2, 0, 1,
79*8975f5c5SAndroid Build Coastguard Worker };
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker static GLfloat vertices4[] = {
82*8975f5c5SAndroid Build Coastguard Worker 1, 2, 1, 3, 0, 0, 1, 3, 2, 0, 1, 3,
83*8975f5c5SAndroid Build Coastguard Worker };
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard Worker switch (componentCount)
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker case 2:
88*8975f5c5SAndroid Build Coastguard Worker return vertices2;
89*8975f5c5SAndroid Build Coastguard Worker case 3:
90*8975f5c5SAndroid Build Coastguard Worker return vertices3;
91*8975f5c5SAndroid Build Coastguard Worker case 4:
92*8975f5c5SAndroid Build Coastguard Worker return vertices4;
93*8975f5c5SAndroid Build Coastguard Worker default:
94*8975f5c5SAndroid Build Coastguard Worker return nullptr;
95*8975f5c5SAndroid Build Coastguard Worker }
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker
98*8975f5c5SAndroid Build Coastguard Worker template <class T>
GetNormalizedData(GLsizeiptr numElements,GLfloat * floatData,std::vector<uint8_t> * data)99*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr GetNormalizedData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data)
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr triDataSize = sizeof(T) * numElements;
102*8975f5c5SAndroid Build Coastguard Worker data->resize(triDataSize);
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker T *destPtr = reinterpret_cast<T *>(data->data());
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++)
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker GLfloat scaled = floatData[dataIndex] * 0.25f;
109*8975f5c5SAndroid Build Coastguard Worker destPtr[dataIndex] =
110*8975f5c5SAndroid Build Coastguard Worker static_cast<T>(scaled * static_cast<GLfloat>(std::numeric_limits<T>::max()));
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker
113*8975f5c5SAndroid Build Coastguard Worker return triDataSize;
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker
116*8975f5c5SAndroid Build Coastguard Worker template <class T>
GetIntData(GLsizeiptr numElements,GLfloat * floatData,std::vector<uint8_t> * data)117*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr GetIntData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data)
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr triDataSize = sizeof(T) * numElements;
120*8975f5c5SAndroid Build Coastguard Worker data->resize(triDataSize);
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker T *destPtr = reinterpret_cast<T *>(data->data());
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++)
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker destPtr[dataIndex] = static_cast<T>(floatData[dataIndex]);
127*8975f5c5SAndroid Build Coastguard Worker }
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Worker return triDataSize;
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker
GetVertexData(GLenum type,GLint componentCount,GLboolean normalized,std::vector<uint8_t> * data)132*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr GetVertexData(GLenum type,
133*8975f5c5SAndroid Build Coastguard Worker GLint componentCount,
134*8975f5c5SAndroid Build Coastguard Worker GLboolean normalized,
135*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> *data)
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr triDataSize = 0;
138*8975f5c5SAndroid Build Coastguard Worker GLfloat *floatData = GetFloatData(componentCount);
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker if (type == GL_FLOAT)
141*8975f5c5SAndroid Build Coastguard Worker {
142*8975f5c5SAndroid Build Coastguard Worker triDataSize = sizeof(GLfloat) * componentCount * 3;
143*8975f5c5SAndroid Build Coastguard Worker data->resize(triDataSize);
144*8975f5c5SAndroid Build Coastguard Worker memcpy(data->data(), floatData, triDataSize);
145*8975f5c5SAndroid Build Coastguard Worker }
146*8975f5c5SAndroid Build Coastguard Worker else if (normalized == GL_TRUE)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr numElements = componentCount * 3;
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker switch (type)
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker case GL_BYTE:
153*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetNormalizedData<GLbyte>(numElements, floatData, data);
154*8975f5c5SAndroid Build Coastguard Worker break;
155*8975f5c5SAndroid Build Coastguard Worker case GL_SHORT:
156*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetNormalizedData<GLshort>(numElements, floatData, data);
157*8975f5c5SAndroid Build Coastguard Worker break;
158*8975f5c5SAndroid Build Coastguard Worker case GL_INT:
159*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetNormalizedData<GLint>(numElements, floatData, data);
160*8975f5c5SAndroid Build Coastguard Worker break;
161*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE:
162*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetNormalizedData<GLubyte>(numElements, floatData, data);
163*8975f5c5SAndroid Build Coastguard Worker break;
164*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT:
165*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetNormalizedData<GLushort>(numElements, floatData, data);
166*8975f5c5SAndroid Build Coastguard Worker break;
167*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_INT:
168*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetNormalizedData<GLuint>(numElements, floatData, data);
169*8975f5c5SAndroid Build Coastguard Worker break;
170*8975f5c5SAndroid Build Coastguard Worker default:
171*8975f5c5SAndroid Build Coastguard Worker assert(0);
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker }
174*8975f5c5SAndroid Build Coastguard Worker else
175*8975f5c5SAndroid Build Coastguard Worker {
176*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr numElements = componentCount * 3;
177*8975f5c5SAndroid Build Coastguard Worker
178*8975f5c5SAndroid Build Coastguard Worker switch (type)
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker case GL_BYTE:
181*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetIntData<GLbyte>(numElements, floatData, data);
182*8975f5c5SAndroid Build Coastguard Worker break;
183*8975f5c5SAndroid Build Coastguard Worker case GL_SHORT:
184*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetIntData<GLshort>(numElements, floatData, data);
185*8975f5c5SAndroid Build Coastguard Worker break;
186*8975f5c5SAndroid Build Coastguard Worker case GL_INT:
187*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetIntData<GLint>(numElements, floatData, data);
188*8975f5c5SAndroid Build Coastguard Worker break;
189*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE:
190*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetIntData<GLubyte>(numElements, floatData, data);
191*8975f5c5SAndroid Build Coastguard Worker break;
192*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT:
193*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetIntData<GLushort>(numElements, floatData, data);
194*8975f5c5SAndroid Build Coastguard Worker break;
195*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_INT:
196*8975f5c5SAndroid Build Coastguard Worker triDataSize = GetIntData<GLuint>(numElements, floatData, data);
197*8975f5c5SAndroid Build Coastguard Worker break;
198*8975f5c5SAndroid Build Coastguard Worker default:
199*8975f5c5SAndroid Build Coastguard Worker assert(0);
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker }
202*8975f5c5SAndroid Build Coastguard Worker
203*8975f5c5SAndroid Build Coastguard Worker return triDataSize;
204*8975f5c5SAndroid Build Coastguard Worker }
205*8975f5c5SAndroid Build Coastguard Worker
story() const206*8975f5c5SAndroid Build Coastguard Worker std::string BufferSubDataParams::story() const
207*8975f5c5SAndroid Build Coastguard Worker {
208*8975f5c5SAndroid Build Coastguard Worker std::stringstream strstr;
209*8975f5c5SAndroid Build Coastguard Worker
210*8975f5c5SAndroid Build Coastguard Worker strstr << RenderTestParams::story();
211*8975f5c5SAndroid Build Coastguard Worker
212*8975f5c5SAndroid Build Coastguard Worker if (vertexNormalized)
213*8975f5c5SAndroid Build Coastguard Worker {
214*8975f5c5SAndroid Build Coastguard Worker strstr << "_norm";
215*8975f5c5SAndroid Build Coastguard Worker }
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker switch (vertexType)
218*8975f5c5SAndroid Build Coastguard Worker {
219*8975f5c5SAndroid Build Coastguard Worker case GL_FLOAT:
220*8975f5c5SAndroid Build Coastguard Worker strstr << "_float";
221*8975f5c5SAndroid Build Coastguard Worker break;
222*8975f5c5SAndroid Build Coastguard Worker case GL_INT:
223*8975f5c5SAndroid Build Coastguard Worker strstr << "_int";
224*8975f5c5SAndroid Build Coastguard Worker break;
225*8975f5c5SAndroid Build Coastguard Worker case GL_BYTE:
226*8975f5c5SAndroid Build Coastguard Worker strstr << "_byte";
227*8975f5c5SAndroid Build Coastguard Worker break;
228*8975f5c5SAndroid Build Coastguard Worker case GL_SHORT:
229*8975f5c5SAndroid Build Coastguard Worker strstr << "_short";
230*8975f5c5SAndroid Build Coastguard Worker break;
231*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_INT:
232*8975f5c5SAndroid Build Coastguard Worker strstr << "_uint";
233*8975f5c5SAndroid Build Coastguard Worker break;
234*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE:
235*8975f5c5SAndroid Build Coastguard Worker strstr << "_ubyte";
236*8975f5c5SAndroid Build Coastguard Worker break;
237*8975f5c5SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT:
238*8975f5c5SAndroid Build Coastguard Worker strstr << "_ushort";
239*8975f5c5SAndroid Build Coastguard Worker break;
240*8975f5c5SAndroid Build Coastguard Worker default:
241*8975f5c5SAndroid Build Coastguard Worker strstr << "_vunk_" << vertexType << "_";
242*8975f5c5SAndroid Build Coastguard Worker break;
243*8975f5c5SAndroid Build Coastguard Worker }
244*8975f5c5SAndroid Build Coastguard Worker
245*8975f5c5SAndroid Build Coastguard Worker strstr << vertexComponentCount;
246*8975f5c5SAndroid Build Coastguard Worker strstr << "_every" << updateRate;
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker return strstr.str();
249*8975f5c5SAndroid Build Coastguard Worker }
250*8975f5c5SAndroid Build Coastguard Worker
BufferSubDataBenchmark()251*8975f5c5SAndroid Build Coastguard Worker BufferSubDataBenchmark::BufferSubDataBenchmark()
252*8975f5c5SAndroid Build Coastguard Worker : ANGLERenderTest("BufferSubData", GetParam()),
253*8975f5c5SAndroid Build Coastguard Worker mProgram(0),
254*8975f5c5SAndroid Build Coastguard Worker mBuffer(0),
255*8975f5c5SAndroid Build Coastguard Worker mUpdateData(nullptr),
256*8975f5c5SAndroid Build Coastguard Worker mNumTris(0)
257*8975f5c5SAndroid Build Coastguard Worker {}
258*8975f5c5SAndroid Build Coastguard Worker
initializeBenchmark()259*8975f5c5SAndroid Build Coastguard Worker void BufferSubDataBenchmark::initializeBenchmark()
260*8975f5c5SAndroid Build Coastguard Worker {
261*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker ASSERT_LT(1, params.vertexComponentCount);
264*8975f5c5SAndroid Build Coastguard Worker
265*8975f5c5SAndroid Build Coastguard Worker mProgram = SetupSimpleScaleAndOffsetProgram();
266*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Worker if (params.vertexNormalized == GL_TRUE)
269*8975f5c5SAndroid Build Coastguard Worker {
270*8975f5c5SAndroid Build Coastguard Worker GLfloat scale = 2.0f;
271*8975f5c5SAndroid Build Coastguard Worker GLfloat offset = -0.5f;
272*8975f5c5SAndroid Build Coastguard Worker glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale);
273*8975f5c5SAndroid Build Coastguard Worker glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset);
274*8975f5c5SAndroid Build Coastguard Worker }
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
277*8975f5c5SAndroid Build Coastguard Worker
278*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> zeroData(params.bufferSize);
279*8975f5c5SAndroid Build Coastguard Worker memset(&zeroData[0], 0, zeroData.size());
280*8975f5c5SAndroid Build Coastguard Worker
281*8975f5c5SAndroid Build Coastguard Worker glGenBuffers(1, &mBuffer);
282*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
283*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, params.bufferSize, &zeroData[0], GL_DYNAMIC_DRAW);
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(0, params.vertexComponentCount, params.vertexType,
286*8975f5c5SAndroid Build Coastguard Worker params.vertexNormalized, 0, 0);
287*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker if (params.updateSize > 0)
290*8975f5c5SAndroid Build Coastguard Worker {
291*8975f5c5SAndroid Build Coastguard Worker mUpdateData = new uint8_t[params.updateSize];
292*8975f5c5SAndroid Build Coastguard Worker }
293*8975f5c5SAndroid Build Coastguard Worker
294*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> data;
295*8975f5c5SAndroid Build Coastguard Worker GLsizei triDataSize = static_cast<GLsizei>(GetVertexData(
296*8975f5c5SAndroid Build Coastguard Worker params.vertexType, params.vertexComponentCount, params.vertexNormalized, &data));
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker mNumTris = static_cast<int>(params.updateSize / triDataSize);
299*8975f5c5SAndroid Build Coastguard Worker for (int i = 0, offset = 0; i < mNumTris; ++i)
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker memcpy(mUpdateData + offset, &data[0], triDataSize);
302*8975f5c5SAndroid Build Coastguard Worker offset += triDataSize;
303*8975f5c5SAndroid Build Coastguard Worker }
304*8975f5c5SAndroid Build Coastguard Worker
305*8975f5c5SAndroid Build Coastguard Worker if (params.updateSize == 0)
306*8975f5c5SAndroid Build Coastguard Worker {
307*8975f5c5SAndroid Build Coastguard Worker mNumTris = 1;
308*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ARRAY_BUFFER, 0, data.size(), &data[0]);
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker
311*8975f5c5SAndroid Build Coastguard Worker // Set the viewport
312*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
313*8975f5c5SAndroid Build Coastguard Worker
314*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker
destroyBenchmark()317*8975f5c5SAndroid Build Coastguard Worker void BufferSubDataBenchmark::destroyBenchmark()
318*8975f5c5SAndroid Build Coastguard Worker {
319*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
320*8975f5c5SAndroid Build Coastguard Worker glDeleteBuffers(1, &mBuffer);
321*8975f5c5SAndroid Build Coastguard Worker SafeDeleteArray(mUpdateData);
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker
drawBenchmark()324*8975f5c5SAndroid Build Coastguard Worker void BufferSubDataBenchmark::drawBenchmark()
325*8975f5c5SAndroid Build Coastguard Worker {
326*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
327*8975f5c5SAndroid Build Coastguard Worker
328*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
329*8975f5c5SAndroid Build Coastguard Worker
330*8975f5c5SAndroid Build Coastguard Worker for (unsigned int it = 0; it < params.iterationsPerStep; it++)
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker if (params.updateSize > 0 && ((getNumStepsPerformed() % params.updateRate) == 0))
333*8975f5c5SAndroid Build Coastguard Worker {
334*8975f5c5SAndroid Build Coastguard Worker glBufferSubData(GL_ARRAY_BUFFER, 0, params.updateSize, mUpdateData);
335*8975f5c5SAndroid Build Coastguard Worker }
336*8975f5c5SAndroid Build Coastguard Worker
337*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 3 * mNumTris);
338*8975f5c5SAndroid Build Coastguard Worker }
339*8975f5c5SAndroid Build Coastguard Worker
340*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
341*8975f5c5SAndroid Build Coastguard Worker }
342*8975f5c5SAndroid Build Coastguard Worker
BufferUpdateD3D11Params()343*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams BufferUpdateD3D11Params()
344*8975f5c5SAndroid Build Coastguard Worker {
345*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams params;
346*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::D3D11();
347*8975f5c5SAndroid Build Coastguard Worker params.vertexType = GL_FLOAT;
348*8975f5c5SAndroid Build Coastguard Worker params.vertexComponentCount = 4;
349*8975f5c5SAndroid Build Coastguard Worker params.vertexNormalized = GL_FALSE;
350*8975f5c5SAndroid Build Coastguard Worker return params;
351*8975f5c5SAndroid Build Coastguard Worker }
352*8975f5c5SAndroid Build Coastguard Worker
BufferUpdateMetalParams()353*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams BufferUpdateMetalParams()
354*8975f5c5SAndroid Build Coastguard Worker {
355*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams params;
356*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::METAL();
357*8975f5c5SAndroid Build Coastguard Worker params.vertexType = GL_FLOAT;
358*8975f5c5SAndroid Build Coastguard Worker params.vertexComponentCount = 4;
359*8975f5c5SAndroid Build Coastguard Worker params.vertexNormalized = GL_FALSE;
360*8975f5c5SAndroid Build Coastguard Worker return params;
361*8975f5c5SAndroid Build Coastguard Worker }
362*8975f5c5SAndroid Build Coastguard Worker
BufferUpdateOpenGLOrGLESParams()363*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams BufferUpdateOpenGLOrGLESParams()
364*8975f5c5SAndroid Build Coastguard Worker {
365*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams params;
366*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::OPENGL_OR_GLES();
367*8975f5c5SAndroid Build Coastguard Worker params.vertexType = GL_FLOAT;
368*8975f5c5SAndroid Build Coastguard Worker params.vertexComponentCount = 4;
369*8975f5c5SAndroid Build Coastguard Worker params.vertexNormalized = GL_FALSE;
370*8975f5c5SAndroid Build Coastguard Worker return params;
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker
BufferUpdateVulkanParams()373*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams BufferUpdateVulkanParams()
374*8975f5c5SAndroid Build Coastguard Worker {
375*8975f5c5SAndroid Build Coastguard Worker BufferSubDataParams params;
376*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::VULKAN();
377*8975f5c5SAndroid Build Coastguard Worker params.vertexType = GL_FLOAT;
378*8975f5c5SAndroid Build Coastguard Worker params.vertexComponentCount = 4;
379*8975f5c5SAndroid Build Coastguard Worker params.vertexNormalized = GL_FALSE;
380*8975f5c5SAndroid Build Coastguard Worker return params;
381*8975f5c5SAndroid Build Coastguard Worker }
382*8975f5c5SAndroid Build Coastguard Worker
TEST_P(BufferSubDataBenchmark,Run)383*8975f5c5SAndroid Build Coastguard Worker TEST_P(BufferSubDataBenchmark, Run)
384*8975f5c5SAndroid Build Coastguard Worker {
385*8975f5c5SAndroid Build Coastguard Worker run();
386*8975f5c5SAndroid Build Coastguard Worker }
387*8975f5c5SAndroid Build Coastguard Worker
388*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(BufferSubDataBenchmark,
389*8975f5c5SAndroid Build Coastguard Worker BufferUpdateD3D11Params(),
390*8975f5c5SAndroid Build Coastguard Worker BufferUpdateMetalParams(),
391*8975f5c5SAndroid Build Coastguard Worker BufferUpdateOpenGLOrGLESParams(),
392*8975f5c5SAndroid Build Coastguard Worker BufferUpdateVulkanParams());
393*8975f5c5SAndroid Build Coastguard Worker
394*8975f5c5SAndroid Build Coastguard Worker } // namespace
395