xref: /aosp_15_r20/external/angle/src/tests/perf_tests/BufferSubData.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 &params)
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 &params = 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 &params = 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