xref: /aosp_15_r20/external/deqp/modules/gles2/performance/es2pDrawCallBatchingTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 2.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Draw call batching performance tests
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es2pDrawCallBatchingTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include "deFile.h"
39*35238bceSAndroid Build Coastguard Worker #include "deString.h"
40*35238bceSAndroid Build Coastguard Worker #include "deClock.h"
41*35238bceSAndroid Build Coastguard Worker #include "deThread.h"
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker #include <cmath>
44*35238bceSAndroid Build Coastguard Worker #include <vector>
45*35238bceSAndroid Build Coastguard Worker #include <string>
46*35238bceSAndroid Build Coastguard Worker #include <sstream>
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker using namespace glw;
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker using std::string;
53*35238bceSAndroid Build Coastguard Worker using std::vector;
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker namespace deqp
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker namespace gles2
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker namespace Performance
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker namespace
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker const int CALIBRATION_SAMPLE_COUNT = 34;
65*35238bceSAndroid Build Coastguard Worker 
66*35238bceSAndroid Build Coastguard Worker class DrawCallBatchingTest : public tcu::TestCase
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker public:
69*35238bceSAndroid Build Coastguard Worker     struct TestSpec
70*35238bceSAndroid Build Coastguard Worker     {
71*35238bceSAndroid Build Coastguard Worker         bool useStaticBuffer;
72*35238bceSAndroid Build Coastguard Worker         int staticAttributeCount;
73*35238bceSAndroid Build Coastguard Worker 
74*35238bceSAndroid Build Coastguard Worker         bool useDynamicBuffer;
75*35238bceSAndroid Build Coastguard Worker         int dynamicAttributeCount;
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker         int triangleCount;
78*35238bceSAndroid Build Coastguard Worker         int drawCallCount;
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker         bool useDrawElements;
81*35238bceSAndroid Build Coastguard Worker         bool useIndexBuffer;
82*35238bceSAndroid Build Coastguard Worker         bool dynamicIndices;
83*35238bceSAndroid Build Coastguard Worker     };
84*35238bceSAndroid Build Coastguard Worker 
85*35238bceSAndroid Build Coastguard Worker     DrawCallBatchingTest(Context &context, const char *name, const char *description, const TestSpec &spec);
86*35238bceSAndroid Build Coastguard Worker     ~DrawCallBatchingTest(void);
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker     void init(void);
89*35238bceSAndroid Build Coastguard Worker     void deinit(void);
90*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
91*35238bceSAndroid Build Coastguard Worker 
92*35238bceSAndroid Build Coastguard Worker private:
93*35238bceSAndroid Build Coastguard Worker     enum State
94*35238bceSAndroid Build Coastguard Worker     {
95*35238bceSAndroid Build Coastguard Worker         STATE_LOG_INFO = 0,
96*35238bceSAndroid Build Coastguard Worker         STATE_WARMUP_BATCHED,
97*35238bceSAndroid Build Coastguard Worker         STATE_WARMUP_UNBATCHED,
98*35238bceSAndroid Build Coastguard Worker         STATE_CALC_CALIBRATION,
99*35238bceSAndroid Build Coastguard Worker         STATE_SAMPLE
100*35238bceSAndroid Build Coastguard Worker     };
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker     State m_state;
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &m_renderCtx;
105*35238bceSAndroid Build Coastguard Worker     de::Random m_rnd;
106*35238bceSAndroid Build Coastguard Worker     int m_sampleIteration;
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker     int m_unbatchedSampleCount;
109*35238bceSAndroid Build Coastguard Worker     int m_batchedSampleCount;
110*35238bceSAndroid Build Coastguard Worker 
111*35238bceSAndroid Build Coastguard Worker     TestSpec m_spec;
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
114*35238bceSAndroid Build Coastguard Worker 
115*35238bceSAndroid Build Coastguard Worker     vector<uint8_t> m_dynamicIndexData;
116*35238bceSAndroid Build Coastguard Worker     vector<uint8_t> m_staticIndexData;
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker     vector<GLuint> m_unbatchedDynamicIndexBuffers;
119*35238bceSAndroid Build Coastguard Worker     GLuint m_batchedDynamicIndexBuffer;
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker     GLuint m_unbatchedStaticIndexBuffer;
122*35238bceSAndroid Build Coastguard Worker     GLuint m_batchedStaticIndexBuffer;
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker     vector<vector<int8_t>> m_staticAttributeDatas;
125*35238bceSAndroid Build Coastguard Worker     vector<vector<int8_t>> m_dynamicAttributeDatas;
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker     vector<GLuint> m_batchedStaticBuffers;
128*35238bceSAndroid Build Coastguard Worker     vector<GLuint> m_unbatchedStaticBuffers;
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker     vector<GLuint> m_batchedDynamicBuffers;
131*35238bceSAndroid Build Coastguard Worker     vector<vector<GLuint>> m_unbatchedDynamicBuffers;
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     vector<uint64_t> m_unbatchedSamplesUs;
134*35238bceSAndroid Build Coastguard Worker     vector<uint64_t> m_batchedSamplesUs;
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker     void logTestInfo(void);
137*35238bceSAndroid Build Coastguard Worker 
138*35238bceSAndroid Build Coastguard Worker     uint64_t renderUnbatched(void);
139*35238bceSAndroid Build Coastguard Worker     uint64_t renderBatched(void);
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker     void createIndexData(void);
142*35238bceSAndroid Build Coastguard Worker     void createIndexBuffer(void);
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker     void createShader(void);
145*35238bceSAndroid Build Coastguard Worker     void createAttributeDatas(void);
146*35238bceSAndroid Build Coastguard Worker     void createArrayBuffers(void);
147*35238bceSAndroid Build Coastguard Worker };
148*35238bceSAndroid Build Coastguard Worker 
DrawCallBatchingTest(Context & context,const char * name,const char * description,const TestSpec & spec)149*35238bceSAndroid Build Coastguard Worker DrawCallBatchingTest::DrawCallBatchingTest(Context &context, const char *name, const char *description,
150*35238bceSAndroid Build Coastguard Worker                                            const TestSpec &spec)
151*35238bceSAndroid Build Coastguard Worker     : tcu::TestCase(context.getTestContext(), tcu::NODETYPE_PERFORMANCE, name, description)
152*35238bceSAndroid Build Coastguard Worker     , m_state(STATE_LOG_INFO)
153*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(context.getRenderContext())
154*35238bceSAndroid Build Coastguard Worker     , m_rnd(deStringHash(name))
155*35238bceSAndroid Build Coastguard Worker     , m_sampleIteration(0)
156*35238bceSAndroid Build Coastguard Worker     , m_unbatchedSampleCount(CALIBRATION_SAMPLE_COUNT)
157*35238bceSAndroid Build Coastguard Worker     , m_batchedSampleCount(CALIBRATION_SAMPLE_COUNT)
158*35238bceSAndroid Build Coastguard Worker     , m_spec(spec)
159*35238bceSAndroid Build Coastguard Worker     , m_program(NULL)
160*35238bceSAndroid Build Coastguard Worker     , m_batchedDynamicIndexBuffer(0)
161*35238bceSAndroid Build Coastguard Worker     , m_unbatchedStaticIndexBuffer(0)
162*35238bceSAndroid Build Coastguard Worker     , m_batchedStaticIndexBuffer(0)
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker }
165*35238bceSAndroid Build Coastguard Worker 
~DrawCallBatchingTest(void)166*35238bceSAndroid Build Coastguard Worker DrawCallBatchingTest::~DrawCallBatchingTest(void)
167*35238bceSAndroid Build Coastguard Worker {
168*35238bceSAndroid Build Coastguard Worker     deinit();
169*35238bceSAndroid Build Coastguard Worker }
170*35238bceSAndroid Build Coastguard Worker 
createIndexData(void)171*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::createIndexData(void)
172*35238bceSAndroid Build Coastguard Worker {
173*35238bceSAndroid Build Coastguard Worker     if (m_spec.dynamicIndices)
174*35238bceSAndroid Build Coastguard Worker     {
175*35238bceSAndroid Build Coastguard Worker         for (int drawNdx = 0; drawNdx < m_spec.drawCallCount; drawNdx++)
176*35238bceSAndroid Build Coastguard Worker         {
177*35238bceSAndroid Build Coastguard Worker             for (int triangleNdx = 0; triangleNdx < m_spec.triangleCount; triangleNdx++)
178*35238bceSAndroid Build Coastguard Worker             {
179*35238bceSAndroid Build Coastguard Worker                 m_dynamicIndexData.push_back(uint8_t(triangleNdx * 3));
180*35238bceSAndroid Build Coastguard Worker                 m_dynamicIndexData.push_back(uint8_t(triangleNdx * 3 + 1));
181*35238bceSAndroid Build Coastguard Worker                 m_dynamicIndexData.push_back(uint8_t(triangleNdx * 3 + 2));
182*35238bceSAndroid Build Coastguard Worker             }
183*35238bceSAndroid Build Coastguard Worker         }
184*35238bceSAndroid Build Coastguard Worker     }
185*35238bceSAndroid Build Coastguard Worker     else
186*35238bceSAndroid Build Coastguard Worker     {
187*35238bceSAndroid Build Coastguard Worker         for (int drawNdx = 0; drawNdx < m_spec.drawCallCount; drawNdx++)
188*35238bceSAndroid Build Coastguard Worker         {
189*35238bceSAndroid Build Coastguard Worker             for (int triangleNdx = 0; triangleNdx < m_spec.triangleCount; triangleNdx++)
190*35238bceSAndroid Build Coastguard Worker             {
191*35238bceSAndroid Build Coastguard Worker                 m_staticIndexData.push_back(uint8_t(triangleNdx * 3));
192*35238bceSAndroid Build Coastguard Worker                 m_staticIndexData.push_back(uint8_t(triangleNdx * 3 + 1));
193*35238bceSAndroid Build Coastguard Worker                 m_staticIndexData.push_back(uint8_t(triangleNdx * 3 + 2));
194*35238bceSAndroid Build Coastguard Worker             }
195*35238bceSAndroid Build Coastguard Worker         }
196*35238bceSAndroid Build Coastguard Worker     }
197*35238bceSAndroid Build Coastguard Worker }
198*35238bceSAndroid Build Coastguard Worker 
createShader(void)199*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::createShader(void)
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker     std::ostringstream vertexShader;
202*35238bceSAndroid Build Coastguard Worker     std::ostringstream fragmentShader;
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker     for (int attributeNdx = 0; attributeNdx < m_spec.staticAttributeCount; attributeNdx++)
205*35238bceSAndroid Build Coastguard Worker         vertexShader << "attribute mediump vec4 a_static" << attributeNdx << ";\n";
206*35238bceSAndroid Build Coastguard Worker 
207*35238bceSAndroid Build Coastguard Worker     if (m_spec.staticAttributeCount > 0 && m_spec.dynamicAttributeCount > 0)
208*35238bceSAndroid Build Coastguard Worker         vertexShader << "\n";
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker     for (int attributeNdx = 0; attributeNdx < m_spec.dynamicAttributeCount; attributeNdx++)
211*35238bceSAndroid Build Coastguard Worker         vertexShader << "attribute mediump vec4 a_dyn" << attributeNdx << ";\n";
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker     vertexShader << "\n"
214*35238bceSAndroid Build Coastguard Worker                  << "varying mediump vec4 v_color;\n"
215*35238bceSAndroid Build Coastguard Worker                  << "\n"
216*35238bceSAndroid Build Coastguard Worker                  << "void main (void)\n"
217*35238bceSAndroid Build Coastguard Worker                  << "{\n";
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker     vertexShader << "\tv_color = ";
220*35238bceSAndroid Build Coastguard Worker 
221*35238bceSAndroid Build Coastguard Worker     bool first = true;
222*35238bceSAndroid Build Coastguard Worker 
223*35238bceSAndroid Build Coastguard Worker     for (int attributeNdx = 0; attributeNdx < m_spec.staticAttributeCount; attributeNdx++)
224*35238bceSAndroid Build Coastguard Worker     {
225*35238bceSAndroid Build Coastguard Worker         if (!first)
226*35238bceSAndroid Build Coastguard Worker             vertexShader << " + ";
227*35238bceSAndroid Build Coastguard Worker         first = false;
228*35238bceSAndroid Build Coastguard Worker 
229*35238bceSAndroid Build Coastguard Worker         vertexShader << "a_static" << attributeNdx;
230*35238bceSAndroid Build Coastguard Worker     }
231*35238bceSAndroid Build Coastguard Worker 
232*35238bceSAndroid Build Coastguard Worker     for (int attributeNdx = 0; attributeNdx < m_spec.dynamicAttributeCount; attributeNdx++)
233*35238bceSAndroid Build Coastguard Worker     {
234*35238bceSAndroid Build Coastguard Worker         if (!first)
235*35238bceSAndroid Build Coastguard Worker             vertexShader << " + ";
236*35238bceSAndroid Build Coastguard Worker         first = false;
237*35238bceSAndroid Build Coastguard Worker 
238*35238bceSAndroid Build Coastguard Worker         vertexShader << "a_dyn" << attributeNdx;
239*35238bceSAndroid Build Coastguard Worker     }
240*35238bceSAndroid Build Coastguard Worker 
241*35238bceSAndroid Build Coastguard Worker     vertexShader << ";\n";
242*35238bceSAndroid Build Coastguard Worker 
243*35238bceSAndroid Build Coastguard Worker     if (m_spec.dynamicAttributeCount > 0)
244*35238bceSAndroid Build Coastguard Worker         vertexShader << "\tgl_Position = a_dyn0;\n";
245*35238bceSAndroid Build Coastguard Worker     else
246*35238bceSAndroid Build Coastguard Worker         vertexShader << "\tgl_Position = a_static0;\n";
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker     vertexShader << "}";
249*35238bceSAndroid Build Coastguard Worker 
250*35238bceSAndroid Build Coastguard Worker     fragmentShader << "varying mediump vec4 v_color;\n"
251*35238bceSAndroid Build Coastguard Worker                    << "\n"
252*35238bceSAndroid Build Coastguard Worker                    << "void main(void)\n"
253*35238bceSAndroid Build Coastguard Worker                    << "{\n"
254*35238bceSAndroid Build Coastguard Worker                    << "\tgl_FragColor = v_color;\n"
255*35238bceSAndroid Build Coastguard Worker                    << "}\n";
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker     m_program = new glu::ShaderProgram(m_renderCtx, glu::ProgramSources() << glu::VertexSource(vertexShader.str())
258*35238bceSAndroid Build Coastguard Worker                                                                           << glu::FragmentSource(fragmentShader.str()));
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << (*m_program);
261*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(m_program->isOk());
262*35238bceSAndroid Build Coastguard Worker }
263*35238bceSAndroid Build Coastguard Worker 
createAttributeDatas(void)264*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::createAttributeDatas(void)
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker     // Generate data for static attributes
267*35238bceSAndroid Build Coastguard Worker     for (int attribute = 0; attribute < m_spec.staticAttributeCount; attribute++)
268*35238bceSAndroid Build Coastguard Worker     {
269*35238bceSAndroid Build Coastguard Worker         vector<int8_t> data;
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker         if (m_spec.dynamicAttributeCount == 0 && attribute == 0)
272*35238bceSAndroid Build Coastguard Worker         {
273*35238bceSAndroid Build Coastguard Worker             data.reserve(4 * 3 * m_spec.triangleCount * m_spec.drawCallCount);
274*35238bceSAndroid Build Coastguard Worker 
275*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < m_spec.triangleCount * m_spec.drawCallCount; i++)
276*35238bceSAndroid Build Coastguard Worker             {
277*35238bceSAndroid Build Coastguard Worker                 int sign = (m_spec.triangleCount % 2 == 1 || i % 2 == 0 ? 1 : -1);
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(-127 * sign));
280*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(-127 * sign));
281*35238bceSAndroid Build Coastguard Worker                 data.push_back(0);
282*35238bceSAndroid Build Coastguard Worker                 data.push_back(127);
283*35238bceSAndroid Build Coastguard Worker 
284*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(127 * sign));
285*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(-127 * sign));
286*35238bceSAndroid Build Coastguard Worker                 data.push_back(0);
287*35238bceSAndroid Build Coastguard Worker                 data.push_back(127);
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(127 * sign));
290*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(127 * sign));
291*35238bceSAndroid Build Coastguard Worker                 data.push_back(0);
292*35238bceSAndroid Build Coastguard Worker                 data.push_back(127);
293*35238bceSAndroid Build Coastguard Worker             }
294*35238bceSAndroid Build Coastguard Worker         }
295*35238bceSAndroid Build Coastguard Worker         else
296*35238bceSAndroid Build Coastguard Worker         {
297*35238bceSAndroid Build Coastguard Worker             data.reserve(4 * 3 * m_spec.triangleCount * m_spec.drawCallCount);
298*35238bceSAndroid Build Coastguard Worker 
299*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < 4 * 3 * m_spec.triangleCount * m_spec.drawCallCount; i++)
300*35238bceSAndroid Build Coastguard Worker                 data.push_back((int8_t)m_rnd.getUint32());
301*35238bceSAndroid Build Coastguard Worker         }
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker         m_staticAttributeDatas.push_back(data);
304*35238bceSAndroid Build Coastguard Worker     }
305*35238bceSAndroid Build Coastguard Worker 
306*35238bceSAndroid Build Coastguard Worker     // Generate data for dynamic attributes
307*35238bceSAndroid Build Coastguard Worker     for (int attribute = 0; attribute < m_spec.dynamicAttributeCount; attribute++)
308*35238bceSAndroid Build Coastguard Worker     {
309*35238bceSAndroid Build Coastguard Worker         vector<int8_t> data;
310*35238bceSAndroid Build Coastguard Worker 
311*35238bceSAndroid Build Coastguard Worker         if (attribute == 0)
312*35238bceSAndroid Build Coastguard Worker         {
313*35238bceSAndroid Build Coastguard Worker             data.reserve(4 * 3 * m_spec.triangleCount * m_spec.drawCallCount);
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < m_spec.triangleCount * m_spec.drawCallCount; i++)
316*35238bceSAndroid Build Coastguard Worker             {
317*35238bceSAndroid Build Coastguard Worker                 int sign = (i % 2 == 0 ? 1 : -1);
318*35238bceSAndroid Build Coastguard Worker 
319*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(-127 * sign));
320*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(-127 * sign));
321*35238bceSAndroid Build Coastguard Worker                 data.push_back(0);
322*35238bceSAndroid Build Coastguard Worker                 data.push_back(127);
323*35238bceSAndroid Build Coastguard Worker 
324*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(127 * sign));
325*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(-127 * sign));
326*35238bceSAndroid Build Coastguard Worker                 data.push_back(0);
327*35238bceSAndroid Build Coastguard Worker                 data.push_back(127);
328*35238bceSAndroid Build Coastguard Worker 
329*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(127 * sign));
330*35238bceSAndroid Build Coastguard Worker                 data.push_back(int8_t(127 * sign));
331*35238bceSAndroid Build Coastguard Worker                 data.push_back(0);
332*35238bceSAndroid Build Coastguard Worker                 data.push_back(127);
333*35238bceSAndroid Build Coastguard Worker             }
334*35238bceSAndroid Build Coastguard Worker         }
335*35238bceSAndroid Build Coastguard Worker         else
336*35238bceSAndroid Build Coastguard Worker         {
337*35238bceSAndroid Build Coastguard Worker             data.reserve(4 * 3 * m_spec.triangleCount * m_spec.drawCallCount);
338*35238bceSAndroid Build Coastguard Worker 
339*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < 4 * 3 * m_spec.triangleCount * m_spec.drawCallCount; i++)
340*35238bceSAndroid Build Coastguard Worker                 data.push_back((int8_t)m_rnd.getUint32());
341*35238bceSAndroid Build Coastguard Worker         }
342*35238bceSAndroid Build Coastguard Worker 
343*35238bceSAndroid Build Coastguard Worker         m_dynamicAttributeDatas.push_back(data);
344*35238bceSAndroid Build Coastguard Worker     }
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker 
createArrayBuffers(void)347*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::createArrayBuffers(void)
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker     if (m_spec.useStaticBuffer)
352*35238bceSAndroid Build Coastguard Worker     {
353*35238bceSAndroid Build Coastguard Worker         // Upload static attributes for batched
354*35238bceSAndroid Build Coastguard Worker         for (int attribute = 0; attribute < m_spec.staticAttributeCount; attribute++)
355*35238bceSAndroid Build Coastguard Worker         {
356*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
357*35238bceSAndroid Build Coastguard Worker 
358*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
359*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
360*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ARRAY_BUFFER, 4 * 3 * m_spec.triangleCount * m_spec.drawCallCount,
361*35238bceSAndroid Build Coastguard Worker                           &(m_staticAttributeDatas[attribute][0]), GL_STATIC_DRAW);
362*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, 0);
363*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating static buffer failed");
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker             m_batchedStaticBuffers.push_back(buffer);
366*35238bceSAndroid Build Coastguard Worker         }
367*35238bceSAndroid Build Coastguard Worker 
368*35238bceSAndroid Build Coastguard Worker         // Upload static attributes for unbatched
369*35238bceSAndroid Build Coastguard Worker         for (int attribute = 0; attribute < m_spec.staticAttributeCount; attribute++)
370*35238bceSAndroid Build Coastguard Worker         {
371*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
372*35238bceSAndroid Build Coastguard Worker 
373*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
374*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
375*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ARRAY_BUFFER, 4 * 3 * m_spec.triangleCount, &(m_staticAttributeDatas[attribute][0]),
376*35238bceSAndroid Build Coastguard Worker                           GL_STATIC_DRAW);
377*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, 0);
378*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating static buffer failed");
379*35238bceSAndroid Build Coastguard Worker 
380*35238bceSAndroid Build Coastguard Worker             m_unbatchedStaticBuffers.push_back(buffer);
381*35238bceSAndroid Build Coastguard Worker         }
382*35238bceSAndroid Build Coastguard Worker     }
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDynamicBuffer)
385*35238bceSAndroid Build Coastguard Worker     {
386*35238bceSAndroid Build Coastguard Worker         // Upload dynamic attributes for batched
387*35238bceSAndroid Build Coastguard Worker         for (int attribute = 0; attribute < m_spec.dynamicAttributeCount; attribute++)
388*35238bceSAndroid Build Coastguard Worker         {
389*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
392*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
393*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ARRAY_BUFFER, 4 * 3 * m_spec.triangleCount * m_spec.drawCallCount,
394*35238bceSAndroid Build Coastguard Worker                           &(m_dynamicAttributeDatas[attribute][0]), GL_STATIC_DRAW);
395*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, 0);
396*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating dynamic buffer failed");
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker             m_batchedDynamicBuffers.push_back(buffer);
399*35238bceSAndroid Build Coastguard Worker         }
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker         // Upload dynamic attributes for unbatched
402*35238bceSAndroid Build Coastguard Worker         for (int attribute = 0; attribute < m_spec.dynamicAttributeCount; attribute++)
403*35238bceSAndroid Build Coastguard Worker         {
404*35238bceSAndroid Build Coastguard Worker             vector<GLuint> buffers;
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker             for (int drawNdx = 0; drawNdx < m_spec.drawCallCount; drawNdx++)
407*35238bceSAndroid Build Coastguard Worker             {
408*35238bceSAndroid Build Coastguard Worker                 GLuint buffer;
409*35238bceSAndroid Build Coastguard Worker 
410*35238bceSAndroid Build Coastguard Worker                 gl.genBuffers(1, &buffer);
411*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
412*35238bceSAndroid Build Coastguard Worker                 gl.bufferData(GL_ARRAY_BUFFER, 4 * 3 * m_spec.triangleCount * m_spec.drawCallCount,
413*35238bceSAndroid Build Coastguard Worker                               &(m_dynamicAttributeDatas[attribute][0]), GL_STATIC_DRAW);
414*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(GL_ARRAY_BUFFER, 0);
415*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "Creating dynamic buffer failed");
416*35238bceSAndroid Build Coastguard Worker 
417*35238bceSAndroid Build Coastguard Worker                 buffers.push_back(buffer);
418*35238bceSAndroid Build Coastguard Worker             }
419*35238bceSAndroid Build Coastguard Worker 
420*35238bceSAndroid Build Coastguard Worker             m_unbatchedDynamicBuffers.push_back(buffers);
421*35238bceSAndroid Build Coastguard Worker         }
422*35238bceSAndroid Build Coastguard Worker     }
423*35238bceSAndroid Build Coastguard Worker }
424*35238bceSAndroid Build Coastguard Worker 
createIndexBuffer(void)425*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::createIndexBuffer(void)
426*35238bceSAndroid Build Coastguard Worker {
427*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
428*35238bceSAndroid Build Coastguard Worker 
429*35238bceSAndroid Build Coastguard Worker     if (m_spec.dynamicIndices)
430*35238bceSAndroid Build Coastguard Worker     {
431*35238bceSAndroid Build Coastguard Worker         for (int drawNdx = 0; drawNdx < m_spec.drawCallCount; drawNdx++)
432*35238bceSAndroid Build Coastguard Worker         {
433*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
434*35238bceSAndroid Build Coastguard Worker 
435*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
436*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
437*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * m_spec.triangleCount,
438*35238bceSAndroid Build Coastguard Worker                           &(m_dynamicIndexData[drawNdx * m_spec.triangleCount * 3]), GL_STATIC_DRAW);
439*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
440*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating dynamic index buffer failed");
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker             m_unbatchedDynamicIndexBuffers.push_back(buffer);
443*35238bceSAndroid Build Coastguard Worker         }
444*35238bceSAndroid Build Coastguard Worker 
445*35238bceSAndroid Build Coastguard Worker         {
446*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
447*35238bceSAndroid Build Coastguard Worker 
448*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
449*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
450*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * m_spec.triangleCount * m_spec.drawCallCount,
451*35238bceSAndroid Build Coastguard Worker                           &(m_dynamicIndexData[0]), GL_STATIC_DRAW);
452*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
453*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating dynamic index buffer failed");
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker             m_batchedDynamicIndexBuffer = buffer;
456*35238bceSAndroid Build Coastguard Worker         }
457*35238bceSAndroid Build Coastguard Worker     }
458*35238bceSAndroid Build Coastguard Worker     else
459*35238bceSAndroid Build Coastguard Worker     {
460*35238bceSAndroid Build Coastguard Worker         {
461*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
464*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
465*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * m_spec.triangleCount * m_spec.drawCallCount,
466*35238bceSAndroid Build Coastguard Worker                           &(m_staticIndexData[0]), GL_STATIC_DRAW);
467*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
468*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating dynamic index buffer failed");
469*35238bceSAndroid Build Coastguard Worker 
470*35238bceSAndroid Build Coastguard Worker             m_batchedStaticIndexBuffer = buffer;
471*35238bceSAndroid Build Coastguard Worker         }
472*35238bceSAndroid Build Coastguard Worker 
473*35238bceSAndroid Build Coastguard Worker         {
474*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker             gl.genBuffers(1, &buffer);
477*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
478*35238bceSAndroid Build Coastguard Worker             gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * m_spec.triangleCount, &(m_staticIndexData[0]), GL_STATIC_DRAW);
479*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
480*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "Creating dynamic index buffer failed");
481*35238bceSAndroid Build Coastguard Worker 
482*35238bceSAndroid Build Coastguard Worker             m_unbatchedStaticIndexBuffer = buffer;
483*35238bceSAndroid Build Coastguard Worker         }
484*35238bceSAndroid Build Coastguard Worker     }
485*35238bceSAndroid Build Coastguard Worker }
486*35238bceSAndroid Build Coastguard Worker 
init(void)487*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::init(void)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker     createShader();
490*35238bceSAndroid Build Coastguard Worker     createAttributeDatas();
491*35238bceSAndroid Build Coastguard Worker     createArrayBuffers();
492*35238bceSAndroid Build Coastguard Worker 
493*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements)
494*35238bceSAndroid Build Coastguard Worker     {
495*35238bceSAndroid Build Coastguard Worker         createIndexData();
496*35238bceSAndroid Build Coastguard Worker 
497*35238bceSAndroid Build Coastguard Worker         if (m_spec.useIndexBuffer)
498*35238bceSAndroid Build Coastguard Worker             createIndexBuffer();
499*35238bceSAndroid Build Coastguard Worker     }
500*35238bceSAndroid Build Coastguard Worker }
501*35238bceSAndroid Build Coastguard Worker 
deinit(void)502*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::deinit(void)
503*35238bceSAndroid Build Coastguard Worker {
504*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
505*35238bceSAndroid Build Coastguard Worker 
506*35238bceSAndroid Build Coastguard Worker     delete m_program;
507*35238bceSAndroid Build Coastguard Worker     m_program = NULL;
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker     m_dynamicIndexData = vector<uint8_t>();
510*35238bceSAndroid Build Coastguard Worker     m_staticIndexData  = vector<uint8_t>();
511*35238bceSAndroid Build Coastguard Worker 
512*35238bceSAndroid Build Coastguard Worker     if (!m_unbatchedDynamicIndexBuffers.empty())
513*35238bceSAndroid Build Coastguard Worker     {
514*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)m_unbatchedDynamicIndexBuffers.size(), &(m_unbatchedDynamicIndexBuffers[0]));
515*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker         m_unbatchedDynamicIndexBuffers = vector<GLuint>();
518*35238bceSAndroid Build Coastguard Worker     }
519*35238bceSAndroid Build Coastguard Worker 
520*35238bceSAndroid Build Coastguard Worker     if (m_batchedDynamicIndexBuffer)
521*35238bceSAndroid Build Coastguard Worker     {
522*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)1, &m_batchedDynamicIndexBuffer);
523*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
524*35238bceSAndroid Build Coastguard Worker 
525*35238bceSAndroid Build Coastguard Worker         m_batchedDynamicIndexBuffer = 0;
526*35238bceSAndroid Build Coastguard Worker     }
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker     if (m_unbatchedStaticIndexBuffer)
529*35238bceSAndroid Build Coastguard Worker     {
530*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)1, &m_unbatchedStaticIndexBuffer);
531*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
532*35238bceSAndroid Build Coastguard Worker 
533*35238bceSAndroid Build Coastguard Worker         m_unbatchedStaticIndexBuffer = 0;
534*35238bceSAndroid Build Coastguard Worker     }
535*35238bceSAndroid Build Coastguard Worker 
536*35238bceSAndroid Build Coastguard Worker     if (m_batchedStaticIndexBuffer)
537*35238bceSAndroid Build Coastguard Worker     {
538*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)1, &m_batchedStaticIndexBuffer);
539*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
540*35238bceSAndroid Build Coastguard Worker 
541*35238bceSAndroid Build Coastguard Worker         m_batchedStaticIndexBuffer = 0;
542*35238bceSAndroid Build Coastguard Worker     }
543*35238bceSAndroid Build Coastguard Worker 
544*35238bceSAndroid Build Coastguard Worker     m_staticAttributeDatas  = vector<vector<int8_t>>();
545*35238bceSAndroid Build Coastguard Worker     m_dynamicAttributeDatas = vector<vector<int8_t>>();
546*35238bceSAndroid Build Coastguard Worker 
547*35238bceSAndroid Build Coastguard Worker     if (!m_batchedStaticBuffers.empty())
548*35238bceSAndroid Build Coastguard Worker     {
549*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)m_batchedStaticBuffers.size(), &(m_batchedStaticBuffers[0]));
550*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
551*35238bceSAndroid Build Coastguard Worker 
552*35238bceSAndroid Build Coastguard Worker         m_batchedStaticBuffers = vector<GLuint>();
553*35238bceSAndroid Build Coastguard Worker     }
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker     if (!m_unbatchedStaticBuffers.empty())
556*35238bceSAndroid Build Coastguard Worker     {
557*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)m_unbatchedStaticBuffers.size(), &(m_unbatchedStaticBuffers[0]));
558*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker         m_unbatchedStaticBuffers = vector<GLuint>();
561*35238bceSAndroid Build Coastguard Worker     }
562*35238bceSAndroid Build Coastguard Worker 
563*35238bceSAndroid Build Coastguard Worker     if (!m_batchedDynamicBuffers.empty())
564*35238bceSAndroid Build Coastguard Worker     {
565*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)m_batchedDynamicBuffers.size(), &(m_batchedDynamicBuffers[0]));
566*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
567*35238bceSAndroid Build Coastguard Worker 
568*35238bceSAndroid Build Coastguard Worker         m_batchedDynamicBuffers = vector<GLuint>();
569*35238bceSAndroid Build Coastguard Worker     }
570*35238bceSAndroid Build Coastguard Worker 
571*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < (int)m_unbatchedDynamicBuffers.size(); i++)
572*35238bceSAndroid Build Coastguard Worker     {
573*35238bceSAndroid Build Coastguard Worker         gl.deleteBuffers((GLsizei)m_unbatchedDynamicBuffers[i].size(), &(m_unbatchedDynamicBuffers[i][0]));
574*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers()");
575*35238bceSAndroid Build Coastguard Worker     }
576*35238bceSAndroid Build Coastguard Worker 
577*35238bceSAndroid Build Coastguard Worker     m_unbatchedDynamicBuffers = vector<vector<GLuint>>();
578*35238bceSAndroid Build Coastguard Worker 
579*35238bceSAndroid Build Coastguard Worker     m_unbatchedSamplesUs = vector<uint64_t>();
580*35238bceSAndroid Build Coastguard Worker     m_batchedSamplesUs   = vector<uint64_t>();
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker 
renderUnbatched(void)583*35238bceSAndroid Build Coastguard Worker uint64_t DrawCallBatchingTest::renderUnbatched(void)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
586*35238bceSAndroid Build Coastguard Worker     uint64_t beginUs         = 0;
587*35238bceSAndroid Build Coastguard Worker     uint64_t endUs           = 0;
588*35238bceSAndroid Build Coastguard Worker     vector<GLint> dynamicAttributeLocations;
589*35238bceSAndroid Build Coastguard Worker 
590*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, 32, 32);
591*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_program->getProgram());
592*35238bceSAndroid Build Coastguard Worker 
593*35238bceSAndroid Build Coastguard Worker     // Setup static buffers
594*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.staticAttributeCount; attribNdx++)
595*35238bceSAndroid Build Coastguard Worker     {
596*35238bceSAndroid Build Coastguard Worker         GLint location = gl.getAttribLocation(m_program->getProgram(), ("a_static" + de::toString(attribNdx)).c_str());
597*35238bceSAndroid Build Coastguard Worker 
598*35238bceSAndroid Build Coastguard Worker         gl.enableVertexAttribArray(location);
599*35238bceSAndroid Build Coastguard Worker 
600*35238bceSAndroid Build Coastguard Worker         if (m_spec.useStaticBuffer)
601*35238bceSAndroid Build Coastguard Worker         {
602*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, m_unbatchedStaticBuffers[attribNdx]);
603*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(location, 4, GL_BYTE, GL_TRUE, 0, NULL);
604*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, 0);
605*35238bceSAndroid Build Coastguard Worker         }
606*35238bceSAndroid Build Coastguard Worker         else
607*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(location, 4, GL_BYTE, GL_TRUE, 0, &(m_staticAttributeDatas[attribNdx][0]));
608*35238bceSAndroid Build Coastguard Worker     }
609*35238bceSAndroid Build Coastguard Worker 
610*35238bceSAndroid Build Coastguard Worker     // Get locations of dynamic attributes
611*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.dynamicAttributeCount; attribNdx++)
612*35238bceSAndroid Build Coastguard Worker     {
613*35238bceSAndroid Build Coastguard Worker         GLint location = gl.getAttribLocation(m_program->getProgram(), ("a_dyn" + de::toString(attribNdx)).c_str());
614*35238bceSAndroid Build Coastguard Worker 
615*35238bceSAndroid Build Coastguard Worker         gl.enableVertexAttribArray(location);
616*35238bceSAndroid Build Coastguard Worker         dynamicAttributeLocations.push_back(location);
617*35238bceSAndroid Build Coastguard Worker     }
618*35238bceSAndroid Build Coastguard Worker 
619*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements && m_spec.useIndexBuffer && !m_spec.dynamicIndices)
620*35238bceSAndroid Build Coastguard Worker         gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_unbatchedStaticIndexBuffer);
621*35238bceSAndroid Build Coastguard Worker 
622*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup initial state for rendering.");
623*35238bceSAndroid Build Coastguard Worker 
624*35238bceSAndroid Build Coastguard Worker     gl.finish();
625*35238bceSAndroid Build Coastguard Worker 
626*35238bceSAndroid Build Coastguard Worker     beginUs = deGetMicroseconds();
627*35238bceSAndroid Build Coastguard Worker 
628*35238bceSAndroid Build Coastguard Worker     for (int drawNdx = 0; drawNdx < m_spec.drawCallCount; drawNdx++)
629*35238bceSAndroid Build Coastguard Worker     {
630*35238bceSAndroid Build Coastguard Worker         for (int attribNdx = 0; attribNdx < m_spec.dynamicAttributeCount; attribNdx++)
631*35238bceSAndroid Build Coastguard Worker         {
632*35238bceSAndroid Build Coastguard Worker             if (m_spec.useDynamicBuffer)
633*35238bceSAndroid Build Coastguard Worker             {
634*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(GL_ARRAY_BUFFER, m_unbatchedDynamicBuffers[attribNdx][drawNdx]);
635*35238bceSAndroid Build Coastguard Worker                 gl.vertexAttribPointer(dynamicAttributeLocations[attribNdx], 4, GL_BYTE, GL_TRUE, 0, NULL);
636*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(GL_ARRAY_BUFFER, 0);
637*35238bceSAndroid Build Coastguard Worker             }
638*35238bceSAndroid Build Coastguard Worker             else
639*35238bceSAndroid Build Coastguard Worker                 gl.vertexAttribPointer(dynamicAttributeLocations[attribNdx], 4, GL_BYTE, GL_TRUE, 0,
640*35238bceSAndroid Build Coastguard Worker                                        &(m_dynamicAttributeDatas[attribNdx][m_spec.triangleCount * 3 * drawNdx * 4]));
641*35238bceSAndroid Build Coastguard Worker         }
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker         if (m_spec.useDrawElements)
644*35238bceSAndroid Build Coastguard Worker         {
645*35238bceSAndroid Build Coastguard Worker             if (m_spec.useIndexBuffer)
646*35238bceSAndroid Build Coastguard Worker             {
647*35238bceSAndroid Build Coastguard Worker                 if (m_spec.dynamicIndices)
648*35238bceSAndroid Build Coastguard Worker                 {
649*35238bceSAndroid Build Coastguard Worker                     gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_unbatchedDynamicIndexBuffers[drawNdx]);
650*35238bceSAndroid Build Coastguard Worker                     gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3, GL_UNSIGNED_BYTE, NULL);
651*35238bceSAndroid Build Coastguard Worker                     gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
652*35238bceSAndroid Build Coastguard Worker                 }
653*35238bceSAndroid Build Coastguard Worker                 else
654*35238bceSAndroid Build Coastguard Worker                     gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3, GL_UNSIGNED_BYTE, NULL);
655*35238bceSAndroid Build Coastguard Worker             }
656*35238bceSAndroid Build Coastguard Worker             else
657*35238bceSAndroid Build Coastguard Worker             {
658*35238bceSAndroid Build Coastguard Worker                 if (m_spec.dynamicIndices)
659*35238bceSAndroid Build Coastguard Worker                     gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3, GL_UNSIGNED_BYTE,
660*35238bceSAndroid Build Coastguard Worker                                     &(m_dynamicIndexData[drawNdx * m_spec.triangleCount * 3]));
661*35238bceSAndroid Build Coastguard Worker                 else
662*35238bceSAndroid Build Coastguard Worker                     gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3, GL_UNSIGNED_BYTE, &(m_staticIndexData[0]));
663*35238bceSAndroid Build Coastguard Worker             }
664*35238bceSAndroid Build Coastguard Worker         }
665*35238bceSAndroid Build Coastguard Worker         else
666*35238bceSAndroid Build Coastguard Worker             gl.drawArrays(GL_TRIANGLES, 0, 3 * m_spec.triangleCount);
667*35238bceSAndroid Build Coastguard Worker     }
668*35238bceSAndroid Build Coastguard Worker 
669*35238bceSAndroid Build Coastguard Worker     gl.finish();
670*35238bceSAndroid Build Coastguard Worker 
671*35238bceSAndroid Build Coastguard Worker     endUs = deGetMicroseconds();
672*35238bceSAndroid Build Coastguard Worker 
673*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Unbatched rendering failed");
674*35238bceSAndroid Build Coastguard Worker 
675*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
676*35238bceSAndroid Build Coastguard Worker 
677*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.staticAttributeCount; attribNdx++)
678*35238bceSAndroid Build Coastguard Worker     {
679*35238bceSAndroid Build Coastguard Worker         GLint location = gl.getAttribLocation(m_program->getProgram(), ("a_static" + de::toString(attribNdx)).c_str());
680*35238bceSAndroid Build Coastguard Worker         gl.disableVertexAttribArray(location);
681*35238bceSAndroid Build Coastguard Worker     }
682*35238bceSAndroid Build Coastguard Worker 
683*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.dynamicAttributeCount; attribNdx++)
684*35238bceSAndroid Build Coastguard Worker         gl.disableVertexAttribArray(dynamicAttributeLocations[attribNdx]);
685*35238bceSAndroid Build Coastguard Worker 
686*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to reset state after unbatched rendering");
687*35238bceSAndroid Build Coastguard Worker 
688*35238bceSAndroid Build Coastguard Worker     return endUs - beginUs;
689*35238bceSAndroid Build Coastguard Worker }
690*35238bceSAndroid Build Coastguard Worker 
renderBatched(void)691*35238bceSAndroid Build Coastguard Worker uint64_t DrawCallBatchingTest::renderBatched(void)
692*35238bceSAndroid Build Coastguard Worker {
693*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
694*35238bceSAndroid Build Coastguard Worker     uint64_t beginUs         = 0;
695*35238bceSAndroid Build Coastguard Worker     uint64_t endUs           = 0;
696*35238bceSAndroid Build Coastguard Worker     vector<GLint> dynamicAttributeLocations;
697*35238bceSAndroid Build Coastguard Worker 
698*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, 32, 32);
699*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_program->getProgram());
700*35238bceSAndroid Build Coastguard Worker 
701*35238bceSAndroid Build Coastguard Worker     // Setup static buffers
702*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.staticAttributeCount; attribNdx++)
703*35238bceSAndroid Build Coastguard Worker     {
704*35238bceSAndroid Build Coastguard Worker         GLint location = gl.getAttribLocation(m_program->getProgram(), ("a_static" + de::toString(attribNdx)).c_str());
705*35238bceSAndroid Build Coastguard Worker 
706*35238bceSAndroid Build Coastguard Worker         gl.enableVertexAttribArray(location);
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker         if (m_spec.useStaticBuffer)
709*35238bceSAndroid Build Coastguard Worker         {
710*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, m_batchedStaticBuffers[attribNdx]);
711*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(location, 4, GL_BYTE, GL_TRUE, 0, NULL);
712*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, 0);
713*35238bceSAndroid Build Coastguard Worker         }
714*35238bceSAndroid Build Coastguard Worker         else
715*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(location, 4, GL_BYTE, GL_TRUE, 0, &(m_staticAttributeDatas[attribNdx][0]));
716*35238bceSAndroid Build Coastguard Worker     }
717*35238bceSAndroid Build Coastguard Worker 
718*35238bceSAndroid Build Coastguard Worker     // Get locations of dynamic attributes
719*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.dynamicAttributeCount; attribNdx++)
720*35238bceSAndroid Build Coastguard Worker     {
721*35238bceSAndroid Build Coastguard Worker         GLint location = gl.getAttribLocation(m_program->getProgram(), ("a_dyn" + de::toString(attribNdx)).c_str());
722*35238bceSAndroid Build Coastguard Worker 
723*35238bceSAndroid Build Coastguard Worker         gl.enableVertexAttribArray(location);
724*35238bceSAndroid Build Coastguard Worker         dynamicAttributeLocations.push_back(location);
725*35238bceSAndroid Build Coastguard Worker     }
726*35238bceSAndroid Build Coastguard Worker 
727*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements && m_spec.useIndexBuffer && !m_spec.dynamicIndices)
728*35238bceSAndroid Build Coastguard Worker         gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_batchedStaticIndexBuffer);
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup initial state for rendering.");
731*35238bceSAndroid Build Coastguard Worker 
732*35238bceSAndroid Build Coastguard Worker     gl.finish();
733*35238bceSAndroid Build Coastguard Worker 
734*35238bceSAndroid Build Coastguard Worker     beginUs = deGetMicroseconds();
735*35238bceSAndroid Build Coastguard Worker 
736*35238bceSAndroid Build Coastguard Worker     for (int attribute = 0; attribute < m_spec.dynamicAttributeCount; attribute++)
737*35238bceSAndroid Build Coastguard Worker     {
738*35238bceSAndroid Build Coastguard Worker         if (m_spec.useDynamicBuffer)
739*35238bceSAndroid Build Coastguard Worker         {
740*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, m_batchedDynamicBuffers[attribute]);
741*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(dynamicAttributeLocations[attribute], 4, GL_BYTE, GL_TRUE, 0, NULL);
742*35238bceSAndroid Build Coastguard Worker             gl.bindBuffer(GL_ARRAY_BUFFER, 0);
743*35238bceSAndroid Build Coastguard Worker         }
744*35238bceSAndroid Build Coastguard Worker         else
745*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(dynamicAttributeLocations[attribute], 4, GL_BYTE, GL_TRUE, 0,
746*35238bceSAndroid Build Coastguard Worker                                    &(m_dynamicAttributeDatas[attribute][0]));
747*35238bceSAndroid Build Coastguard Worker     }
748*35238bceSAndroid Build Coastguard Worker 
749*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements)
750*35238bceSAndroid Build Coastguard Worker     {
751*35238bceSAndroid Build Coastguard Worker         if (m_spec.useIndexBuffer)
752*35238bceSAndroid Build Coastguard Worker         {
753*35238bceSAndroid Build Coastguard Worker             if (m_spec.dynamicIndices)
754*35238bceSAndroid Build Coastguard Worker             {
755*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_batchedDynamicIndexBuffer);
756*35238bceSAndroid Build Coastguard Worker                 gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3 * m_spec.drawCallCount, GL_UNSIGNED_BYTE, NULL);
757*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
758*35238bceSAndroid Build Coastguard Worker             }
759*35238bceSAndroid Build Coastguard Worker             else
760*35238bceSAndroid Build Coastguard Worker                 gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3 * m_spec.drawCallCount, GL_UNSIGNED_BYTE, NULL);
761*35238bceSAndroid Build Coastguard Worker         }
762*35238bceSAndroid Build Coastguard Worker         else
763*35238bceSAndroid Build Coastguard Worker         {
764*35238bceSAndroid Build Coastguard Worker             if (m_spec.dynamicIndices)
765*35238bceSAndroid Build Coastguard Worker                 gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3 * m_spec.drawCallCount, GL_UNSIGNED_BYTE,
766*35238bceSAndroid Build Coastguard Worker                                 &(m_dynamicIndexData[0]));
767*35238bceSAndroid Build Coastguard Worker             else
768*35238bceSAndroid Build Coastguard Worker                 gl.drawElements(GL_TRIANGLES, m_spec.triangleCount * 3 * m_spec.drawCallCount, GL_UNSIGNED_BYTE,
769*35238bceSAndroid Build Coastguard Worker                                 &(m_staticIndexData[0]));
770*35238bceSAndroid Build Coastguard Worker         }
771*35238bceSAndroid Build Coastguard Worker     }
772*35238bceSAndroid Build Coastguard Worker     else
773*35238bceSAndroid Build Coastguard Worker         gl.drawArrays(GL_TRIANGLES, 0, 3 * m_spec.triangleCount * m_spec.drawCallCount);
774*35238bceSAndroid Build Coastguard Worker 
775*35238bceSAndroid Build Coastguard Worker     gl.finish();
776*35238bceSAndroid Build Coastguard Worker 
777*35238bceSAndroid Build Coastguard Worker     endUs = deGetMicroseconds();
778*35238bceSAndroid Build Coastguard Worker 
779*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Batched rendering failed");
780*35238bceSAndroid Build Coastguard Worker 
781*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
782*35238bceSAndroid Build Coastguard Worker 
783*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.staticAttributeCount; attribNdx++)
784*35238bceSAndroid Build Coastguard Worker     {
785*35238bceSAndroid Build Coastguard Worker         GLint location = gl.getAttribLocation(m_program->getProgram(), ("a_static" + de::toString(attribNdx)).c_str());
786*35238bceSAndroid Build Coastguard Worker         gl.disableVertexAttribArray(location);
787*35238bceSAndroid Build Coastguard Worker     }
788*35238bceSAndroid Build Coastguard Worker 
789*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < m_spec.dynamicAttributeCount; attribNdx++)
790*35238bceSAndroid Build Coastguard Worker         gl.disableVertexAttribArray(dynamicAttributeLocations[attribNdx]);
791*35238bceSAndroid Build Coastguard Worker 
792*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to reset state after batched rendering");
793*35238bceSAndroid Build Coastguard Worker 
794*35238bceSAndroid Build Coastguard Worker     return endUs - beginUs;
795*35238bceSAndroid Build Coastguard Worker }
796*35238bceSAndroid Build Coastguard Worker 
797*35238bceSAndroid Build Coastguard Worker struct Statistics
798*35238bceSAndroid Build Coastguard Worker {
799*35238bceSAndroid Build Coastguard Worker     double mean;
800*35238bceSAndroid Build Coastguard Worker     double standardDeviation;
801*35238bceSAndroid Build Coastguard Worker     double standardErrorOfMean;
802*35238bceSAndroid Build Coastguard Worker };
803*35238bceSAndroid Build Coastguard Worker 
calculateStats(const vector<uint64_t> & samples)804*35238bceSAndroid Build Coastguard Worker Statistics calculateStats(const vector<uint64_t> &samples)
805*35238bceSAndroid Build Coastguard Worker {
806*35238bceSAndroid Build Coastguard Worker     double mean = 0.0;
807*35238bceSAndroid Build Coastguard Worker 
808*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < (int)samples.size(); i++)
809*35238bceSAndroid Build Coastguard Worker         mean += (double)samples[i];
810*35238bceSAndroid Build Coastguard Worker 
811*35238bceSAndroid Build Coastguard Worker     mean /= (double)samples.size();
812*35238bceSAndroid Build Coastguard Worker 
813*35238bceSAndroid Build Coastguard Worker     double standardDeviation = 0.0;
814*35238bceSAndroid Build Coastguard Worker 
815*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < (int)samples.size(); i++)
816*35238bceSAndroid Build Coastguard Worker     {
817*35238bceSAndroid Build Coastguard Worker         double x = (double)samples[i];
818*35238bceSAndroid Build Coastguard Worker         standardDeviation += (x - mean) * (x - mean);
819*35238bceSAndroid Build Coastguard Worker     }
820*35238bceSAndroid Build Coastguard Worker 
821*35238bceSAndroid Build Coastguard Worker     standardDeviation /= (double)samples.size();
822*35238bceSAndroid Build Coastguard Worker     standardDeviation = std::sqrt(standardDeviation);
823*35238bceSAndroid Build Coastguard Worker 
824*35238bceSAndroid Build Coastguard Worker     double standardErrorOfMean = standardDeviation / std::sqrt((double)samples.size());
825*35238bceSAndroid Build Coastguard Worker 
826*35238bceSAndroid Build Coastguard Worker     Statistics stats;
827*35238bceSAndroid Build Coastguard Worker 
828*35238bceSAndroid Build Coastguard Worker     stats.mean                = mean;
829*35238bceSAndroid Build Coastguard Worker     stats.standardDeviation   = standardDeviation;
830*35238bceSAndroid Build Coastguard Worker     stats.standardErrorOfMean = standardErrorOfMean;
831*35238bceSAndroid Build Coastguard Worker 
832*35238bceSAndroid Build Coastguard Worker     return stats;
833*35238bceSAndroid Build Coastguard Worker }
834*35238bceSAndroid Build Coastguard Worker 
logTestInfo(void)835*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTest::logTestInfo(void)
836*35238bceSAndroid Build Coastguard Worker {
837*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
838*35238bceSAndroid Build Coastguard Worker     tcu::ScopedLogSection section(log, "Test info", "Test info");
839*35238bceSAndroid Build Coastguard Worker 
840*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Rendering using " << (m_spec.useDrawElements ? "glDrawElements()" : "glDrawArrays()")
841*35238bceSAndroid Build Coastguard Worker         << "." << TestLog::EndMessage;
842*35238bceSAndroid Build Coastguard Worker 
843*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements)
844*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Using " << (m_spec.dynamicIndices ? "dynamic " : "") << "indices from "
845*35238bceSAndroid Build Coastguard Worker             << (m_spec.useIndexBuffer ? "buffer" : "pointer") << "." << TestLog::EndMessage;
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker     if (m_spec.staticAttributeCount > 0)
848*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Using " << m_spec.staticAttributeCount << " static attribute"
849*35238bceSAndroid Build Coastguard Worker             << (m_spec.staticAttributeCount > 1 ? "s" : "") << " from "
850*35238bceSAndroid Build Coastguard Worker             << (m_spec.useStaticBuffer ? "buffer" : "pointer") << "." << TestLog::EndMessage;
851*35238bceSAndroid Build Coastguard Worker 
852*35238bceSAndroid Build Coastguard Worker     if (m_spec.dynamicAttributeCount > 0)
853*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Using " << m_spec.dynamicAttributeCount << " dynamic attribute"
854*35238bceSAndroid Build Coastguard Worker             << (m_spec.dynamicAttributeCount > 1 ? "s" : "") << " from "
855*35238bceSAndroid Build Coastguard Worker             << (m_spec.useDynamicBuffer ? "buffer" : "pointer") << "." << TestLog::EndMessage;
856*35238bceSAndroid Build Coastguard Worker 
857*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Rendering " << m_spec.drawCallCount << " draw calls with " << m_spec.triangleCount
858*35238bceSAndroid Build Coastguard Worker         << " triangles per call." << TestLog::EndMessage;
859*35238bceSAndroid Build Coastguard Worker }
860*35238bceSAndroid Build Coastguard Worker 
iterate(void)861*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult DrawCallBatchingTest::iterate(void)
862*35238bceSAndroid Build Coastguard Worker {
863*35238bceSAndroid Build Coastguard Worker     if (m_state == STATE_LOG_INFO)
864*35238bceSAndroid Build Coastguard Worker     {
865*35238bceSAndroid Build Coastguard Worker         logTestInfo();
866*35238bceSAndroid Build Coastguard Worker         m_state = STATE_WARMUP_BATCHED;
867*35238bceSAndroid Build Coastguard Worker     }
868*35238bceSAndroid Build Coastguard Worker     else if (m_state == STATE_WARMUP_BATCHED)
869*35238bceSAndroid Build Coastguard Worker     {
870*35238bceSAndroid Build Coastguard Worker         renderBatched();
871*35238bceSAndroid Build Coastguard Worker         m_state = STATE_WARMUP_UNBATCHED;
872*35238bceSAndroid Build Coastguard Worker     }
873*35238bceSAndroid Build Coastguard Worker     else if (m_state == STATE_WARMUP_UNBATCHED)
874*35238bceSAndroid Build Coastguard Worker     {
875*35238bceSAndroid Build Coastguard Worker         renderUnbatched();
876*35238bceSAndroid Build Coastguard Worker         m_state = STATE_SAMPLE;
877*35238bceSAndroid Build Coastguard Worker     }
878*35238bceSAndroid Build Coastguard Worker     else if (m_state == STATE_SAMPLE)
879*35238bceSAndroid Build Coastguard Worker     {
880*35238bceSAndroid Build Coastguard Worker         if ((int)m_unbatchedSamplesUs.size() < m_unbatchedSampleCount &&
881*35238bceSAndroid Build Coastguard Worker             ((double)m_unbatchedSamplesUs.size() / ((double)m_unbatchedSampleCount) <
882*35238bceSAndroid Build Coastguard Worker                  (double)m_batchedSamplesUs.size() / ((double)m_batchedSampleCount) ||
883*35238bceSAndroid Build Coastguard Worker              (int)m_batchedSamplesUs.size() >= m_batchedSampleCount))
884*35238bceSAndroid Build Coastguard Worker             m_unbatchedSamplesUs.push_back(renderUnbatched());
885*35238bceSAndroid Build Coastguard Worker         else if ((int)m_batchedSamplesUs.size() < m_batchedSampleCount)
886*35238bceSAndroid Build Coastguard Worker             m_batchedSamplesUs.push_back(renderBatched());
887*35238bceSAndroid Build Coastguard Worker         else
888*35238bceSAndroid Build Coastguard Worker             m_state = STATE_CALC_CALIBRATION;
889*35238bceSAndroid Build Coastguard Worker     }
890*35238bceSAndroid Build Coastguard Worker     else if (m_state == STATE_CALC_CALIBRATION)
891*35238bceSAndroid Build Coastguard Worker     {
892*35238bceSAndroid Build Coastguard Worker         TestLog &log = m_testCtx.getLog();
893*35238bceSAndroid Build Coastguard Worker 
894*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection section(log, ("Sampling iteration " + de::toString(m_sampleIteration)).c_str(),
895*35238bceSAndroid Build Coastguard Worker                                       ("Sampling iteration " + de::toString(m_sampleIteration)).c_str());
896*35238bceSAndroid Build Coastguard Worker         const double targetSEM = 0.02;
897*35238bceSAndroid Build Coastguard Worker         const double limitSEM  = 0.025;
898*35238bceSAndroid Build Coastguard Worker 
899*35238bceSAndroid Build Coastguard Worker         Statistics unbatchedStats = calculateStats(m_unbatchedSamplesUs);
900*35238bceSAndroid Build Coastguard Worker         Statistics batchedStats   = calculateStats(m_batchedSamplesUs);
901*35238bceSAndroid Build Coastguard Worker 
902*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Batched samples; Count: " << m_batchedSamplesUs.size()
903*35238bceSAndroid Build Coastguard Worker             << ", Mean: " << batchedStats.mean << "us, Standard deviation: " << batchedStats.standardDeviation
904*35238bceSAndroid Build Coastguard Worker             << "us, Standard error of mean: " << batchedStats.standardErrorOfMean << "us("
905*35238bceSAndroid Build Coastguard Worker             << (batchedStats.standardErrorOfMean / batchedStats.mean) << ")" << TestLog::EndMessage;
906*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Unbatched samples; Count: " << m_unbatchedSamplesUs.size()
907*35238bceSAndroid Build Coastguard Worker             << ", Mean: " << unbatchedStats.mean << "us, Standard deviation: " << unbatchedStats.standardDeviation
908*35238bceSAndroid Build Coastguard Worker             << "us, Standard error of mean: " << unbatchedStats.standardErrorOfMean << "us("
909*35238bceSAndroid Build Coastguard Worker             << (unbatchedStats.standardErrorOfMean / unbatchedStats.mean) << ")" << TestLog::EndMessage;
910*35238bceSAndroid Build Coastguard Worker 
911*35238bceSAndroid Build Coastguard Worker         if (m_sampleIteration > 2 ||
912*35238bceSAndroid Build Coastguard Worker             (m_sampleIteration > 0 && (unbatchedStats.standardErrorOfMean / unbatchedStats.mean) +
913*35238bceSAndroid Build Coastguard Worker                                               (batchedStats.standardErrorOfMean / batchedStats.mean) <=
914*35238bceSAndroid Build Coastguard Worker                                           2.0 * limitSEM))
915*35238bceSAndroid Build Coastguard Worker         {
916*35238bceSAndroid Build Coastguard Worker             if (m_sampleIteration > 2)
917*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Maximum iteration count reached." << TestLog::EndMessage;
918*35238bceSAndroid Build Coastguard Worker 
919*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Standard errors in target range." << TestLog::EndMessage;
920*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Batched/Unbatched ratio: " << (batchedStats.mean / unbatchedStats.mean)
921*35238bceSAndroid Build Coastguard Worker                 << TestLog::EndMessage;
922*35238bceSAndroid Build Coastguard Worker 
923*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS,
924*35238bceSAndroid Build Coastguard Worker                                     de::floatToString((float)(batchedStats.mean / unbatchedStats.mean), 1).c_str());
925*35238bceSAndroid Build Coastguard Worker             return STOP;
926*35238bceSAndroid Build Coastguard Worker         }
927*35238bceSAndroid Build Coastguard Worker         else
928*35238bceSAndroid Build Coastguard Worker         {
929*35238bceSAndroid Build Coastguard Worker             if ((unbatchedStats.standardErrorOfMean / unbatchedStats.mean) > targetSEM)
930*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Unbatched standard error of mean outside of range." << TestLog::EndMessage;
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker             if ((batchedStats.standardErrorOfMean / batchedStats.mean) > targetSEM)
933*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Batched standard error of mean outside of range." << TestLog::EndMessage;
934*35238bceSAndroid Build Coastguard Worker 
935*35238bceSAndroid Build Coastguard Worker             if (unbatchedStats.standardDeviation > 0.0)
936*35238bceSAndroid Build Coastguard Worker             {
937*35238bceSAndroid Build Coastguard Worker                 double x               = (unbatchedStats.standardDeviation / unbatchedStats.mean) / targetSEM;
938*35238bceSAndroid Build Coastguard Worker                 m_unbatchedSampleCount = std::max((int)m_unbatchedSamplesUs.size(), (int)(x * x));
939*35238bceSAndroid Build Coastguard Worker             }
940*35238bceSAndroid Build Coastguard Worker             else
941*35238bceSAndroid Build Coastguard Worker                 m_unbatchedSampleCount = (int)m_unbatchedSamplesUs.size();
942*35238bceSAndroid Build Coastguard Worker 
943*35238bceSAndroid Build Coastguard Worker             if (batchedStats.standardDeviation > 0.0)
944*35238bceSAndroid Build Coastguard Worker             {
945*35238bceSAndroid Build Coastguard Worker                 double x             = (batchedStats.standardDeviation / batchedStats.mean) / targetSEM;
946*35238bceSAndroid Build Coastguard Worker                 m_batchedSampleCount = std::max((int)m_batchedSamplesUs.size(), (int)(x * x));
947*35238bceSAndroid Build Coastguard Worker             }
948*35238bceSAndroid Build Coastguard Worker             else
949*35238bceSAndroid Build Coastguard Worker                 m_batchedSampleCount = (int)m_batchedSamplesUs.size();
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker             m_batchedSamplesUs.clear();
952*35238bceSAndroid Build Coastguard Worker             m_unbatchedSamplesUs.clear();
953*35238bceSAndroid Build Coastguard Worker 
954*35238bceSAndroid Build Coastguard Worker             m_sampleIteration++;
955*35238bceSAndroid Build Coastguard Worker             m_state = STATE_SAMPLE;
956*35238bceSAndroid Build Coastguard Worker         }
957*35238bceSAndroid Build Coastguard Worker     }
958*35238bceSAndroid Build Coastguard Worker     else
959*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
960*35238bceSAndroid Build Coastguard Worker 
961*35238bceSAndroid Build Coastguard Worker     return CONTINUE;
962*35238bceSAndroid Build Coastguard Worker }
963*35238bceSAndroid Build Coastguard Worker 
specToName(const DrawCallBatchingTest::TestSpec & spec)964*35238bceSAndroid Build Coastguard Worker string specToName(const DrawCallBatchingTest::TestSpec &spec)
965*35238bceSAndroid Build Coastguard Worker {
966*35238bceSAndroid Build Coastguard Worker     std::ostringstream stream;
967*35238bceSAndroid Build Coastguard Worker 
968*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!spec.useStaticBuffer || spec.staticAttributeCount > 0);
969*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!spec.useDynamicBuffer || spec.dynamicAttributeCount > 0);
970*35238bceSAndroid Build Coastguard Worker 
971*35238bceSAndroid Build Coastguard Worker     if (spec.staticAttributeCount > 0)
972*35238bceSAndroid Build Coastguard Worker         stream << spec.staticAttributeCount << "_static_";
973*35238bceSAndroid Build Coastguard Worker 
974*35238bceSAndroid Build Coastguard Worker     if (spec.useStaticBuffer)
975*35238bceSAndroid Build Coastguard Worker         stream << (spec.staticAttributeCount == 1 ? "buffer_" : "buffers_");
976*35238bceSAndroid Build Coastguard Worker 
977*35238bceSAndroid Build Coastguard Worker     if (spec.dynamicAttributeCount > 0)
978*35238bceSAndroid Build Coastguard Worker         stream << spec.dynamicAttributeCount << "_dynamic_";
979*35238bceSAndroid Build Coastguard Worker 
980*35238bceSAndroid Build Coastguard Worker     if (spec.useDynamicBuffer)
981*35238bceSAndroid Build Coastguard Worker         stream << (spec.dynamicAttributeCount == 1 ? "buffer_" : "buffers_");
982*35238bceSAndroid Build Coastguard Worker 
983*35238bceSAndroid Build Coastguard Worker     stream << spec.triangleCount << "_triangles";
984*35238bceSAndroid Build Coastguard Worker 
985*35238bceSAndroid Build Coastguard Worker     return stream.str();
986*35238bceSAndroid Build Coastguard Worker }
987*35238bceSAndroid Build Coastguard Worker 
specToDescrpition(const DrawCallBatchingTest::TestSpec & spec)988*35238bceSAndroid Build Coastguard Worker string specToDescrpition(const DrawCallBatchingTest::TestSpec &spec)
989*35238bceSAndroid Build Coastguard Worker {
990*35238bceSAndroid Build Coastguard Worker     DE_UNREF(spec);
991*35238bceSAndroid Build Coastguard Worker     return "Test performance of batched rendering against non-batched rendering.";
992*35238bceSAndroid Build Coastguard Worker }
993*35238bceSAndroid Build Coastguard Worker 
994*35238bceSAndroid Build Coastguard Worker } // namespace
995*35238bceSAndroid Build Coastguard Worker 
DrawCallBatchingTests(Context & context)996*35238bceSAndroid Build Coastguard Worker DrawCallBatchingTests::DrawCallBatchingTests(Context &context)
997*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "draw_call_batching", "Draw call batching performance tests.")
998*35238bceSAndroid Build Coastguard Worker {
999*35238bceSAndroid Build Coastguard Worker }
1000*35238bceSAndroid Build Coastguard Worker 
~DrawCallBatchingTests(void)1001*35238bceSAndroid Build Coastguard Worker DrawCallBatchingTests::~DrawCallBatchingTests(void)
1002*35238bceSAndroid Build Coastguard Worker {
1003*35238bceSAndroid Build Coastguard Worker }
1004*35238bceSAndroid Build Coastguard Worker 
init(void)1005*35238bceSAndroid Build Coastguard Worker void DrawCallBatchingTests::init(void)
1006*35238bceSAndroid Build Coastguard Worker {
1007*35238bceSAndroid Build Coastguard Worker     int drawCallCounts[] = {10, 100};
1008*35238bceSAndroid Build Coastguard Worker 
1009*35238bceSAndroid Build Coastguard Worker     int triangleCounts[] = {2, 10};
1010*35238bceSAndroid Build Coastguard Worker 
1011*35238bceSAndroid Build Coastguard Worker     int staticAttributeCounts[] = {1, 0, 4, 8, 0};
1012*35238bceSAndroid Build Coastguard Worker 
1013*35238bceSAndroid Build Coastguard Worker     int dynamicAttributeCounts[] = {0, 1, 4, 0, 8};
1014*35238bceSAndroid Build Coastguard Worker 
1015*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(staticAttributeCounts) == DE_LENGTH_OF_ARRAY(dynamicAttributeCounts));
1016*35238bceSAndroid Build Coastguard Worker 
1017*35238bceSAndroid Build Coastguard Worker     for (int drawType = 0; drawType < 2; drawType++)
1018*35238bceSAndroid Build Coastguard Worker     {
1019*35238bceSAndroid Build Coastguard Worker         bool drawElements = (drawType == 1);
1020*35238bceSAndroid Build Coastguard Worker 
1021*35238bceSAndroid Build Coastguard Worker         for (int indexBufferNdx = 0; indexBufferNdx < 2; indexBufferNdx++)
1022*35238bceSAndroid Build Coastguard Worker         {
1023*35238bceSAndroid Build Coastguard Worker             bool useIndexBuffer = (indexBufferNdx == 1);
1024*35238bceSAndroid Build Coastguard Worker 
1025*35238bceSAndroid Build Coastguard Worker             if (useIndexBuffer && !drawElements)
1026*35238bceSAndroid Build Coastguard Worker                 continue;
1027*35238bceSAndroid Build Coastguard Worker 
1028*35238bceSAndroid Build Coastguard Worker             for (int dynamicIndexNdx = 0; dynamicIndexNdx < 2; dynamicIndexNdx++)
1029*35238bceSAndroid Build Coastguard Worker             {
1030*35238bceSAndroid Build Coastguard Worker                 bool dynamicIndices = (dynamicIndexNdx == 1);
1031*35238bceSAndroid Build Coastguard Worker 
1032*35238bceSAndroid Build Coastguard Worker                 if (dynamicIndices && !drawElements)
1033*35238bceSAndroid Build Coastguard Worker                     continue;
1034*35238bceSAndroid Build Coastguard Worker 
1035*35238bceSAndroid Build Coastguard Worker                 if (dynamicIndices && !useIndexBuffer)
1036*35238bceSAndroid Build Coastguard Worker                     continue;
1037*35238bceSAndroid Build Coastguard Worker 
1038*35238bceSAndroid Build Coastguard Worker                 TestCaseGroup *drawTypeGroup = new TestCaseGroup(
1039*35238bceSAndroid Build Coastguard Worker                     m_context,
1040*35238bceSAndroid Build Coastguard Worker                     (string(dynamicIndices ? "dynamic_" : "") + (useIndexBuffer ? "buffer_" : "") +
1041*35238bceSAndroid Build Coastguard Worker                      (drawElements ? "draw_elements" : "draw_arrays"))
1042*35238bceSAndroid Build Coastguard Worker                         .c_str(),
1043*35238bceSAndroid Build Coastguard Worker                     (string("Test batched rendering with ") + (drawElements ? "draw_elements" : "draw_arrays"))
1044*35238bceSAndroid Build Coastguard Worker                         .c_str());
1045*35238bceSAndroid Build Coastguard Worker 
1046*35238bceSAndroid Build Coastguard Worker                 addChild(drawTypeGroup);
1047*35238bceSAndroid Build Coastguard Worker 
1048*35238bceSAndroid Build Coastguard Worker                 for (int drawCallCountNdx = 0; drawCallCountNdx < DE_LENGTH_OF_ARRAY(drawCallCounts);
1049*35238bceSAndroid Build Coastguard Worker                      drawCallCountNdx++)
1050*35238bceSAndroid Build Coastguard Worker                 {
1051*35238bceSAndroid Build Coastguard Worker                     int drawCallCount = drawCallCounts[drawCallCountNdx];
1052*35238bceSAndroid Build Coastguard Worker 
1053*35238bceSAndroid Build Coastguard Worker                     TestCaseGroup *callCountGroup = new TestCaseGroup(
1054*35238bceSAndroid Build Coastguard Worker                         m_context, (de::toString(drawCallCount) + (drawCallCount == 1 ? "_draw" : "_draws")).c_str(),
1055*35238bceSAndroid Build Coastguard Worker                         ("Test batched rendering performance with " + de::toString(drawCallCount) + " draw calls.")
1056*35238bceSAndroid Build Coastguard Worker                             .c_str());
1057*35238bceSAndroid Build Coastguard Worker                     TestCaseGroup *attributeCount1Group =
1058*35238bceSAndroid Build Coastguard Worker                         new TestCaseGroup(m_context, "1_attribute", "Test draw call batching with 1 attribute.");
1059*35238bceSAndroid Build Coastguard Worker                     TestCaseGroup *attributeCount8Group =
1060*35238bceSAndroid Build Coastguard Worker                         new TestCaseGroup(m_context, "8_attributes", "Test draw call batching with 8 attributes.");
1061*35238bceSAndroid Build Coastguard Worker 
1062*35238bceSAndroid Build Coastguard Worker                     callCountGroup->addChild(attributeCount1Group);
1063*35238bceSAndroid Build Coastguard Worker                     callCountGroup->addChild(attributeCount8Group);
1064*35238bceSAndroid Build Coastguard Worker 
1065*35238bceSAndroid Build Coastguard Worker                     drawTypeGroup->addChild(callCountGroup);
1066*35238bceSAndroid Build Coastguard Worker 
1067*35238bceSAndroid Build Coastguard Worker                     for (int attributeCountNdx = 0; attributeCountNdx < DE_LENGTH_OF_ARRAY(dynamicAttributeCounts);
1068*35238bceSAndroid Build Coastguard Worker                          attributeCountNdx++)
1069*35238bceSAndroid Build Coastguard Worker                     {
1070*35238bceSAndroid Build Coastguard Worker                         TestCaseGroup *attributeCountGroup = NULL;
1071*35238bceSAndroid Build Coastguard Worker 
1072*35238bceSAndroid Build Coastguard Worker                         int staticAttributeCount  = staticAttributeCounts[attributeCountNdx];
1073*35238bceSAndroid Build Coastguard Worker                         int dynamicAttributeCount = dynamicAttributeCounts[attributeCountNdx];
1074*35238bceSAndroid Build Coastguard Worker 
1075*35238bceSAndroid Build Coastguard Worker                         if (staticAttributeCount + dynamicAttributeCount == 1)
1076*35238bceSAndroid Build Coastguard Worker                             attributeCountGroup = attributeCount1Group;
1077*35238bceSAndroid Build Coastguard Worker                         else if (staticAttributeCount + dynamicAttributeCount == 8)
1078*35238bceSAndroid Build Coastguard Worker                             attributeCountGroup = attributeCount8Group;
1079*35238bceSAndroid Build Coastguard Worker                         else
1080*35238bceSAndroid Build Coastguard Worker                             DE_ASSERT(false);
1081*35238bceSAndroid Build Coastguard Worker 
1082*35238bceSAndroid Build Coastguard Worker                         for (int triangleCountNdx = 0; triangleCountNdx < DE_LENGTH_OF_ARRAY(triangleCounts);
1083*35238bceSAndroid Build Coastguard Worker                              triangleCountNdx++)
1084*35238bceSAndroid Build Coastguard Worker                         {
1085*35238bceSAndroid Build Coastguard Worker                             int triangleCount = triangleCounts[triangleCountNdx];
1086*35238bceSAndroid Build Coastguard Worker 
1087*35238bceSAndroid Build Coastguard Worker                             for (int dynamicBufferNdx = 0; dynamicBufferNdx < 2; dynamicBufferNdx++)
1088*35238bceSAndroid Build Coastguard Worker                             {
1089*35238bceSAndroid Build Coastguard Worker                                 bool useDynamicBuffer = (dynamicBufferNdx != 0);
1090*35238bceSAndroid Build Coastguard Worker 
1091*35238bceSAndroid Build Coastguard Worker                                 for (int staticBufferNdx = 0; staticBufferNdx < 2; staticBufferNdx++)
1092*35238bceSAndroid Build Coastguard Worker                                 {
1093*35238bceSAndroid Build Coastguard Worker                                     bool useStaticBuffer = (staticBufferNdx != 0);
1094*35238bceSAndroid Build Coastguard Worker 
1095*35238bceSAndroid Build Coastguard Worker                                     DrawCallBatchingTest::TestSpec spec;
1096*35238bceSAndroid Build Coastguard Worker 
1097*35238bceSAndroid Build Coastguard Worker                                     spec.useStaticBuffer      = useStaticBuffer;
1098*35238bceSAndroid Build Coastguard Worker                                     spec.staticAttributeCount = staticAttributeCount;
1099*35238bceSAndroid Build Coastguard Worker 
1100*35238bceSAndroid Build Coastguard Worker                                     spec.useDynamicBuffer      = useDynamicBuffer;
1101*35238bceSAndroid Build Coastguard Worker                                     spec.dynamicAttributeCount = dynamicAttributeCount;
1102*35238bceSAndroid Build Coastguard Worker 
1103*35238bceSAndroid Build Coastguard Worker                                     spec.drawCallCount = drawCallCount;
1104*35238bceSAndroid Build Coastguard Worker                                     spec.triangleCount = triangleCount;
1105*35238bceSAndroid Build Coastguard Worker 
1106*35238bceSAndroid Build Coastguard Worker                                     spec.useDrawElements = drawElements;
1107*35238bceSAndroid Build Coastguard Worker                                     spec.useIndexBuffer  = useIndexBuffer;
1108*35238bceSAndroid Build Coastguard Worker                                     spec.dynamicIndices  = dynamicIndices;
1109*35238bceSAndroid Build Coastguard Worker 
1110*35238bceSAndroid Build Coastguard Worker                                     if (spec.useStaticBuffer && spec.staticAttributeCount == 0)
1111*35238bceSAndroid Build Coastguard Worker                                         continue;
1112*35238bceSAndroid Build Coastguard Worker 
1113*35238bceSAndroid Build Coastguard Worker                                     if (spec.useDynamicBuffer && spec.dynamicAttributeCount == 0)
1114*35238bceSAndroid Build Coastguard Worker                                         continue;
1115*35238bceSAndroid Build Coastguard Worker 
1116*35238bceSAndroid Build Coastguard Worker                                     attributeCountGroup->addChild(new DrawCallBatchingTest(
1117*35238bceSAndroid Build Coastguard Worker                                         m_context, specToName(spec).c_str(), specToDescrpition(spec).c_str(), spec));
1118*35238bceSAndroid Build Coastguard Worker                                 }
1119*35238bceSAndroid Build Coastguard Worker                             }
1120*35238bceSAndroid Build Coastguard Worker                         }
1121*35238bceSAndroid Build Coastguard Worker                     }
1122*35238bceSAndroid Build Coastguard Worker                 }
1123*35238bceSAndroid Build Coastguard Worker             }
1124*35238bceSAndroid Build Coastguard Worker         }
1125*35238bceSAndroid Build Coastguard Worker     }
1126*35238bceSAndroid Build Coastguard Worker }
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker } // namespace Performance
1129*35238bceSAndroid Build Coastguard Worker } // namespace gles2
1130*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1131