xref: /aosp_15_r20/external/deqp/modules/gles3/performance/es3pRedundantStateChangeTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.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 "es3pRedundantStateChangeTests.hpp"
25 #include "glsStateChangePerfTestCases.hpp"
26 #include "gluShaderProgram.hpp"
27 #include "glwFunctions.hpp"
28 #include "glwEnums.hpp"
29 
30 namespace deqp
31 {
32 namespace gles3
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(rasterizer_discard, "Disable RASTERIZER_DISCARD.", 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                  MACRO_BLOCK({ gl.disable(GL_RASTERIZER_DISCARD); }))
385 
386     ADD_TESTCASE(primitive_restart_fixed_index, "Enable PRIMITIVE_RESTART_FIXED_INDEX.", true, false, MACRO_BLOCK({
387                      requireCoordBuffers(1);
388                      requireTextures(1);
389                      requirePrograms(1);
390 
391                      gl.useProgram(m_programs[0]->getProgram());
392                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
393                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
394                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
395 
396                      gl.enableVertexAttribArray(coordLoc);
397                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
398                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
399                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
400                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
401                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
402 
403                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
404                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
405 
406                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
407                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
408 
409                      gl.uniform1i(samplerLoc, 0);
410                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
411 
412                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
413                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
414                  }),
415                  MACRO_BLOCK({ gl.enable(GL_PRIMITIVE_RESTART_FIXED_INDEX); }))
416 
417     ADD_TESTCASE(depth_func, "Change depth func.", true, false, MACRO_BLOCK({
418                      requireCoordBuffers(1);
419                      requireTextures(1);
420                      requirePrograms(1);
421 
422                      gl.useProgram(m_programs[0]->getProgram());
423                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
424                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
425                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
426 
427                      gl.enableVertexAttribArray(coordLoc);
428                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
429                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
430                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
431                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
432                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
433 
434                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
435                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
436 
437                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
438                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
439 
440                      gl.uniform1i(samplerLoc, 0);
441                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
442 
443                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
444                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
445 
446                      gl.enable(GL_DEPTH_TEST);
447                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
448                  }),
449                  MACRO_BLOCK({ gl.depthFunc(GL_GEQUAL); }))
450 
451     ADD_TESTCASE(depth_mask, "Toggle depth mask.", true, false, MACRO_BLOCK({
452                      requireCoordBuffers(1);
453                      requireTextures(1);
454                      requirePrograms(1);
455 
456                      gl.useProgram(m_programs[0]->getProgram());
457                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
458                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
459                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
460 
461                      gl.enableVertexAttribArray(coordLoc);
462                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
463                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
464                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
465                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
466                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
467 
468                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
469                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
470 
471                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
472                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
473 
474                      gl.uniform1i(samplerLoc, 0);
475                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
476 
477                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
478                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
479 
480                      gl.enable(GL_DEPTH_TEST);
481                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
482 
483                      gl.depthFunc(GL_LEQUAL);
484                      GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
485                  }),
486                  MACRO_BLOCK({ gl.depthMask(GL_FALSE); }))
487 
488     ADD_TESTCASE(depth_rangef, "Change depth range.", true, false, MACRO_BLOCK({
489                      requireCoordBuffers(1);
490                      requireTextures(1);
491                      requirePrograms(1);
492 
493                      gl.useProgram(m_programs[0]->getProgram());
494                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
495                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
496                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
497 
498                      gl.enableVertexAttribArray(coordLoc);
499                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
500                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
501                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
502                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
503                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
504 
505                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
506                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
507 
508                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
509                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
510 
511                      gl.uniform1i(samplerLoc, 0);
512                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
513 
514                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
515                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
516                  }),
517                  MACRO_BLOCK({ gl.depthRangef(0.0f, 1.0f); }))
518 
519     ADD_TESTCASE(blend_equation, "Change blend equation.", true, false, MACRO_BLOCK({
520                      requireCoordBuffers(1);
521                      requireTextures(1);
522                      requirePrograms(1);
523 
524                      gl.useProgram(m_programs[0]->getProgram());
525                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
526                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
527                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
528 
529                      gl.enableVertexAttribArray(coordLoc);
530                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
531                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
532                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
533                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
534                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
535 
536                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
537                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
538 
539                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
540                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
541 
542                      gl.uniform1i(samplerLoc, 0);
543                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
544 
545                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
546                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
547 
548                      gl.enable(GL_BLEND);
549                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
550                  }),
551                  MACRO_BLOCK({ gl.blendEquation(GL_FUNC_SUBTRACT); }))
552 
553     ADD_TESTCASE(blend_func, "Change blend function.", true, false, MACRO_BLOCK({
554                      requireCoordBuffers(1);
555                      requireTextures(1);
556                      requirePrograms(1);
557 
558                      gl.useProgram(m_programs[0]->getProgram());
559                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
560                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
561                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
562 
563                      gl.enableVertexAttribArray(coordLoc);
564                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
565                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
566                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
567                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
568                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
569 
570                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
571                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
572 
573                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
574                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
575 
576                      gl.uniform1i(samplerLoc, 0);
577                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
578 
579                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
580                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
581 
582                      gl.enable(GL_BLEND);
583                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
584                  }),
585                  MACRO_BLOCK({ gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }))
586 
587     ADD_TESTCASE(polygon_offset, "Change polygon offset.", true, false, MACRO_BLOCK({
588                      requireCoordBuffers(1);
589                      requireTextures(1);
590                      requirePrograms(1);
591 
592                      gl.useProgram(m_programs[0]->getProgram());
593                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
594                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
595                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
596 
597                      gl.enableVertexAttribArray(coordLoc);
598                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
599                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
600                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
601                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
602                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
603 
604                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
605                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
606 
607                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
608                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
609 
610                      gl.uniform1i(samplerLoc, 0);
611                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
612 
613                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
614                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
615 
616                      gl.enable(GL_POLYGON_OFFSET_FILL);
617                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
618                  }),
619                  MACRO_BLOCK({ gl.polygonOffset(0.0f, 0.0f); }))
620 
621     ADD_TESTCASE(sample_coverage, "Sample coverage.", 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                  MACRO_BLOCK({ gl.sampleCoverage(0.25f, GL_TRUE); }))
651 
652     ADD_TESTCASE(viewport, "Change viewport.", true, false, MACRO_BLOCK({
653                      requireCoordBuffers(1);
654                      requireTextures(1);
655                      requirePrograms(1);
656 
657                      gl.useProgram(m_programs[0]->getProgram());
658                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
659                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
660                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
661 
662                      gl.enableVertexAttribArray(coordLoc);
663                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
664                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
665                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
666                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
667                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
668 
669                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
670                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
671 
672                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
673                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
674 
675                      gl.uniform1i(samplerLoc, 0);
676                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
677 
678                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
679                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
680                  }),
681                  MACRO_BLOCK({ gl.viewport(10, 11, 5, 6); }))
682 
683     ADD_TESTCASE(scissor, "Change scissor box.", true, false, MACRO_BLOCK({
684                      requireCoordBuffers(1);
685                      requireTextures(1);
686                      requirePrograms(1);
687 
688                      gl.useProgram(m_programs[0]->getProgram());
689                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
690                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
691                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
692 
693                      gl.enableVertexAttribArray(coordLoc);
694                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
695                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
696                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
697                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
698                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
699 
700                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
701                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
702 
703                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
704                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
705 
706                      gl.uniform1i(samplerLoc, 0);
707                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
708 
709                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
710                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
711 
712                      gl.enable(GL_SCISSOR_TEST);
713                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
714                  }),
715                  MACRO_BLOCK({ gl.scissor(17, 13, 5, 8); }))
716 
717     ADD_TESTCASE(color_mask, "Change color mask.", true, false, MACRO_BLOCK({
718                      requireCoordBuffers(1);
719                      requireTextures(1);
720                      requirePrograms(1);
721 
722                      gl.useProgram(m_programs[0]->getProgram());
723                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
724                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
725                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
726 
727                      gl.enableVertexAttribArray(coordLoc);
728                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
729                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
730                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
731                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
732                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
733 
734                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
735                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
736 
737                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
738                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
739 
740                      gl.uniform1i(samplerLoc, 0);
741                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
742 
743                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
744                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
745                  }),
746                  MACRO_BLOCK({ gl.colorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); }))
747 
748     ADD_TESTCASE(cull_face, "Change culling mode.", true, false, MACRO_BLOCK({
749                      requireCoordBuffers(1);
750                      requireTextures(1);
751                      requirePrograms(1);
752 
753                      gl.useProgram(m_programs[0]->getProgram());
754                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
755                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
756                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
757 
758                      gl.enableVertexAttribArray(coordLoc);
759                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
760                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
761                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
762                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
763                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
764 
765                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
766                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
767 
768                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
769                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
770 
771                      gl.uniform1i(samplerLoc, 0);
772                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
773 
774                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
775                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
776 
777                      gl.enable(GL_CULL_FACE);
778                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
779                  }),
780                  MACRO_BLOCK({ gl.cullFace(GL_FRONT); }))
781 
782     ADD_TESTCASE(front_face, "Change front face.", true, false, MACRO_BLOCK({
783                      requireCoordBuffers(1);
784                      requireTextures(1);
785                      requirePrograms(1);
786 
787                      gl.useProgram(m_programs[0]->getProgram());
788                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
789                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
790                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
791 
792                      gl.enableVertexAttribArray(coordLoc);
793                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
794                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
795                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
796                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
797                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
798 
799                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
800                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
801 
802                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
803                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
804 
805                      gl.uniform1i(samplerLoc, 0);
806                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
807 
808                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
809                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
810 
811                      gl.enable(GL_CULL_FACE);
812                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
813                  }),
814                  MACRO_BLOCK({ gl.frontFace(GL_CCW); }))
815 
816     ADD_TESTCASE(stencil_mask, "Change stencil mask.", true, false, MACRO_BLOCK({
817                      requireCoordBuffers(1);
818                      requireTextures(1);
819                      requirePrograms(1);
820 
821                      gl.useProgram(m_programs[0]->getProgram());
822                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
823                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
824                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
825 
826                      gl.enableVertexAttribArray(coordLoc);
827                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
828                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
829                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
830                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
831                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
832 
833                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
834                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
835 
836                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
837                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
838 
839                      gl.uniform1i(samplerLoc, 0);
840                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
841 
842                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
843                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
844 
845                      gl.enable(GL_STENCIL_TEST);
846                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
847 
848                      gl.stencilFunc(GL_LEQUAL, 0, 0);
849                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
850 
851                      gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
852                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
853 
854                      gl.clearStencil(0);
855                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
856                      gl.clear(GL_STENCIL_BUFFER_BIT);
857                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
858                  }),
859                  MACRO_BLOCK({ gl.stencilMask(0xDD); }))
860 
861     ADD_TESTCASE(stencil_func, "Change stencil func.", true, false, MACRO_BLOCK({
862                      requireCoordBuffers(1);
863                      requireTextures(1);
864                      requirePrograms(1);
865 
866                      gl.useProgram(m_programs[0]->getProgram());
867                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
868                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
869                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
870 
871                      gl.enableVertexAttribArray(coordLoc);
872                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
873                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
874                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
875                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
876                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
877 
878                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
879                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
880 
881                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
882                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
883 
884                      gl.uniform1i(samplerLoc, 0);
885                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
886 
887                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
888                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
889 
890                      gl.enable(GL_STENCIL_TEST);
891                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
892 
893                      gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
894                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
895                      gl.clearStencil(0);
896                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
897                      gl.clear(GL_STENCIL_BUFFER_BIT);
898                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
899                  }),
900                  MACRO_BLOCK({ gl.stencilFunc(GL_LEQUAL, 0, 0xFF); }))
901 
902     ADD_TESTCASE(stencil_op, "Change stencil op.", true, false, MACRO_BLOCK({
903                      requireCoordBuffers(1);
904                      requireTextures(1);
905                      requirePrograms(1);
906 
907                      gl.useProgram(m_programs[0]->getProgram());
908                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
909                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
910                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
911 
912                      gl.enableVertexAttribArray(coordLoc);
913                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
914                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
915                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
916                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
917                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
918 
919                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
920                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
921 
922                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
923                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
924 
925                      gl.uniform1i(samplerLoc, 0);
926                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
927 
928                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
929                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
930 
931                      gl.enable(GL_STENCIL_TEST);
932                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
933 
934                      gl.stencilFunc(GL_LEQUAL, 0, 0);
935                      GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
936 
937                      gl.clearStencil(0);
938                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
939 
940                      gl.clear(GL_STENCIL_BUFFER_BIT);
941                      GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
942                  }),
943                  MACRO_BLOCK({ gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); }))
944 
945     ADD_TESTCASE(bind_array_buffer, "Change array buffer and refresh vertex attrib pointer.", true, false, MACRO_BLOCK({
946                      requireCoordBuffers(1);
947                      requireTextures(1);
948                      requirePrograms(1);
949 
950                      gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
951                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
952                      gl.linkProgram(m_programs[0]->getProgram());
953                      GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
954 
955                      gl.useProgram(m_programs[0]->getProgram());
956                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
957 
958                      gl.enableVertexAttribArray(0);
959                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
960                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
961                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
962                      gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
963                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
964 
965                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
966                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
967 
968                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
969                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
970 
971                      gl.uniform1i(samplerLoc, 0);
972                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
973 
974                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
975                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
976                  }),
977                  MACRO_BLOCK({
978                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
979                      gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
980                  }))
981 
982     ADD_TESTCASE(element_array_buffer, "Change element array buffer.", false, true, MACRO_BLOCK({
983                      requireCoordBuffers(1);
984                      requireIndexBuffers(1);
985                      requireTextures(1);
986                      requirePrograms(1);
987 
988                      gl.useProgram(m_programs[0]->getProgram());
989                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
990                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
991                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
992 
993                      gl.enableVertexAttribArray(coordLoc);
994                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
995                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
996                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
997                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
998                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
999 
1000                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1001                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1002 
1003                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1004                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1005 
1006                      gl.uniform1i(samplerLoc, 0);
1007                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1008 
1009                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1010                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1011 
1012                      gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]);
1013                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1014                  }),
1015                  MACRO_BLOCK({ gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); }))
1016 
1017     ADD_TESTCASE(bind_texture, "Change texture binding.", true, false, MACRO_BLOCK({
1018                      requireCoordBuffers(1);
1019                      requireTextures(1);
1020                      requirePrograms(1);
1021 
1022                      gl.useProgram(m_programs[0]->getProgram());
1023                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1024                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1025                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1026 
1027                      gl.enableVertexAttribArray(coordLoc);
1028                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1029                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1030                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1031                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1032                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1033 
1034                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1035                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1036 
1037                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1038                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1039 
1040                      gl.uniform1i(samplerLoc, 0);
1041                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1042 
1043                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1044                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1045                  }),
1046                  MACRO_BLOCK({ gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); }))
1047 
1048     ADD_TESTCASE(use_program, "Change used program.", true, false, MACRO_BLOCK({
1049                      requireCoordBuffers(1);
1050                      requireTextures(1);
1051                      requirePrograms(1);
1052 
1053                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1054                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1055 
1056                      gl.enableVertexAttribArray(coordLoc);
1057                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1058                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1059                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1060                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1061                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1062 
1063                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1064                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1065 
1066                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1067                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1068                      gl.useProgram(m_programs[0]->getProgram());
1069                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
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.useProgram(m_programs[0]->getProgram()); }))
1077 
1078     ADD_TESTCASE(tex_parameter_min_filter, "Change texture parameter min 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_MIN_FILTER, GL_NEAREST); }))
1108 
1109     ADD_TESTCASE(tex_parameter_mag_filter, "Change texture parameter mag filter.", true, false, MACRO_BLOCK({
1110                      requireCoordBuffers(1);
1111                      requireTextures(1);
1112                      requirePrograms(1);
1113 
1114                      gl.useProgram(m_programs[0]->getProgram());
1115                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1116                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1117                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1118 
1119                      gl.enableVertexAttribArray(coordLoc);
1120                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1121                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1122                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1123                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1124                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1125 
1126                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1127                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1128 
1129                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1130                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1131 
1132                      gl.uniform1i(samplerLoc, 0);
1133                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1134 
1135                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1136                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1137                  }),
1138                  MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); }))
1139 
1140     ADD_TESTCASE(tex_parameter_wrap, "Change texture parameter wrap filter.", true, false, MACRO_BLOCK({
1141                      requireCoordBuffers(1);
1142                      requireTextures(1);
1143                      requirePrograms(1);
1144 
1145                      gl.useProgram(m_programs[0]->getProgram());
1146                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1147                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1148                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1149 
1150                      gl.enableVertexAttribArray(coordLoc);
1151                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1152                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1153                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1154                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1155                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1156 
1157                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1158                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1159 
1160                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1161                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1162 
1163                      gl.uniform1i(samplerLoc, 0);
1164                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1165 
1166                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1167                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1168                  }),
1169                  MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); }))
1170 
1171     ADD_TESTCASE(bind_framebuffer, "Change framebuffer.", true, false, MACRO_BLOCK({
1172                      requireCoordBuffers(1);
1173                      requireTextures(1);
1174                      requireFramebuffers(1);
1175                      requirePrograms(1);
1176 
1177                      gl.useProgram(m_programs[0]->getProgram());
1178                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1179                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1180                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1181 
1182                      gl.enableVertexAttribArray(coordLoc);
1183                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1184                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1185                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1186                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1187                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1188 
1189                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1190                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1191 
1192                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1193                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1194 
1195                      gl.uniform1i(samplerLoc, 0);
1196                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1197 
1198                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1199                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1200 
1201                      gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]);
1202                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer()");
1203                  }),
1204                  MACRO_BLOCK({ gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); }))
1205 
1206     ADD_TESTCASE(blend_color, "Change blend color.", true, false, MACRO_BLOCK({
1207                      requireCoordBuffers(1);
1208                      requireTextures(1);
1209                      requirePrograms(1);
1210 
1211                      gl.useProgram(m_programs[0]->getProgram());
1212                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1213                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1214                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1215 
1216                      gl.enableVertexAttribArray(coordLoc);
1217                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1218                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1219                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1220                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1221                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1222 
1223                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1224                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1225 
1226                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1227                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1228 
1229                      gl.uniform1i(samplerLoc, 0);
1230                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1231 
1232                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1233                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1234 
1235                      gl.enable(GL_BLEND);
1236                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
1237 
1238                      gl.blendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR);
1239                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBlendFunc()");
1240                  }),
1241                  MACRO_BLOCK({ gl.blendColor(0.75f, 0.75f, 0.75f, 0.75f); }))
1242 
1243     ADD_TESTCASE(sampler, "Change sampler binding.", true, false, MACRO_BLOCK({
1244                      requireCoordBuffers(1);
1245                      requireTextures(1);
1246                      requirePrograms(1);
1247                      requireSamplers(1);
1248 
1249                      gl.useProgram(m_programs[0]->getProgram());
1250                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1251                      GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1252                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1253 
1254                      gl.enableVertexAttribArray(coordLoc);
1255                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1256                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1257                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1258                      gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1259                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1260 
1261                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1262                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1263 
1264                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1265                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1266 
1267                      gl.uniform1i(samplerLoc, 0);
1268                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1269 
1270                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1271                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1272 
1273                      gl.bindSampler(0, m_samplers[0]);
1274                      gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1275                      GLU_EXPECT_NO_ERROR(gl.getError(), "Sampler setup");
1276                  }),
1277                  MACRO_BLOCK({ gl.bindSampler(0, m_samplers[0]); }))
1278 
1279     ADD_TESTCASE(bind_vertex_array, "Change vertex array binding.", true, false, MACRO_BLOCK({
1280                      requireCoordBuffers(1);
1281                      requireTextures(1);
1282                      requirePrograms(1);
1283                      requireVertexArrays(1);
1284 
1285                      gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
1286                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
1287                      gl.linkProgram(m_programs[0]->getProgram());
1288                      GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
1289 
1290                      gl.useProgram(m_programs[0]->getProgram());
1291                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1292 
1293                      gl.bindVertexArray(m_vertexArrays[0]);
1294                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray()");
1295                      gl.enableVertexAttribArray(0);
1296                      GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1297                      gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1298                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1299                      gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1300                      GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1301 
1302                      GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1303                      GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1304 
1305                      gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1306                      GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1307 
1308                      gl.uniform1i(samplerLoc, 0);
1309                      GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1310 
1311                      gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1312                      GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1313                  }),
1314                  MACRO_BLOCK({ gl.bindVertexArray(m_vertexArrays[0]); }))
1315 }
1316 
1317 } // namespace Performance
1318 } // namespace gles3
1319 } // namespace deqp
1320