xref: /aosp_15_r20/external/deqp/modules/gles2/performance/es2pRedundantStateChangeTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 2.0 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Redundant state change performance tests.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "es2pRedundantStateChangeTests.hpp"
25 #include "glsStateChangePerfTestCases.hpp"
26 #include "gluShaderProgram.hpp"
27 #include "glwFunctions.hpp"
28 #include "glwEnums.hpp"
29 
30 namespace deqp
31 {
32 namespace gles2
33 {
34 namespace Performance
35 {
36 
37 using namespace glw; // GL types
38 
39 namespace
40 {
41 
42 enum
43 {
44     VIEWPORT_WIDTH  = 24,
45     VIEWPORT_HEIGHT = 24
46 };
47 
48 class RedundantStateChangeCase : public gls::StateChangePerformanceCase
49 {
50 public:
51     RedundantStateChangeCase(Context &context, int drawCallCount, int triangleCount, bool drawArrays,
52                              bool useIndexBuffer, const char *name, const char *description);
53     ~RedundantStateChangeCase(void);
54 
55 protected:
56     virtual void renderTest(const glw::Functions &gl);
57     virtual void renderReference(const glw::Functions &gl);
58     virtual void changeState(const glw::Functions &gl) = 0;
59 };
60 
RedundantStateChangeCase(Context & context,int drawCallCount,int triangleCount,bool drawArrays,bool useIndexBuffer,const char * name,const char * description)61 RedundantStateChangeCase::RedundantStateChangeCase(Context &context, int drawCallCount, int triangleCount,
62                                                    bool drawArrays, bool useIndexBuffer, const char *name,
63                                                    const char *description)
64     : gls::StateChangePerformanceCase(context.getTestContext(), context.getRenderContext(), name, description,
65                                       (useIndexBuffer ? DRAWTYPE_INDEXED_BUFFER :
66                                        drawArrays     ? DRAWTYPE_NOT_INDEXED :
67                                                         DRAWTYPE_INDEXED_USER_PTR),
68                                       drawCallCount, triangleCount)
69 {
70     DE_ASSERT(!useIndexBuffer || !drawArrays);
71 }
72 
~RedundantStateChangeCase(void)73 RedundantStateChangeCase::~RedundantStateChangeCase(void)
74 {
75 }
76 
renderTest(const glw::Functions & gl)77 void RedundantStateChangeCase::renderTest(const glw::Functions &gl)
78 {
79     for (int callNdx = 0; callNdx < m_callCount; callNdx++)
80     {
81         changeState(gl);
82         callDraw(gl);
83     }
84 }
85 
renderReference(const glw::Functions & gl)86 void RedundantStateChangeCase::renderReference(const glw::Functions &gl)
87 {
88     changeState(gl);
89 
90     for (int callNdx = 0; callNdx < m_callCount; callNdx++)
91         callDraw(gl);
92 }
93 
94 } // namespace
95 
RedundantStateChangeTests(Context & context)96 RedundantStateChangeTests::RedundantStateChangeTests(Context &context)
97     : TestCaseGroup(context, "redundant_state_change_draw",
98                     "Test performance with redundant sate changes between rendering.")
99 {
100 }
101 
~RedundantStateChangeTests(void)102 RedundantStateChangeTests::~RedundantStateChangeTests(void)
103 {
104 }
105 
106 #define MACRO_BLOCK(...) __VA_ARGS__
107 
108 #define ADD_TESTCASE(NAME, DESC, DRAWARRAYS, INDEXBUFFER, INIT_FUNC, CHANGE_FUNC)                                     \
109     do                                                                                                                \
110     {                                                                                                                 \
111         class RedundantStateChangeCase_##NAME : public RedundantStateChangeCase                                       \
112         {                                                                                                             \
113         public:                                                                                                       \
114             RedundantStateChangeCase_##NAME(Context &context, int drawCallCount, int triangleCount, const char *name, \
115                                             const char *description)                                                  \
116                 : RedundantStateChangeCase(context, drawCallCount, triangleCount, (DRAWARRAYS), (INDEXBUFFER), name,  \
117                                            description)                                                               \
118             {                                                                                                         \
119             }                                                                                                         \
120             virtual void setupInitialState(const glw::Functions &gl)                                                  \
121             {                                                                                                         \
122                 INIT_FUNC                                                                                             \
123             }                                                                                                         \
124             virtual void changeState(const glw::Functions &gl)                                                        \
125             {                                                                                                         \
126                 CHANGE_FUNC                                                                                           \
127             }                                                                                                         \
128         };                                                                                                            \
129         manySmallCallsGroup->addChild(new RedundantStateChangeCase_##NAME(m_context, 1000, 2, #NAME, (DESC)));        \
130         fewBigCallsGroup->addChild(new RedundantStateChangeCase_##NAME(m_context, 10, 200, #NAME, (DESC)));           \
131     } while (0);
132 
init(void)133 void RedundantStateChangeTests::init(void)
134 {
135     tcu::TestCaseGroup *const manySmallCallsGroup =
136         new tcu::TestCaseGroup(m_testCtx, "many_small_calls", "1000 calls, 2 triangles in each");
137     tcu::TestCaseGroup *const fewBigCallsGroup =
138         new tcu::TestCaseGroup(m_testCtx, "few_big_calls", "10 calls, 200 triangles in each");
139 
140     addChild(manySmallCallsGroup);
141     addChild(fewBigCallsGroup);
142 
143     ADD_TESTCASE(blend, "Enable/Disable blending.", true, false, MACRO_BLOCK({
144                      requireCoordBuffers(1);
145                      requireTextures(1);
146                      requirePrograms(1);
147 
148                      gl.useProgram(m_programs[0]->getProgram());
149                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
150                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
151                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
152 
153                      gl.enableVertexAttribArray(coordLoc);
154                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
155                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
156                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
157                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
158                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
159 
160                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
161                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
162 
163                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
164                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
165 
166                      gl.uniform1i(samplerLoc, 0);
167                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
168 
169                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
170                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
171                  }),
172                  MACRO_BLOCK({ gl.enable(GL_BLEND); }))
173 
174     ADD_TESTCASE(depth_test, "Enable/Disable depth test.", true, false, MACRO_BLOCK({
175                      requireCoordBuffers(1);
176                      requireTextures(1);
177                      requirePrograms(1);
178 
179                      gl.useProgram(m_programs[0]->getProgram());
180                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
181 
182                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
183                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
184 
185                      gl.enableVertexAttribArray(coordLoc);
186                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
187 
188                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
189                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
190                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
191                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
192 
193                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
194                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
195 
196                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
197                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
198 
199                      gl.uniform1i(samplerLoc, 0);
200                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
201 
202                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
203                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
204 
205                      gl.depthFunc(GL_LEQUAL);
206                      GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
207                  }),
208                  MACRO_BLOCK({ gl.enable(GL_DEPTH_TEST); }))
209 
210     ADD_TESTCASE(stencil_test, "Enable/Disable stencil test.", true, false, MACRO_BLOCK({
211                      requireCoordBuffers(1);
212                      requireTextures(1);
213                      requirePrograms(1);
214 
215                      gl.useProgram(m_programs[0]->getProgram());
216                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
217                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
218                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
219 
220                      gl.enableVertexAttribArray(coordLoc);
221                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
222                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
223                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
224                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
225                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
226 
227                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
228                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
229 
230                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
231                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
232 
233                      gl.uniform1i(samplerLoc, 0);
234                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
235 
236                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
237                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
238 
239                      gl.stencilFunc(GL_LEQUAL, 0, 0);
240                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
241 
242                      gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
243                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
244 
245                      gl.clearStencil(0);
246                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
247                      gl.clear(GL_STENCIL_BUFFER_BIT);
248 
249                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
250                  }),
251                  MACRO_BLOCK({ gl.enable(GL_STENCIL_TEST); }))
252 
253     ADD_TESTCASE(scissor_test, "Enable/Disable scissor test.", true, false, MACRO_BLOCK({
254                      requireCoordBuffers(1);
255                      requireTextures(1);
256                      requirePrograms(1);
257 
258                      gl.useProgram(m_programs[0]->getProgram());
259                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
260                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
261                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
262 
263                      gl.enableVertexAttribArray(coordLoc);
264                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
265                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
266                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
267                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
268                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
269 
270                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
271                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
272 
273                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
274                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
275 
276                      gl.uniform1i(samplerLoc, 0);
277                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
278 
279                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
280                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
281 
282                      gl.scissor(2, 3, 12, 13);
283                      GLU_EXPECT_NO_ERROR(gl.getError(), "glScissor()");
284                  }),
285                  MACRO_BLOCK({ gl.enable(GL_SCISSOR_TEST); }))
286 
287     ADD_TESTCASE(dither, "Enable/Disable dithering.", true, false, MACRO_BLOCK({
288                      requireCoordBuffers(1);
289                      requireTextures(1);
290                      requirePrograms(1);
291 
292                      gl.useProgram(m_programs[0]->getProgram());
293                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
294                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
295                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
296 
297                      gl.enableVertexAttribArray(coordLoc);
298                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
299                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
300                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
301                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
302                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
303 
304                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
305                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
306 
307                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
308                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
309 
310                      gl.uniform1i(samplerLoc, 0);
311                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
312 
313                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
314                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
315                  }),
316                  MACRO_BLOCK({ gl.enable(GL_DITHER); }))
317 
318     ADD_TESTCASE(culling, "Enable/Disable culling.", true, false, MACRO_BLOCK({
319                      requireCoordBuffers(1);
320                      requireTextures(1);
321                      requirePrograms(1);
322 
323                      gl.useProgram(m_programs[0]->getProgram());
324                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
325                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
326                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
327 
328                      gl.enableVertexAttribArray(coordLoc);
329                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
330                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
331                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
332                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
333                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
334 
335                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
336                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
337 
338                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
339                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
340 
341                      gl.uniform1i(samplerLoc, 0);
342                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
343 
344                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
345                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
346 
347                      gl.frontFace(GL_CW);
348                      GLU_EXPECT_NO_ERROR(gl.getError(), "glFrontFace()");
349 
350                      gl.cullFace(GL_FRONT);
351                      GLU_EXPECT_NO_ERROR(gl.getError(), "glCullFace()");
352                  }),
353                  MACRO_BLOCK({ gl.enable(GL_CULL_FACE); }))
354 
355     ADD_TESTCASE(depth_func, "Change depth func.", true, false, MACRO_BLOCK({
356                      requireCoordBuffers(1);
357                      requireTextures(1);
358                      requirePrograms(1);
359 
360                      gl.useProgram(m_programs[0]->getProgram());
361                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
362                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
363                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
364 
365                      gl.enableVertexAttribArray(coordLoc);
366                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
367                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
368                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
369                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
370                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
371 
372                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
373                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
374 
375                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
376                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
377 
378                      gl.uniform1i(samplerLoc, 0);
379                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
380 
381                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
382                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
383 
384                      gl.enable(GL_DEPTH_TEST);
385                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
386                  }),
387                  MACRO_BLOCK({ gl.depthFunc(GL_GEQUAL); }))
388 
389     ADD_TESTCASE(depth_mask, "Toggle depth mask.", true, false, MACRO_BLOCK({
390                      requireCoordBuffers(1);
391                      requireTextures(1);
392                      requirePrograms(1);
393 
394                      gl.useProgram(m_programs[0]->getProgram());
395                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
396                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
397                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
398 
399                      gl.enableVertexAttribArray(coordLoc);
400                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
401                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
402                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
403                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
404                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
405 
406                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
407                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
408 
409                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
410                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
411 
412                      gl.uniform1i(samplerLoc, 0);
413                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
414 
415                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
416                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
417 
418                      gl.enable(GL_DEPTH_TEST);
419                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
420 
421                      gl.depthFunc(GL_LEQUAL);
422                      GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
423                  }),
424                  MACRO_BLOCK({ gl.depthMask(GL_FALSE); }))
425 
426     ADD_TESTCASE(depth_rangef, "Change depth range.", true, false, MACRO_BLOCK({
427                      requireCoordBuffers(1);
428                      requireTextures(1);
429                      requirePrograms(1);
430 
431                      gl.useProgram(m_programs[0]->getProgram());
432                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
433                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
434                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
435 
436                      gl.enableVertexAttribArray(coordLoc);
437                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
438                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
439                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
440                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
441                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
442 
443                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
444                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
445 
446                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
447                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
448 
449                      gl.uniform1i(samplerLoc, 0);
450                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
451 
452                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
453                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
454                  }),
455                  MACRO_BLOCK({ gl.depthRangef(0.0f, 1.0f); }))
456 
457     ADD_TESTCASE(blend_equation, "Change blend equation.", true, false, MACRO_BLOCK({
458                      requireCoordBuffers(1);
459                      requireTextures(1);
460                      requirePrograms(1);
461 
462                      gl.useProgram(m_programs[0]->getProgram());
463                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
464                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
465                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
466 
467                      gl.enableVertexAttribArray(coordLoc);
468                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
469                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
470                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
471                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
472                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
473 
474                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
475                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
476 
477                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
478                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
479 
480                      gl.uniform1i(samplerLoc, 0);
481                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
482 
483                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
484                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
485 
486                      gl.enable(GL_BLEND);
487                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
488                  }),
489                  MACRO_BLOCK({ gl.blendEquation(GL_FUNC_SUBTRACT); }))
490 
491     ADD_TESTCASE(blend_func, "Change blend function.", true, false, MACRO_BLOCK({
492                      requireCoordBuffers(1);
493                      requireTextures(1);
494                      requirePrograms(1);
495 
496                      gl.useProgram(m_programs[0]->getProgram());
497                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
498                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
499                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
500 
501                      gl.enableVertexAttribArray(coordLoc);
502                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
503                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
504                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
505                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
506                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
507 
508                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
509                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
510 
511                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
512                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
513 
514                      gl.uniform1i(samplerLoc, 0);
515                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
516 
517                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
518                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
519 
520                      gl.enable(GL_BLEND);
521                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
522                  }),
523                  MACRO_BLOCK({ gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }))
524 
525     ADD_TESTCASE(polygon_offset, "Change polygon offset.", true, false, MACRO_BLOCK({
526                      requireCoordBuffers(1);
527                      requireTextures(1);
528                      requirePrograms(1);
529 
530                      gl.useProgram(m_programs[0]->getProgram());
531                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
532                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
533                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
534 
535                      gl.enableVertexAttribArray(coordLoc);
536                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
537                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
538                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
539                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
540                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
541 
542                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
543                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
544 
545                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
546                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
547 
548                      gl.uniform1i(samplerLoc, 0);
549                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
550 
551                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
552                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
553 
554                      gl.enable(GL_POLYGON_OFFSET_FILL);
555                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
556                  }),
557                  MACRO_BLOCK({ gl.polygonOffset(0.0f, 0.0f); }))
558 
559     ADD_TESTCASE(sample_coverage, "Sample coverage.", true, false, MACRO_BLOCK({
560                      requireCoordBuffers(1);
561                      requireTextures(1);
562                      requirePrograms(1);
563 
564                      gl.useProgram(m_programs[0]->getProgram());
565                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
566                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
567                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
568 
569                      gl.enableVertexAttribArray(coordLoc);
570                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
571                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
572                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
573                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
574                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
575 
576                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
577                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
578 
579                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
580                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
581 
582                      gl.uniform1i(samplerLoc, 0);
583                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
584 
585                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
586                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
587                  }),
588                  MACRO_BLOCK({ gl.sampleCoverage(0.25f, GL_TRUE); }))
589 
590     ADD_TESTCASE(viewport, "Change viewport.", true, false, MACRO_BLOCK({
591                      requireCoordBuffers(1);
592                      requireTextures(1);
593                      requirePrograms(1);
594 
595                      gl.useProgram(m_programs[0]->getProgram());
596                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
597                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
598                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
599 
600                      gl.enableVertexAttribArray(coordLoc);
601                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
602                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
603                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
604                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
605                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
606 
607                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
608                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
609 
610                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
611                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
612 
613                      gl.uniform1i(samplerLoc, 0);
614                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
615 
616                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
617                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
618                  }),
619                  MACRO_BLOCK({ gl.viewport(10, 11, 5, 6); }))
620 
621     ADD_TESTCASE(scissor, "Change scissor box.", true, false, MACRO_BLOCK({
622                      requireCoordBuffers(1);
623                      requireTextures(1);
624                      requirePrograms(1);
625 
626                      gl.useProgram(m_programs[0]->getProgram());
627                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
628                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
629                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
630 
631                      gl.enableVertexAttribArray(coordLoc);
632                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
633                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
634                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
635                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
636                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
637 
638                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
639                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
640 
641                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
642                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
643 
644                      gl.uniform1i(samplerLoc, 0);
645                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
646 
647                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
648                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
649 
650                      gl.enable(GL_SCISSOR_TEST);
651                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
652                  }),
653                  MACRO_BLOCK({ gl.scissor(17, 13, 5, 8); }))
654 
655     ADD_TESTCASE(color_mask, "Change color mask.", true, false, MACRO_BLOCK({
656                      requireCoordBuffers(1);
657                      requireTextures(1);
658                      requirePrograms(1);
659 
660                      gl.useProgram(m_programs[0]->getProgram());
661                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
662                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
663                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
664 
665                      gl.enableVertexAttribArray(coordLoc);
666                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
667                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
668                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
669                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
670                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
671 
672                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
673                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
674 
675                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
676                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
677 
678                      gl.uniform1i(samplerLoc, 0);
679                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
680 
681                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
682                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
683                  }),
684                  MACRO_BLOCK({ gl.colorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); }))
685 
686     ADD_TESTCASE(cull_face, "Change culling mode.", true, false, MACRO_BLOCK({
687                      requireCoordBuffers(1);
688                      requireTextures(1);
689                      requirePrograms(1);
690 
691                      gl.useProgram(m_programs[0]->getProgram());
692                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
693                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
694                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
695 
696                      gl.enableVertexAttribArray(coordLoc);
697                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
698                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
699                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
700                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
701                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
702 
703                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
704                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
705 
706                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
707                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
708 
709                      gl.uniform1i(samplerLoc, 0);
710                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
711 
712                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
713                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
714 
715                      gl.enable(GL_CULL_FACE);
716                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
717                  }),
718                  MACRO_BLOCK({ gl.cullFace(GL_FRONT); }))
719 
720     ADD_TESTCASE(front_face, "Change front face.", true, false, MACRO_BLOCK({
721                      requireCoordBuffers(1);
722                      requireTextures(1);
723                      requirePrograms(1);
724 
725                      gl.useProgram(m_programs[0]->getProgram());
726                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
727                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
728                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
729 
730                      gl.enableVertexAttribArray(coordLoc);
731                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
732                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
733                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
734                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
735                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
736 
737                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
738                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
739 
740                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
741                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
742 
743                      gl.uniform1i(samplerLoc, 0);
744                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
745 
746                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
747                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
748 
749                      gl.enable(GL_CULL_FACE);
750                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
751                  }),
752                  MACRO_BLOCK({ gl.frontFace(GL_CCW); }))
753 
754     ADD_TESTCASE(stencil_mask, "Change stencil mask.", true, false, MACRO_BLOCK({
755                      requireCoordBuffers(1);
756                      requireTextures(1);
757                      requirePrograms(1);
758 
759                      gl.useProgram(m_programs[0]->getProgram());
760                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
761                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
762                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
763 
764                      gl.enableVertexAttribArray(coordLoc);
765                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
766                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
767                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
768                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
769                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
770 
771                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
772                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
773 
774                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
775                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
776 
777                      gl.uniform1i(samplerLoc, 0);
778                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
779 
780                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
781                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
782 
783                      gl.enable(GL_STENCIL_TEST);
784                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
785 
786                      gl.stencilFunc(GL_LEQUAL, 0, 0);
787                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
788 
789                      gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
790                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
791 
792                      gl.clearStencil(0);
793                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
794                      gl.clear(GL_STENCIL_BUFFER_BIT);
795                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
796                  }),
797                  MACRO_BLOCK({ gl.stencilMask(0xDD); }))
798 
799     ADD_TESTCASE(stencil_func, "Change stencil func.", true, false, MACRO_BLOCK({
800                      requireCoordBuffers(1);
801                      requireTextures(1);
802                      requirePrograms(1);
803 
804                      gl.useProgram(m_programs[0]->getProgram());
805                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
806                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
807                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
808 
809                      gl.enableVertexAttribArray(coordLoc);
810                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
811                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
812                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
813                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
814                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
815 
816                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
817                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
818 
819                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
820                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
821 
822                      gl.uniform1i(samplerLoc, 0);
823                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
824 
825                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
826                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
827 
828                      gl.enable(GL_STENCIL_TEST);
829                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
830 
831                      gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
832                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
833                      gl.clearStencil(0);
834                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
835                      gl.clear(GL_STENCIL_BUFFER_BIT);
836                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
837                  }),
838                  MACRO_BLOCK({ gl.stencilFunc(GL_LEQUAL, 0, 0xFF); }))
839 
840     ADD_TESTCASE(stencil_op, "Change stencil op.", true, false, MACRO_BLOCK({
841                      requireCoordBuffers(1);
842                      requireTextures(1);
843                      requirePrograms(1);
844 
845                      gl.useProgram(m_programs[0]->getProgram());
846                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
847                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
848                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
849 
850                      gl.enableVertexAttribArray(coordLoc);
851                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
852                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
853                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
854                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
855                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
856 
857                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
858                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
859 
860                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
861                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
862 
863                      gl.uniform1i(samplerLoc, 0);
864                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
865 
866                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
867                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
868 
869                      gl.enable(GL_STENCIL_TEST);
870                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
871 
872                      gl.stencilFunc(GL_LEQUAL, 0, 0);
873                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
874 
875                      gl.clearStencil(0);
876                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
877 
878                      gl.clear(GL_STENCIL_BUFFER_BIT);
879                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
880                  }),
881                  MACRO_BLOCK({ gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); }))
882 
883     ADD_TESTCASE(bind_array_buffer, "Change array buffer and refresh vertex attrib pointer.", true, false, MACRO_BLOCK({
884                      requireCoordBuffers(1);
885                      requireTextures(1);
886                      requirePrograms(1);
887 
888                      gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
889                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
890                      gl.linkProgram(m_programs[0]->getProgram());
891                      GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
892 
893                      gl.useProgram(m_programs[0]->getProgram());
894                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
895 
896                      gl.enableVertexAttribArray(0);
897                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
898                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
899                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
900                      gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
901                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
902 
903                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
904                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
905 
906                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
907                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
908 
909                      gl.uniform1i(samplerLoc, 0);
910                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
911 
912                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
913                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
914                  }),
915                  MACRO_BLOCK({
916                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
917                      gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
918                  }))
919 
920     ADD_TESTCASE(element_array_buffer, "Change element array buffer.", false, true, MACRO_BLOCK({
921                      requireCoordBuffers(1);
922                      requireIndexBuffers(1);
923                      requireTextures(1);
924                      requirePrograms(1);
925 
926                      gl.useProgram(m_programs[0]->getProgram());
927                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
928                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
929                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
930 
931                      gl.enableVertexAttribArray(coordLoc);
932                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
933                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
934                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
935                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
936                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
937 
938                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
939                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
940 
941                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
942                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
943 
944                      gl.uniform1i(samplerLoc, 0);
945                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
946 
947                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
948                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
949 
950                      gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]);
951                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
952                  }),
953                  MACRO_BLOCK({ gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); }))
954 
955     ADD_TESTCASE(bind_texture, "Change texture binding.", true, false, MACRO_BLOCK({
956                      requireCoordBuffers(1);
957                      requireTextures(1);
958                      requirePrograms(1);
959 
960                      gl.useProgram(m_programs[0]->getProgram());
961                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
962                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
963                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
964 
965                      gl.enableVertexAttribArray(coordLoc);
966                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
967                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
968                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
969                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
970                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
971 
972                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
973                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
974 
975                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
976                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
977 
978                      gl.uniform1i(samplerLoc, 0);
979                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
980 
981                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
982                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
983                  }),
984                  MACRO_BLOCK({ gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); }))
985 
986     ADD_TESTCASE(use_program, "Change used program.", true, false, MACRO_BLOCK({
987                      requireCoordBuffers(1);
988                      requireTextures(1);
989                      requirePrograms(1);
990 
991                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
992                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
993 
994                      gl.enableVertexAttribArray(coordLoc);
995                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
996                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
997                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
998                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
999                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1000 
1001                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1002                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1003 
1004                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1005                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1006                      gl.useProgram(m_programs[0]->getProgram());
1007                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1008                      gl.uniform1i(samplerLoc, 0);
1009                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1010 
1011                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1012                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1013                  }),
1014                  MACRO_BLOCK({ gl.useProgram(m_programs[0]->getProgram()); }))
1015 
1016     ADD_TESTCASE(tex_parameter_min_filter, "Change texture parameter min filter.", true, false, MACRO_BLOCK({
1017                      requireCoordBuffers(1);
1018                      requireTextures(1);
1019                      requirePrograms(1);
1020 
1021                      gl.useProgram(m_programs[0]->getProgram());
1022                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1023                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1024                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1025 
1026                      gl.enableVertexAttribArray(coordLoc);
1027                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1028                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1029                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1030                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1031                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1032 
1033                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1034                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1035 
1036                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1037                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1038 
1039                      gl.uniform1i(samplerLoc, 0);
1040                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1041 
1042                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1043                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1044                  }),
1045                  MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); }))
1046 
1047     ADD_TESTCASE(tex_parameter_mag_filter, "Change texture parameter mag filter.", true, false, MACRO_BLOCK({
1048                      requireCoordBuffers(1);
1049                      requireTextures(1);
1050                      requirePrograms(1);
1051 
1052                      gl.useProgram(m_programs[0]->getProgram());
1053                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1054                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1055                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1056 
1057                      gl.enableVertexAttribArray(coordLoc);
1058                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1059                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1060                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1061                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1062                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1063 
1064                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1065                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1066 
1067                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1068                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1069 
1070                      gl.uniform1i(samplerLoc, 0);
1071                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1072 
1073                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1074                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1075                  }),
1076                  MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); }))
1077 
1078     ADD_TESTCASE(tex_parameter_wrap, "Change texture parameter wrap filter.", true, false, MACRO_BLOCK({
1079                      requireCoordBuffers(1);
1080                      requireTextures(1);
1081                      requirePrograms(1);
1082 
1083                      gl.useProgram(m_programs[0]->getProgram());
1084                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1085                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1086                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1087 
1088                      gl.enableVertexAttribArray(coordLoc);
1089                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1090                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1091                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1092                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1093                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1094 
1095                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1096                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1097 
1098                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1099                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1100 
1101                      gl.uniform1i(samplerLoc, 0);
1102                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1103 
1104                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1105                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1106                  }),
1107                  MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); }))
1108 
1109     ADD_TESTCASE(bind_framebuffer, "Change framebuffer.", true, false, MACRO_BLOCK({
1110                      requireCoordBuffers(1);
1111                      requireTextures(1);
1112                      requireFramebuffers(1);
1113                      requirePrograms(1);
1114 
1115                      gl.useProgram(m_programs[0]->getProgram());
1116                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1117                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1118                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1119 
1120                      gl.enableVertexAttribArray(coordLoc);
1121                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1122                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1123                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1124                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1125                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1126 
1127                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1128                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1129 
1130                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1131                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1132 
1133                      gl.uniform1i(samplerLoc, 0);
1134                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1135 
1136                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1137                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1138 
1139                      gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]);
1140                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer()");
1141                  }),
1142                  MACRO_BLOCK({ gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); }))
1143 
1144     ADD_TESTCASE(blend_color, "Change blend color.", true, false, MACRO_BLOCK({
1145                      requireCoordBuffers(1);
1146                      requireTextures(1);
1147                      requirePrograms(1);
1148 
1149                      gl.useProgram(m_programs[0]->getProgram());
1150                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1151                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1152                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1153 
1154                      gl.enableVertexAttribArray(coordLoc);
1155                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1156                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1157                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1158                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1159                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1160 
1161                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1162                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1163 
1164                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1165                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1166 
1167                      gl.uniform1i(samplerLoc, 0);
1168                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1169 
1170                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1171                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1172 
1173                      gl.enable(GL_BLEND);
1174                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
1175 
1176                      gl.blendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR);
1177                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBlendFunc()");
1178                  }),
1179                  MACRO_BLOCK({ gl.blendColor(0.75f, 0.75f, 0.75f, 0.75f); }))
1180 }
1181 
1182 } // namespace Performance
1183 } // namespace gles2
1184 } // namespace deqp
1185