xref: /aosp_15_r20/external/angle/src/tests/perf_tests/MapBufferRange.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 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 // MapBufferRangeBenchmark::
7*8975f5c5SAndroid Build Coastguard Worker //   Performance test for ANGLE GLES mapped buffers.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
13*8975f5c5SAndroid Build Coastguard Worker #include <vector>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/draw_call_perf_utils.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker namespace
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 10;
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker struct MapBufferRangeParams final : public RenderTestParams
25*8975f5c5SAndroid Build Coastguard Worker {
MapBufferRangeParams__anon88e5e65a0111::MapBufferRangeParams26*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams()
27*8975f5c5SAndroid Build Coastguard Worker     {
28*8975f5c5SAndroid Build Coastguard Worker         // Common default values
29*8975f5c5SAndroid Build Coastguard Worker         majorVersion = 3;
30*8975f5c5SAndroid Build Coastguard Worker         minorVersion = 0;
31*8975f5c5SAndroid Build Coastguard Worker         windowWidth  = 512;
32*8975f5c5SAndroid Build Coastguard Worker         windowHeight = 512;
33*8975f5c5SAndroid Build Coastguard Worker         // Test intentionally small update versus buffer size to begin with.
34*8975f5c5SAndroid Build Coastguard Worker         updateSize        = 32768;
35*8975f5c5SAndroid Build Coastguard Worker         updateOffset      = 0;
36*8975f5c5SAndroid Build Coastguard Worker         bufferSize        = 1048576;
37*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep = kIterationsPerStep;
38*8975f5c5SAndroid Build Coastguard Worker         access            = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT;
39*8975f5c5SAndroid Build Coastguard Worker     }
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker     std::string story() const override;
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     GLboolean vertexNormalized;
44*8975f5c5SAndroid Build Coastguard Worker     GLenum vertexType;
45*8975f5c5SAndroid Build Coastguard Worker     GLint vertexComponentCount;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     // static parameters
48*8975f5c5SAndroid Build Coastguard Worker     GLsizeiptr updateSize;
49*8975f5c5SAndroid Build Coastguard Worker     GLsizeiptr updateOffset;
50*8975f5c5SAndroid Build Coastguard Worker     GLsizeiptr bufferSize;
51*8975f5c5SAndroid Build Coastguard Worker     GLbitfield access;
52*8975f5c5SAndroid Build Coastguard Worker };
53*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const MapBufferRangeParams & params)54*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const MapBufferRangeParams &params)
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker     os << params.backendAndStory().substr(1);
57*8975f5c5SAndroid Build Coastguard Worker     return os;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker class MapBufferRangeBenchmark : public ANGLERenderTest,
61*8975f5c5SAndroid Build Coastguard Worker                                 public ::testing::WithParamInterface<MapBufferRangeParams>
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker   public:
64*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeBenchmark();
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
67*8975f5c5SAndroid Build Coastguard Worker     void destroyBenchmark() override;
68*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker   private:
71*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
72*8975f5c5SAndroid Build Coastguard Worker     GLuint mBuffer;
73*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> mVertexData;
74*8975f5c5SAndroid Build Coastguard Worker     int mTriSize;
75*8975f5c5SAndroid Build Coastguard Worker     int mNumUpdateTris;
76*8975f5c5SAndroid Build Coastguard Worker };
77*8975f5c5SAndroid Build Coastguard Worker 
GetFloatData(GLint componentCount)78*8975f5c5SAndroid Build Coastguard Worker const GLfloat *GetFloatData(GLint componentCount)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     static GLfloat vertices2[] = {
81*8975f5c5SAndroid Build Coastguard Worker         1, 2, 0, 0, 2, 0,
82*8975f5c5SAndroid Build Coastguard Worker     };
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     static GLfloat vertices3[] = {
85*8975f5c5SAndroid Build Coastguard Worker         1, 2, 1, 0, 0, 1, 2, 0, 1,
86*8975f5c5SAndroid Build Coastguard Worker     };
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     static GLfloat vertices4[] = {
89*8975f5c5SAndroid Build Coastguard Worker         1, 2, 1, 3, 0, 0, 1, 3, 2, 0, 1, 3,
90*8975f5c5SAndroid Build Coastguard Worker     };
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker     switch (componentCount)
93*8975f5c5SAndroid Build Coastguard Worker     {
94*8975f5c5SAndroid Build Coastguard Worker         case 2:
95*8975f5c5SAndroid Build Coastguard Worker             return vertices2;
96*8975f5c5SAndroid Build Coastguard Worker         case 3:
97*8975f5c5SAndroid Build Coastguard Worker             return vertices3;
98*8975f5c5SAndroid Build Coastguard Worker         case 4:
99*8975f5c5SAndroid Build Coastguard Worker             return vertices4;
100*8975f5c5SAndroid Build Coastguard Worker         default:
101*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
102*8975f5c5SAndroid Build Coastguard Worker     }
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     return 0;
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker template <class T>
GetNormalizedData(GLsizeiptr numElements,const GLfloat * floatData,std::vector<uint8_t> * data)108*8975f5c5SAndroid Build Coastguard Worker GLsizei GetNormalizedData(GLsizeiptr numElements,
109*8975f5c5SAndroid Build Coastguard Worker                           const GLfloat *floatData,
110*8975f5c5SAndroid Build Coastguard Worker                           std::vector<uint8_t> *data)
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker     GLsizei triDataSize = sizeof(T) * numElements;
113*8975f5c5SAndroid Build Coastguard Worker     data->resize(triDataSize);
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     T *destPtr = reinterpret_cast<T *>(data->data());
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++)
118*8975f5c5SAndroid Build Coastguard Worker     {
119*8975f5c5SAndroid Build Coastguard Worker         GLfloat scaled = floatData[dataIndex] * 0.25f;
120*8975f5c5SAndroid Build Coastguard Worker         destPtr[dataIndex] =
121*8975f5c5SAndroid Build Coastguard Worker             static_cast<T>(scaled * static_cast<GLfloat>(std::numeric_limits<T>::max()));
122*8975f5c5SAndroid Build Coastguard Worker     }
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker     return triDataSize;
125*8975f5c5SAndroid Build Coastguard Worker }
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker template <class T>
GetIntData(GLsizeiptr numElements,const GLfloat * floatData,std::vector<uint8_t> * data)128*8975f5c5SAndroid Build Coastguard Worker GLsizei GetIntData(GLsizeiptr numElements, const GLfloat *floatData, std::vector<uint8_t> *data)
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker     GLsizei triDataSize = sizeof(T) * numElements;
131*8975f5c5SAndroid Build Coastguard Worker     data->resize(triDataSize);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     T *destPtr = reinterpret_cast<T *>(data->data());
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker     for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++)
136*8975f5c5SAndroid Build Coastguard Worker     {
137*8975f5c5SAndroid Build Coastguard Worker         destPtr[dataIndex] = static_cast<T>(floatData[dataIndex]);
138*8975f5c5SAndroid Build Coastguard Worker     }
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     return triDataSize;
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker 
GetVertexData(GLenum type,GLint componentCount,GLboolean normalized,std::vector<uint8_t> * data)143*8975f5c5SAndroid Build Coastguard Worker GLsizei GetVertexData(GLenum type,
144*8975f5c5SAndroid Build Coastguard Worker                       GLint componentCount,
145*8975f5c5SAndroid Build Coastguard Worker                       GLboolean normalized,
146*8975f5c5SAndroid Build Coastguard Worker                       std::vector<uint8_t> *data)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker     GLsizei triDataSize      = 0;
149*8975f5c5SAndroid Build Coastguard Worker     const GLfloat *floatData = GetFloatData(componentCount);
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker     if (type == GL_FLOAT)
152*8975f5c5SAndroid Build Coastguard Worker     {
153*8975f5c5SAndroid Build Coastguard Worker         triDataSize = sizeof(GLfloat) * componentCount * 3;
154*8975f5c5SAndroid Build Coastguard Worker         data->resize(triDataSize);
155*8975f5c5SAndroid Build Coastguard Worker         memcpy(data->data(), floatData, triDataSize);
156*8975f5c5SAndroid Build Coastguard Worker     }
157*8975f5c5SAndroid Build Coastguard Worker     else if (normalized == GL_TRUE)
158*8975f5c5SAndroid Build Coastguard Worker     {
159*8975f5c5SAndroid Build Coastguard Worker         GLsizeiptr numElements = componentCount * 3;
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker         switch (type)
162*8975f5c5SAndroid Build Coastguard Worker         {
163*8975f5c5SAndroid Build Coastguard Worker             case GL_BYTE:
164*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetNormalizedData<GLbyte>(numElements, floatData, data);
165*8975f5c5SAndroid Build Coastguard Worker                 break;
166*8975f5c5SAndroid Build Coastguard Worker             case GL_SHORT:
167*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetNormalizedData<GLshort>(numElements, floatData, data);
168*8975f5c5SAndroid Build Coastguard Worker                 break;
169*8975f5c5SAndroid Build Coastguard Worker             case GL_INT:
170*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetNormalizedData<GLint>(numElements, floatData, data);
171*8975f5c5SAndroid Build Coastguard Worker                 break;
172*8975f5c5SAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
173*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetNormalizedData<GLubyte>(numElements, floatData, data);
174*8975f5c5SAndroid Build Coastguard Worker                 break;
175*8975f5c5SAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
176*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetNormalizedData<GLushort>(numElements, floatData, data);
177*8975f5c5SAndroid Build Coastguard Worker                 break;
178*8975f5c5SAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
179*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetNormalizedData<GLuint>(numElements, floatData, data);
180*8975f5c5SAndroid Build Coastguard Worker                 break;
181*8975f5c5SAndroid Build Coastguard Worker             default:
182*8975f5c5SAndroid Build Coastguard Worker                 UNREACHABLE();
183*8975f5c5SAndroid Build Coastguard Worker         }
184*8975f5c5SAndroid Build Coastguard Worker     }
185*8975f5c5SAndroid Build Coastguard Worker     else
186*8975f5c5SAndroid Build Coastguard Worker     {
187*8975f5c5SAndroid Build Coastguard Worker         GLsizeiptr numElements = componentCount * 3;
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker         switch (type)
190*8975f5c5SAndroid Build Coastguard Worker         {
191*8975f5c5SAndroid Build Coastguard Worker             case GL_BYTE:
192*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetIntData<GLbyte>(numElements, floatData, data);
193*8975f5c5SAndroid Build Coastguard Worker                 break;
194*8975f5c5SAndroid Build Coastguard Worker             case GL_SHORT:
195*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetIntData<GLshort>(numElements, floatData, data);
196*8975f5c5SAndroid Build Coastguard Worker                 break;
197*8975f5c5SAndroid Build Coastguard Worker             case GL_INT:
198*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetIntData<GLint>(numElements, floatData, data);
199*8975f5c5SAndroid Build Coastguard Worker                 break;
200*8975f5c5SAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
201*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetIntData<GLubyte>(numElements, floatData, data);
202*8975f5c5SAndroid Build Coastguard Worker                 break;
203*8975f5c5SAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
204*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetIntData<GLushort>(numElements, floatData, data);
205*8975f5c5SAndroid Build Coastguard Worker                 break;
206*8975f5c5SAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
207*8975f5c5SAndroid Build Coastguard Worker                 triDataSize = GetIntData<GLuint>(numElements, floatData, data);
208*8975f5c5SAndroid Build Coastguard Worker                 break;
209*8975f5c5SAndroid Build Coastguard Worker             default:
210*8975f5c5SAndroid Build Coastguard Worker                 assert(0);
211*8975f5c5SAndroid Build Coastguard Worker         }
212*8975f5c5SAndroid Build Coastguard Worker     }
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     return triDataSize;
215*8975f5c5SAndroid Build Coastguard Worker }
216*8975f5c5SAndroid Build Coastguard Worker 
story() const217*8975f5c5SAndroid Build Coastguard Worker std::string MapBufferRangeParams::story() const
218*8975f5c5SAndroid Build Coastguard Worker {
219*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     strstr << RenderTestParams::story();
222*8975f5c5SAndroid Build Coastguard Worker 
223*8975f5c5SAndroid Build Coastguard Worker     if (vertexNormalized)
224*8975f5c5SAndroid Build Coastguard Worker     {
225*8975f5c5SAndroid Build Coastguard Worker         strstr << "_norm";
226*8975f5c5SAndroid Build Coastguard Worker     }
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker     switch (vertexType)
229*8975f5c5SAndroid Build Coastguard Worker     {
230*8975f5c5SAndroid Build Coastguard Worker         case GL_FLOAT:
231*8975f5c5SAndroid Build Coastguard Worker             strstr << "_float";
232*8975f5c5SAndroid Build Coastguard Worker             break;
233*8975f5c5SAndroid Build Coastguard Worker         case GL_INT:
234*8975f5c5SAndroid Build Coastguard Worker             strstr << "_int";
235*8975f5c5SAndroid Build Coastguard Worker             break;
236*8975f5c5SAndroid Build Coastguard Worker         case GL_BYTE:
237*8975f5c5SAndroid Build Coastguard Worker             strstr << "_byte";
238*8975f5c5SAndroid Build Coastguard Worker             break;
239*8975f5c5SAndroid Build Coastguard Worker         case GL_SHORT:
240*8975f5c5SAndroid Build Coastguard Worker             strstr << "_short";
241*8975f5c5SAndroid Build Coastguard Worker             break;
242*8975f5c5SAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
243*8975f5c5SAndroid Build Coastguard Worker             strstr << "_uint";
244*8975f5c5SAndroid Build Coastguard Worker             break;
245*8975f5c5SAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
246*8975f5c5SAndroid Build Coastguard Worker             strstr << "_ubyte";
247*8975f5c5SAndroid Build Coastguard Worker             break;
248*8975f5c5SAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
249*8975f5c5SAndroid Build Coastguard Worker             strstr << "_ushort";
250*8975f5c5SAndroid Build Coastguard Worker             break;
251*8975f5c5SAndroid Build Coastguard Worker         default:
252*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
253*8975f5c5SAndroid Build Coastguard Worker     }
254*8975f5c5SAndroid Build Coastguard Worker 
255*8975f5c5SAndroid Build Coastguard Worker     strstr << vertexComponentCount;
256*8975f5c5SAndroid Build Coastguard Worker     strstr << "_updateOffset" << updateOffset;
257*8975f5c5SAndroid Build Coastguard Worker     strstr << "_updateSize" << updateSize;
258*8975f5c5SAndroid Build Coastguard Worker     strstr << "_bufferSize" << bufferSize;
259*8975f5c5SAndroid Build Coastguard Worker     strstr << "_access0x" << std::hex << access;
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
262*8975f5c5SAndroid Build Coastguard Worker }
263*8975f5c5SAndroid Build Coastguard Worker 
MapBufferRangeBenchmark()264*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeBenchmark::MapBufferRangeBenchmark()
265*8975f5c5SAndroid Build Coastguard Worker     : ANGLERenderTest("MapBufferRange", GetParam()),
266*8975f5c5SAndroid Build Coastguard Worker       mProgram(0),
267*8975f5c5SAndroid Build Coastguard Worker       mBuffer(0),
268*8975f5c5SAndroid Build Coastguard Worker       mTriSize(0),
269*8975f5c5SAndroid Build Coastguard Worker       mNumUpdateTris(0)
270*8975f5c5SAndroid Build Coastguard Worker {}
271*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()272*8975f5c5SAndroid Build Coastguard Worker void MapBufferRangeBenchmark::initializeBenchmark()
273*8975f5c5SAndroid Build Coastguard Worker {
274*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
275*8975f5c5SAndroid Build Coastguard Worker 
276*8975f5c5SAndroid Build Coastguard Worker     ASSERT_LT(1, params.vertexComponentCount);
277*8975f5c5SAndroid Build Coastguard Worker     ASSERT_LE(params.updateSize, params.bufferSize);
278*8975f5c5SAndroid Build Coastguard Worker     ASSERT_LT(params.updateOffset, params.bufferSize);
279*8975f5c5SAndroid Build Coastguard Worker     ASSERT_LE(params.updateOffset + params.updateSize, params.bufferSize);
280*8975f5c5SAndroid Build Coastguard Worker 
281*8975f5c5SAndroid Build Coastguard Worker     mProgram = SetupSimpleScaleAndOffsetProgram();
282*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     if (params.vertexNormalized == GL_TRUE)
285*8975f5c5SAndroid Build Coastguard Worker     {
286*8975f5c5SAndroid Build Coastguard Worker         GLfloat scale  = 2.0f;
287*8975f5c5SAndroid Build Coastguard Worker         GLfloat offset = -0.5f;
288*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale);
289*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset);
290*8975f5c5SAndroid Build Coastguard Worker     }
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &mBuffer);
295*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
296*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, params.bufferSize, nullptr, GL_DYNAMIC_DRAW);
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(0, params.vertexComponentCount, params.vertexType,
299*8975f5c5SAndroid Build Coastguard Worker                           params.vertexNormalized, 0, 0);
300*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
301*8975f5c5SAndroid Build Coastguard Worker 
302*8975f5c5SAndroid Build Coastguard Worker     mTriSize = GetVertexData(params.vertexType, params.vertexComponentCount,
303*8975f5c5SAndroid Build Coastguard Worker                              params.vertexNormalized, &mVertexData);
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     mNumUpdateTris = static_cast<int>(params.updateSize / mTriSize);
306*8975f5c5SAndroid Build Coastguard Worker     int totalTris  = static_cast<int>(params.updateSize / mTriSize);
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker     mVertexData.resize(params.bufferSize);
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     for (int i = 1; i < totalTris; ++i)
311*8975f5c5SAndroid Build Coastguard Worker     {
312*8975f5c5SAndroid Build Coastguard Worker         memcpy(mVertexData.data() + i * mTriSize, mVertexData.data(), mTriSize);
313*8975f5c5SAndroid Build Coastguard Worker     }
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     if (params.updateSize == 0)
316*8975f5c5SAndroid Build Coastguard Worker     {
317*8975f5c5SAndroid Build Coastguard Worker         mNumUpdateTris = 1;
318*8975f5c5SAndroid Build Coastguard Worker         glBufferSubData(GL_ARRAY_BUFFER, 0, mVertexData.size(), mVertexData.data());
319*8975f5c5SAndroid Build Coastguard Worker     }
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker     // Set the viewport
322*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker 
destroyBenchmark()327*8975f5c5SAndroid Build Coastguard Worker void MapBufferRangeBenchmark::destroyBenchmark()
328*8975f5c5SAndroid Build Coastguard Worker {
329*8975f5c5SAndroid Build Coastguard Worker     glDeleteProgram(mProgram);
330*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &mBuffer);
331*8975f5c5SAndroid Build Coastguard Worker }
332*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()333*8975f5c5SAndroid Build Coastguard Worker void MapBufferRangeBenchmark::drawBenchmark()
334*8975f5c5SAndroid Build Coastguard Worker {
335*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
338*8975f5c5SAndroid Build Coastguard Worker 
339*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int it = 0; it < params.iterationsPerStep; it++)
340*8975f5c5SAndroid Build Coastguard Worker     {
341*8975f5c5SAndroid Build Coastguard Worker         if (params.updateSize > 0)
342*8975f5c5SAndroid Build Coastguard Worker         {
343*8975f5c5SAndroid Build Coastguard Worker             void *mapPtr = glMapBufferRange(GL_ARRAY_BUFFER, params.updateOffset, params.updateSize,
344*8975f5c5SAndroid Build Coastguard Worker                                             params.access);
345*8975f5c5SAndroid Build Coastguard Worker             memcpy(mapPtr, mVertexData.data() + params.updateOffset, params.updateSize);
346*8975f5c5SAndroid Build Coastguard Worker             glUnmapBuffer(GL_ARRAY_BUFFER);
347*8975f5c5SAndroid Build Coastguard Worker         }
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, params.updateOffset / mTriSize, 3 * mNumUpdateTris);
350*8975f5c5SAndroid Build Coastguard Worker     }
351*8975f5c5SAndroid Build Coastguard Worker 
352*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
353*8975f5c5SAndroid Build Coastguard Worker }
354*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateD3D11Params()355*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateD3D11Params()
356*8975f5c5SAndroid Build Coastguard Worker {
357*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
358*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::D3D11();
359*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
360*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
361*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
362*8975f5c5SAndroid Build Coastguard Worker     return params;
363*8975f5c5SAndroid Build Coastguard Worker }
364*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateMetalParams()365*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateMetalParams()
366*8975f5c5SAndroid Build Coastguard Worker {
367*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
368*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::METAL();
369*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
370*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
371*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
372*8975f5c5SAndroid Build Coastguard Worker     return params;
373*8975f5c5SAndroid Build Coastguard Worker }
374*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateMetalParamsLargeUpdate()375*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateMetalParamsLargeUpdate()
376*8975f5c5SAndroid Build Coastguard Worker {
377*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
378*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::METAL();
379*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
380*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
381*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
382*8975f5c5SAndroid Build Coastguard Worker     params.updateSize           = 524288;
383*8975f5c5SAndroid Build Coastguard Worker     return params;
384*8975f5c5SAndroid Build Coastguard Worker }
385*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateOpenGLOrGLESParams()386*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateOpenGLOrGLESParams()
387*8975f5c5SAndroid Build Coastguard Worker {
388*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
389*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::OPENGL_OR_GLES();
390*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
391*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
392*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
393*8975f5c5SAndroid Build Coastguard Worker     return params;
394*8975f5c5SAndroid Build Coastguard Worker }
395*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParams()396*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParams()
397*8975f5c5SAndroid Build Coastguard Worker {
398*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
399*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
400*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
401*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
402*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
403*8975f5c5SAndroid Build Coastguard Worker     return params;
404*8975f5c5SAndroid Build Coastguard Worker }
405*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsMidBuffer()406*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsMidBuffer()
407*8975f5c5SAndroid Build Coastguard Worker {
408*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
409*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
410*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
411*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
412*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
413*8975f5c5SAndroid Build Coastguard Worker     params.updateOffset         = 524288;
414*8975f5c5SAndroid Build Coastguard Worker     return params;
415*8975f5c5SAndroid Build Coastguard Worker }
416*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsLargeUpdate()417*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsLargeUpdate()
418*8975f5c5SAndroid Build Coastguard Worker {
419*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
420*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
421*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
422*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
423*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
424*8975f5c5SAndroid Build Coastguard Worker     params.updateSize           = 524288;
425*8975f5c5SAndroid Build Coastguard Worker     return params;
426*8975f5c5SAndroid Build Coastguard Worker }
427*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsFullBuffer()428*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsFullBuffer()
429*8975f5c5SAndroid Build Coastguard Worker {
430*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
431*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
432*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
433*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
434*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
435*8975f5c5SAndroid Build Coastguard Worker     params.updateSize           = 1048576;
436*8975f5c5SAndroid Build Coastguard Worker     return params;
437*8975f5c5SAndroid Build Coastguard Worker }
438*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsTinyUpdate()439*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsTinyUpdate()
440*8975f5c5SAndroid Build Coastguard Worker {
441*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
442*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
443*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
444*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
445*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
446*8975f5c5SAndroid Build Coastguard Worker     params.updateSize           = 128;
447*8975f5c5SAndroid Build Coastguard Worker     return params;
448*8975f5c5SAndroid Build Coastguard Worker }
449*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsNonPowerOf2()450*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsNonPowerOf2()
451*8975f5c5SAndroid Build Coastguard Worker {
452*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
453*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
454*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
455*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
456*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
457*8975f5c5SAndroid Build Coastguard Worker     params.updateSize           = 32000;
458*8975f5c5SAndroid Build Coastguard Worker     params.bufferSize           = 800000;
459*8975f5c5SAndroid Build Coastguard Worker     return params;
460*8975f5c5SAndroid Build Coastguard Worker }
461*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsUnsynchronized()462*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsUnsynchronized()
463*8975f5c5SAndroid Build Coastguard Worker {
464*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
465*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
466*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
467*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
468*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
469*8975f5c5SAndroid Build Coastguard Worker     params.access               = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT;
470*8975f5c5SAndroid Build Coastguard Worker     return params;
471*8975f5c5SAndroid Build Coastguard Worker }
472*8975f5c5SAndroid Build Coastguard Worker 
BufferUpdateVulkanParamsLargeUpdateUnsynchronized()473*8975f5c5SAndroid Build Coastguard Worker MapBufferRangeParams BufferUpdateVulkanParamsLargeUpdateUnsynchronized()
474*8975f5c5SAndroid Build Coastguard Worker {
475*8975f5c5SAndroid Build Coastguard Worker     MapBufferRangeParams params;
476*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters        = egl_platform::VULKAN();
477*8975f5c5SAndroid Build Coastguard Worker     params.vertexType           = GL_FLOAT;
478*8975f5c5SAndroid Build Coastguard Worker     params.vertexComponentCount = 4;
479*8975f5c5SAndroid Build Coastguard Worker     params.vertexNormalized     = GL_FALSE;
480*8975f5c5SAndroid Build Coastguard Worker     params.updateSize           = 524288;
481*8975f5c5SAndroid Build Coastguard Worker     params.access               = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT;
482*8975f5c5SAndroid Build Coastguard Worker     return params;
483*8975f5c5SAndroid Build Coastguard Worker }
484*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(MapBufferRangeBenchmark,Run)485*8975f5c5SAndroid Build Coastguard Worker TEST_P(MapBufferRangeBenchmark, Run)
486*8975f5c5SAndroid Build Coastguard Worker {
487*8975f5c5SAndroid Build Coastguard Worker     run();
488*8975f5c5SAndroid Build Coastguard Worker }
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(MapBufferRangeBenchmark,
491*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateD3D11Params(),
492*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateMetalParams(),
493*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateMetalParamsLargeUpdate(),
494*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateOpenGLOrGLESParams(),
495*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParams(),
496*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsMidBuffer(),
497*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsLargeUpdate(),
498*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsFullBuffer(),
499*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsTinyUpdate(),
500*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsNonPowerOf2(),
501*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsUnsynchronized(),
502*8975f5c5SAndroid Build Coastguard Worker                        BufferUpdateVulkanParamsLargeUpdateUnsynchronized());
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker }  // namespace
505