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 ¶ms)
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 ¶ms = 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 ¶ms = 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