Merge vk-gl-cts/vulkan-cts-1.0.0 into vk-gl-cts/vulkan-cts-1.0.1
[platform/upstream/VK-GL-CTS.git] / modules / gles3 / performance / es3pRedundantStateChangeTests.cpp
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, bool useIndexBuffer, const char* name, const char* description);
52                                         ~RedundantStateChangeCase       (void);
53
54 protected:
55         virtual void    renderTest                                      (const glw::Functions& gl);
56         virtual void    renderReference                         (const glw::Functions& gl);
57         virtual void    changeState                                     (const glw::Functions& gl) = 0;
58 };
59
60 RedundantStateChangeCase::RedundantStateChangeCase (Context& context, int drawCallCount, int triangleCount, bool drawArrays, bool useIndexBuffer, const char* name, const char* description)
61         : gls::StateChangePerformanceCase(context.getTestContext(), context.getRenderContext(), name, description,
62                                                                           (useIndexBuffer       ? DRAWTYPE_INDEXED_BUFFER       :
63                                                                            drawArrays           ? DRAWTYPE_NOT_INDEXED          :
64                                                                                                                   DRAWTYPE_INDEXED_USER_PTR), drawCallCount, triangleCount)
65 {
66         DE_ASSERT(!useIndexBuffer || !drawArrays);
67 }
68
69 RedundantStateChangeCase::~RedundantStateChangeCase (void)
70 {
71 }
72
73 void RedundantStateChangeCase::renderTest (const glw::Functions& gl)
74 {
75         for (int callNdx = 0; callNdx < m_callCount; callNdx++)
76         {
77                 changeState(gl);
78                 callDraw(gl);
79         }
80 }
81
82 void RedundantStateChangeCase::renderReference (const glw::Functions& gl)
83 {
84         changeState(gl);
85
86         for (int callNdx = 0; callNdx < m_callCount; callNdx++)
87                 callDraw(gl);
88 }
89
90 } // anonymous
91
92 RedundantStateChangeTests::RedundantStateChangeTests (Context& context)
93         : TestCaseGroup(context, "redundant_state_change_draw", "Test performance with redundant sate changes between rendering.")
94 {
95 }
96
97 RedundantStateChangeTests::~RedundantStateChangeTests (void)
98 {
99 }
100
101 #define MACRO_BLOCK(...) __VA_ARGS__
102
103 #define ADD_TESTCASE(NAME, DESC, DRAWARRAYS, INDEXBUFFER, INIT_FUNC, CHANGE_FUNC)\
104 do {\
105         class RedundantStateChangeCase_ ## NAME : public RedundantStateChangeCase\
106         {\
107         public:\
108                         RedundantStateChangeCase_ ## NAME (Context& context, int drawCallCount, int triangleCount, const char* name, const char* description)\
109                                 : RedundantStateChangeCase(context, drawCallCount, triangleCount, (DRAWARRAYS), (INDEXBUFFER), name, description)\
110                         {}\
111                 virtual void setupInitialState (const glw::Functions& gl)\
112                 {\
113                         INIT_FUNC\
114                 }\
115                 virtual void changeState (const glw::Functions& gl)\
116                 {\
117                         CHANGE_FUNC\
118                 }\
119         };\
120         manySmallCallsGroup->addChild   (new RedundantStateChangeCase_ ## NAME (m_context,1000,2,#NAME,(DESC)));\
121         fewBigCallsGroup->addChild              (new RedundantStateChangeCase_ ## NAME (m_context,10,200,#NAME,(DESC)));\
122 } while (0);
123
124 void RedundantStateChangeTests::init (void)
125 {
126         tcu::TestCaseGroup* const       manySmallCallsGroup     = new tcu::TestCaseGroup(m_testCtx, "many_small_calls", "1000 calls, 2 triangles in each");
127         tcu::TestCaseGroup* const       fewBigCallsGroup        = new tcu::TestCaseGroup(m_testCtx, "few_big_calls",    "10 calls, 200 triangles in each");
128
129         addChild(manySmallCallsGroup);
130         addChild(fewBigCallsGroup);
131
132         ADD_TESTCASE(blend, "Enable/Disable blending.",
133                 true,
134                 false,
135                 MACRO_BLOCK({
136                         requireCoordBuffers(1);
137                         requireTextures(1);
138                         requirePrograms(1);
139
140                         gl.useProgram(m_programs[0]->getProgram());
141                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
142                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
143                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
144
145                         gl.enableVertexAttribArray(coordLoc);
146                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
147                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
148                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
149                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
150                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
151
152                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
153                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
154
155                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
156                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
157
158                         gl.uniform1i(samplerLoc, 0);
159                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
160
161                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
162                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
163                 }),
164                 MACRO_BLOCK({
165                         gl.enable(GL_BLEND);
166                 })
167         )
168
169         ADD_TESTCASE(depth_test, "Enable/Disable depth test.",
170                 true,
171                 false,
172                 MACRO_BLOCK({
173                         requireCoordBuffers(1);
174                         requireTextures(1);
175                         requirePrograms(1);
176
177                         gl.useProgram(m_programs[0]->getProgram());
178                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
179
180                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
181                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
182
183                         gl.enableVertexAttribArray(coordLoc);
184                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
185
186                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
187                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
188                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
189                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
190
191                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
192                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
193
194                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
195                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
196
197                         gl.uniform1i(samplerLoc, 0);
198                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
199
200                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
201                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
202
203                         gl.depthFunc(GL_LEQUAL);
204                         GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
205                 }),
206                 MACRO_BLOCK({
207                         gl.enable(GL_DEPTH_TEST);
208                 })
209         )
210
211         ADD_TESTCASE(stencil_test, "Enable/Disable stencil test.",
212                 true,
213                 false,
214                 MACRO_BLOCK({
215                         requireCoordBuffers(1);
216                         requireTextures(1);
217                         requirePrograms(1);
218
219                         gl.useProgram(m_programs[0]->getProgram());
220                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
221                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
222                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
223
224                         gl.enableVertexAttribArray(coordLoc);
225                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
226                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
227                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
228                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
229                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
230
231                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
232                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
233
234                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
235                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
236
237                         gl.uniform1i(samplerLoc, 0);
238                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
239
240                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
241                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
242
243                         gl.stencilFunc(GL_LEQUAL, 0, 0);
244                         GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
245
246                         gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
247                         GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
248
249                         gl.clearStencil(0);
250                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
251                         gl.clear(GL_STENCIL_BUFFER_BIT);
252
253                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
254                 }),
255                 MACRO_BLOCK({
256                         gl.enable(GL_STENCIL_TEST);
257                 })
258         )
259
260         ADD_TESTCASE(scissor_test, "Enable/Disable scissor test.",
261                 true,
262                 false,
263                 MACRO_BLOCK({
264                         requireCoordBuffers(1);
265                         requireTextures(1);
266                         requirePrograms(1);
267
268                         gl.useProgram(m_programs[0]->getProgram());
269                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
270                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
271                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
272
273                         gl.enableVertexAttribArray(coordLoc);
274                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
275                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
276                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
277                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
278                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
279
280                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
281                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
282
283                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
284                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
285
286                         gl.uniform1i(samplerLoc, 0);
287                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
288
289                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
290                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
291
292                         gl.scissor(2, 3, 12, 13);
293                         GLU_EXPECT_NO_ERROR(gl.getError(), "glScissor()");
294                 }),
295                 MACRO_BLOCK({
296                         gl.enable(GL_SCISSOR_TEST);
297                 })
298         )
299
300         ADD_TESTCASE(dither, "Enable/Disable dithering.",
301                 true,
302                 false,
303                 MACRO_BLOCK({
304                         requireCoordBuffers(1);
305                         requireTextures(1);
306                         requirePrograms(1);
307
308                         gl.useProgram(m_programs[0]->getProgram());
309                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
310                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
311                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
312
313                         gl.enableVertexAttribArray(coordLoc);
314                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
315                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
316                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
317                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
318                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
319
320                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
321                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
322
323                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
324                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
325
326                         gl.uniform1i(samplerLoc, 0);
327                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
328
329                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
330                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
331                 }),
332                 MACRO_BLOCK({
333                         gl.enable(GL_DITHER);
334                 })
335         )
336
337         ADD_TESTCASE(culling, "Enable/Disable culling.",
338                 true,
339                 false,
340                 MACRO_BLOCK({
341                         requireCoordBuffers(1);
342                         requireTextures(1);
343                         requirePrograms(1);
344
345                         gl.useProgram(m_programs[0]->getProgram());
346                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
347                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
348                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
349
350                         gl.enableVertexAttribArray(coordLoc);
351                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
352                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
353                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
354                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
355                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
356
357                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
358                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
359
360                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
361                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
362
363                         gl.uniform1i(samplerLoc, 0);
364                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
365
366                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
367                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
368
369                         gl.frontFace(GL_CW);
370                         GLU_EXPECT_NO_ERROR(gl.getError(), "glFrontFace()");
371
372                         gl.cullFace(GL_FRONT);
373                         GLU_EXPECT_NO_ERROR(gl.getError(), "glCullFace()");
374                 }),
375                 MACRO_BLOCK({
376                         gl.enable(GL_CULL_FACE);
377                 })
378         )
379
380         ADD_TESTCASE(rasterizer_discard, "Disable RASTERIZER_DISCARD.",
381                 true,
382                 false,
383                 MACRO_BLOCK({
384                         requireCoordBuffers(1);
385                         requireTextures(1);
386                         requirePrograms(1);
387
388                         gl.useProgram(m_programs[0]->getProgram());
389                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
390                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
391                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
392
393                         gl.enableVertexAttribArray(coordLoc);
394                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
395                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
396                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
397                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
398                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
399
400                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
401                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
402
403                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
404                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
405
406                         gl.uniform1i(samplerLoc, 0);
407                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
408
409                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
410                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
411                 }),
412                 MACRO_BLOCK({
413                         gl.disable(GL_RASTERIZER_DISCARD);
414                 })
415         )
416
417         ADD_TESTCASE(primitive_restart_fixed_index, "Enable PRIMITIVE_RESTART_FIXED_INDEX.",
418                 true,
419                 false,
420                 MACRO_BLOCK({
421                         requireCoordBuffers(1);
422                         requireTextures(1);
423                         requirePrograms(1);
424
425                         gl.useProgram(m_programs[0]->getProgram());
426                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
427                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
428                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
429
430                         gl.enableVertexAttribArray(coordLoc);
431                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
432                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
433                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
434                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
435                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
436
437                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
438                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
439
440                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
441                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
442
443                         gl.uniform1i(samplerLoc, 0);
444                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
445
446                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
447                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
448                 }),
449                 MACRO_BLOCK({
450                         gl.enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
451                 })
452         )
453
454         ADD_TESTCASE(depth_func, "Change depth func.",
455                 true,
456                 false,
457                 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_DEPTH_TEST);
487                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
488                 }),
489                 MACRO_BLOCK({
490                         gl.depthFunc(GL_GEQUAL);
491                 })
492         )
493
494
495         ADD_TESTCASE(depth_mask, "Toggle depth mask.",
496                 true,
497                 false,
498                 MACRO_BLOCK({
499                         requireCoordBuffers(1);
500                         requireTextures(1);
501                         requirePrograms(1);
502
503                         gl.useProgram(m_programs[0]->getProgram());
504                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
505                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
506                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
507
508                         gl.enableVertexAttribArray(coordLoc);
509                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
510                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
511                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
512                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
513                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
514
515                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
516                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
517
518                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
519                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
520
521                         gl.uniform1i(samplerLoc, 0);
522                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
523
524                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
525                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
526
527                         gl.enable(GL_DEPTH_TEST);
528                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
529
530                         gl.depthFunc(GL_LEQUAL);
531                         GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
532                 }),
533                 MACRO_BLOCK({
534                         gl.depthMask(GL_FALSE);
535                 })
536         )
537
538         ADD_TESTCASE(depth_rangef, "Change depth range.",
539                 true,
540                 false,
541                 MACRO_BLOCK({
542                         requireCoordBuffers(1);
543                         requireTextures(1);
544                         requirePrograms(1);
545
546                         gl.useProgram(m_programs[0]->getProgram());
547                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
548                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
549                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
550
551                         gl.enableVertexAttribArray(coordLoc);
552                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
553                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
554                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
555                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
556                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
557
558                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
559                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
560
561                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
562                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
563
564                         gl.uniform1i(samplerLoc, 0);
565                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
566
567                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
568                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
569                 }),
570                 MACRO_BLOCK({
571                         gl.depthRangef(0.0f, 1.0f);
572                 })
573         )
574
575         ADD_TESTCASE(blend_equation, "Change blend equation.",
576                 true,
577                 false,
578                 MACRO_BLOCK({
579                         requireCoordBuffers(1);
580                         requireTextures(1);
581                         requirePrograms(1);
582
583                         gl.useProgram(m_programs[0]->getProgram());
584                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
585                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
586                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
587
588                         gl.enableVertexAttribArray(coordLoc);
589                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
590                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
591                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
592                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
593                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
594
595                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
596                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
597
598                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
599                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
600
601                         gl.uniform1i(samplerLoc, 0);
602                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
603
604                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
605                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
606
607                         gl.enable(GL_BLEND);
608                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
609                 }),
610                 MACRO_BLOCK({
611                         gl.blendEquation(GL_FUNC_SUBTRACT);
612                 })
613         )
614
615         ADD_TESTCASE(blend_func, "Change blend function.",
616                 true,
617                 false,
618                 MACRO_BLOCK({
619                         requireCoordBuffers(1);
620                         requireTextures(1);
621                         requirePrograms(1);
622
623                         gl.useProgram(m_programs[0]->getProgram());
624                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
625                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
626                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
627
628                         gl.enableVertexAttribArray(coordLoc);
629                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
630                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
631                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
632                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
633                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
634
635                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
636                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
637
638                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
639                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
640
641                         gl.uniform1i(samplerLoc, 0);
642                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
643
644                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
645                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
646
647                         gl.enable(GL_BLEND);
648                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
649                 }),
650                 MACRO_BLOCK({
651                         gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
652                 })
653         )
654
655         ADD_TESTCASE(polygon_offset, "Change polygon offset.",
656                 true,
657                 false,
658                 MACRO_BLOCK({
659                         requireCoordBuffers(1);
660                         requireTextures(1);
661                         requirePrograms(1);
662
663                         gl.useProgram(m_programs[0]->getProgram());
664                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
665                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
666                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
667
668                         gl.enableVertexAttribArray(coordLoc);
669                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
670                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
671                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
672                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
673                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
674
675                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
676                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
677
678                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
679                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
680
681                         gl.uniform1i(samplerLoc, 0);
682                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
683
684                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
685                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
686
687                         gl.enable(GL_POLYGON_OFFSET_FILL);
688                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
689                 }),
690                 MACRO_BLOCK({
691                         gl.polygonOffset(0.0f, 0.0f);
692                 })
693         )
694
695         ADD_TESTCASE(sample_coverage, "Sample coverage.",
696                 true,
697                 false,
698                 MACRO_BLOCK({
699                         requireCoordBuffers(1);
700                         requireTextures(1);
701                         requirePrograms(1);
702
703                         gl.useProgram(m_programs[0]->getProgram());
704                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
705                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
706                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
707
708                         gl.enableVertexAttribArray(coordLoc);
709                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
710                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
711                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
712                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
713                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
714
715                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
716                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
717
718                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
719                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
720
721                         gl.uniform1i(samplerLoc, 0);
722                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
723
724                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
725                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
726                 }),
727                 MACRO_BLOCK({
728                         gl.sampleCoverage(0.25f, GL_TRUE);
729                 })
730         )
731
732         ADD_TESTCASE(viewport, "Change viewport.",
733                 true,
734                 false,
735                 MACRO_BLOCK({
736                         requireCoordBuffers(1);
737                         requireTextures(1);
738                         requirePrograms(1);
739
740                         gl.useProgram(m_programs[0]->getProgram());
741                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
742                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
743                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
744
745                         gl.enableVertexAttribArray(coordLoc);
746                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
747                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
748                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
749                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
750                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
751
752                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
753                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
754
755                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
756                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
757
758                         gl.uniform1i(samplerLoc, 0);
759                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
760
761                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
762                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
763                 }),
764                 MACRO_BLOCK({
765                         gl.viewport(10, 11, 5, 6);
766                 })
767         )
768
769         ADD_TESTCASE(scissor, "Change scissor box.",
770                 true,
771                 false,
772                 MACRO_BLOCK({
773                         requireCoordBuffers(1);
774                         requireTextures(1);
775                         requirePrograms(1);
776
777                         gl.useProgram(m_programs[0]->getProgram());
778                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
779                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
780                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
781
782                         gl.enableVertexAttribArray(coordLoc);
783                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
784                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
785                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
786                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
787                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
788
789                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
790                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
791
792                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
793                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
794
795                         gl.uniform1i(samplerLoc, 0);
796                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
797
798                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
799                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
800
801                         gl.enable(GL_SCISSOR_TEST);
802                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
803                 }),
804                 MACRO_BLOCK({
805                         gl.scissor(17, 13, 5, 8);
806                 })
807         )
808
809         ADD_TESTCASE(color_mask, "Change color mask.",
810                 true,
811                 false,
812                 MACRO_BLOCK({
813                         requireCoordBuffers(1);
814                         requireTextures(1);
815                         requirePrograms(1);
816
817                         gl.useProgram(m_programs[0]->getProgram());
818                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
819                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
820                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
821
822                         gl.enableVertexAttribArray(coordLoc);
823                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
824                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
825                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
826                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
827                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
828
829                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
830                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
831
832                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
833                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
834
835                         gl.uniform1i(samplerLoc, 0);
836                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
837
838                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
839                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
840                 }),
841                 MACRO_BLOCK({
842                         gl.colorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
843                 })
844         )
845
846         ADD_TESTCASE(cull_face, "Change culling mode.",
847                 true,
848                 false,
849                 MACRO_BLOCK({
850                         requireCoordBuffers(1);
851                         requireTextures(1);
852                         requirePrograms(1);
853
854                         gl.useProgram(m_programs[0]->getProgram());
855                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
856                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
857                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
858
859                         gl.enableVertexAttribArray(coordLoc);
860                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
861                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
862                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
863                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
864                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
865
866                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
867                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
868
869                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
870                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
871
872                         gl.uniform1i(samplerLoc, 0);
873                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
874
875                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
876                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
877
878                         gl.enable(GL_CULL_FACE);
879                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
880                 }),
881                 MACRO_BLOCK({
882                         gl.cullFace(GL_FRONT);
883                 })
884         )
885
886         ADD_TESTCASE(front_face, "Change front face.",
887                 true,
888                 false,
889                 MACRO_BLOCK({
890                         requireCoordBuffers(1);
891                         requireTextures(1);
892                         requirePrograms(1);
893
894                         gl.useProgram(m_programs[0]->getProgram());
895                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
896                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
897                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
898
899                         gl.enableVertexAttribArray(coordLoc);
900                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
901                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
902                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
903                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
904                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
905
906                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
907                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
908
909                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
910                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
911
912                         gl.uniform1i(samplerLoc, 0);
913                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
914
915                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
916                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
917
918                         gl.enable(GL_CULL_FACE);
919                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
920                 }),
921                 MACRO_BLOCK({
922                         gl.frontFace(GL_CCW);
923                 })
924         )
925
926         ADD_TESTCASE(stencil_mask, "Change stencil mask.",
927                 true,
928                 false,
929                 MACRO_BLOCK({
930                         requireCoordBuffers(1);
931                         requireTextures(1);
932                         requirePrograms(1);
933
934                         gl.useProgram(m_programs[0]->getProgram());
935                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
936                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
937                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
938
939                         gl.enableVertexAttribArray(coordLoc);
940                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
941                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
942                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
943                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
944                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
945
946                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
947                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
948
949                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
950                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
951
952                         gl.uniform1i(samplerLoc, 0);
953                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
954
955                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
956                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
957
958                         gl.enable(GL_STENCIL_TEST);
959                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
960
961                         gl.stencilFunc(GL_LEQUAL, 0, 0);
962                         GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
963
964                         gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
965                         GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
966
967                         gl.clearStencil(0);
968                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
969                         gl.clear(GL_STENCIL_BUFFER_BIT);
970                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
971                 }),
972                 MACRO_BLOCK({
973                         gl.stencilMask(0xDD);
974                 })
975         )
976
977         ADD_TESTCASE(stencil_func, "Change stencil func.",
978                 true,
979                 false,
980                 MACRO_BLOCK({
981                         requireCoordBuffers(1);
982                         requireTextures(1);
983                         requirePrograms(1);
984
985                         gl.useProgram(m_programs[0]->getProgram());
986                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
987                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
988                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
989
990                         gl.enableVertexAttribArray(coordLoc);
991                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
992                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
993                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
994                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
995                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
996
997                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
998                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
999
1000                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1001                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1002
1003                         gl.uniform1i(samplerLoc, 0);
1004                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1005
1006                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1007                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1008
1009                         gl.enable(GL_STENCIL_TEST);
1010                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
1011
1012                         gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
1013                         GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
1014                         gl.clearStencil(0);
1015                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
1016                         gl.clear(GL_STENCIL_BUFFER_BIT);
1017                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
1018                 }),
1019                 MACRO_BLOCK({
1020                         gl.stencilFunc(GL_LEQUAL, 0, 0xFF);
1021                 })
1022         )
1023
1024         ADD_TESTCASE(stencil_op, "Change stencil op.",
1025                 true,
1026                 false,
1027                 MACRO_BLOCK({
1028                         requireCoordBuffers(1);
1029                         requireTextures(1);
1030                         requirePrograms(1);
1031
1032                         gl.useProgram(m_programs[0]->getProgram());
1033                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1034                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1035                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1036
1037                         gl.enableVertexAttribArray(coordLoc);
1038                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1039                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1040                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1041                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1042                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1043
1044                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1045                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1046
1047                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1048                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1049
1050                         gl.uniform1i(samplerLoc, 0);
1051                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1052
1053                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1054                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1055
1056                         gl.enable(GL_STENCIL_TEST);
1057                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
1058
1059                         gl.stencilFunc(GL_LEQUAL, 0, 0);
1060                         GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
1061
1062                         gl.clearStencil(0);
1063                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
1064
1065                         gl.clear(GL_STENCIL_BUFFER_BIT);
1066                         GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
1067                 }),
1068                 MACRO_BLOCK({
1069                         gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
1070                 })
1071         )
1072
1073         ADD_TESTCASE(bind_array_buffer, "Change array buffer and refresh vertex attrib pointer.",
1074                 true,
1075                 false,
1076                 MACRO_BLOCK({
1077                         requireCoordBuffers(1);
1078                         requireTextures(1);
1079                         requirePrograms(1);
1080
1081                         gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
1082                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
1083                         gl.linkProgram(m_programs[0]->getProgram());
1084                         GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
1085
1086                         gl.useProgram(m_programs[0]->getProgram());
1087                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1088
1089                         gl.enableVertexAttribArray(0);
1090                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1091                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1092                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1093                         gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1094                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1095
1096                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1097                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1098
1099                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1100                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1101
1102                         gl.uniform1i(samplerLoc, 0);
1103                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1104
1105                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1106                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1107                 }),
1108                 MACRO_BLOCK({
1109                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1110                         gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1111                 })
1112         )
1113
1114         ADD_TESTCASE(element_array_buffer, "Change element array buffer.",
1115                 false,
1116                 true,
1117                 MACRO_BLOCK({
1118                         requireCoordBuffers(1);
1119                         requireIndexBuffers(1);
1120                         requireTextures(1);
1121                         requirePrograms(1);
1122
1123                         gl.useProgram(m_programs[0]->getProgram());
1124                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1125                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1126                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1127
1128                         gl.enableVertexAttribArray(coordLoc);
1129                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1130                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1131                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1132                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1133                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1134
1135                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1136                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1137
1138                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1139                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1140
1141                         gl.uniform1i(samplerLoc, 0);
1142                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1143
1144                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1145                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1146
1147                         gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]);
1148                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1149                 }),
1150                 MACRO_BLOCK({
1151                         gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]);
1152                 })
1153         )
1154
1155         ADD_TESTCASE(bind_texture, "Change texture binding.",
1156                 true,
1157                 false,
1158                 MACRO_BLOCK({
1159                         requireCoordBuffers(1);
1160                         requireTextures(1);
1161                         requirePrograms(1);
1162
1163                         gl.useProgram(m_programs[0]->getProgram());
1164                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1165                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1166                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1167
1168                         gl.enableVertexAttribArray(coordLoc);
1169                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1170                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1171                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1172                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1173                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1174
1175                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1176                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1177
1178                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1179                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1180
1181                         gl.uniform1i(samplerLoc, 0);
1182                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1183
1184                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1185                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1186                 }),
1187                 MACRO_BLOCK({
1188                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1189                 })
1190         )
1191
1192         ADD_TESTCASE(use_program, "Change used program.",
1193                 true,
1194                 false,
1195                 MACRO_BLOCK({
1196                         requireCoordBuffers(1);
1197                         requireTextures(1);
1198                         requirePrograms(1);
1199
1200                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1201                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1202
1203                         gl.enableVertexAttribArray(coordLoc);
1204                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1205                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1206                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1207                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1208                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1209
1210                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1211                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1212
1213                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1214                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1215                         gl.useProgram(m_programs[0]->getProgram());
1216                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1217                         gl.uniform1i(samplerLoc, 0);
1218                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1219
1220                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1221                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1222                 }),
1223                 MACRO_BLOCK({
1224                         gl.useProgram(m_programs[0]->getProgram());
1225                 })
1226         )
1227
1228         ADD_TESTCASE(tex_parameter_min_filter, "Change texture parameter min filter.",
1229                 true,
1230                 false,
1231                 MACRO_BLOCK({
1232                         requireCoordBuffers(1);
1233                         requireTextures(1);
1234                         requirePrograms(1);
1235
1236                         gl.useProgram(m_programs[0]->getProgram());
1237                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1238                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1239                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1240
1241                         gl.enableVertexAttribArray(coordLoc);
1242                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1243                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1244                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1245                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1246                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1247
1248                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1249                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1250
1251                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1252                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1253
1254                         gl.uniform1i(samplerLoc, 0);
1255                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1256
1257                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1258                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1259                 }),
1260                 MACRO_BLOCK({
1261                         gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1262                 })
1263         )
1264
1265         ADD_TESTCASE(tex_parameter_mag_filter, "Change texture parameter mag filter.",
1266                 true,
1267                 false,
1268                 MACRO_BLOCK({
1269                         requireCoordBuffers(1);
1270                         requireTextures(1);
1271                         requirePrograms(1);
1272
1273                         gl.useProgram(m_programs[0]->getProgram());
1274                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1275                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1276                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1277
1278                         gl.enableVertexAttribArray(coordLoc);
1279                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1280                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1281                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1282                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1283                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1284
1285                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1286                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1287
1288                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1289                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1290
1291                         gl.uniform1i(samplerLoc, 0);
1292                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1293
1294                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1295                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1296                 }),
1297                 MACRO_BLOCK({
1298                         gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1299                 })
1300         )
1301
1302         ADD_TESTCASE(tex_parameter_wrap, "Change texture parameter wrap filter.",
1303                 true,
1304                 false,
1305                 MACRO_BLOCK({
1306                         requireCoordBuffers(1);
1307                         requireTextures(1);
1308                         requirePrograms(1);
1309
1310                         gl.useProgram(m_programs[0]->getProgram());
1311                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1312                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1313                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1314
1315                         gl.enableVertexAttribArray(coordLoc);
1316                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1317                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1318                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1319                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1320                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1321
1322                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1323                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1324
1325                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1326                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1327
1328                         gl.uniform1i(samplerLoc, 0);
1329                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1330
1331                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1332                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1333                 }),
1334                 MACRO_BLOCK({
1335                         gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1336                 })
1337         )
1338
1339         ADD_TESTCASE(bind_framebuffer, "Change framebuffer.",
1340                 true,
1341                 false,
1342                 MACRO_BLOCK({
1343                         requireCoordBuffers(1);
1344                         requireTextures(1);
1345                         requireFramebuffers(1);
1346                         requirePrograms(1);
1347
1348                         gl.useProgram(m_programs[0]->getProgram());
1349                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1350                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1351                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1352
1353                         gl.enableVertexAttribArray(coordLoc);
1354                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1355                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1356                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1357                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1358                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1359
1360                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1361                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1362
1363                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1364                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1365
1366                         gl.uniform1i(samplerLoc, 0);
1367                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1368
1369                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1370                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1371
1372                         gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]);
1373                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer()");
1374                 }),
1375                 MACRO_BLOCK({
1376                         gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]);
1377                 })
1378         )
1379
1380         ADD_TESTCASE(blend_color, "Change blend color.",
1381                 true,
1382                 false,
1383                 MACRO_BLOCK({
1384                         requireCoordBuffers(1);
1385                         requireTextures(1);
1386                         requirePrograms(1);
1387
1388                         gl.useProgram(m_programs[0]->getProgram());
1389                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1390                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1391                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1392
1393                         gl.enableVertexAttribArray(coordLoc);
1394                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1395                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1396                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1397                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1398                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1399
1400                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1401                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1402
1403                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1404                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1405
1406                         gl.uniform1i(samplerLoc, 0);
1407                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1408
1409                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1410                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1411
1412                         gl.enable(GL_BLEND);
1413                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
1414
1415                         gl.blendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR);
1416                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBlendFunc()");
1417                 }),
1418                 MACRO_BLOCK({
1419                         gl.blendColor(0.75f, 0.75f, 0.75f, 0.75f);
1420                 })
1421         )
1422
1423         ADD_TESTCASE(sampler, "Change sampler binding.",
1424                 true,
1425                 false,
1426                 MACRO_BLOCK({
1427                         requireCoordBuffers(1);
1428                         requireTextures(1);
1429                         requirePrograms(1);
1430                         requireSamplers(1);
1431
1432                         gl.useProgram(m_programs[0]->getProgram());
1433                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1434                         GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
1435                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
1436
1437                         gl.enableVertexAttribArray(coordLoc);
1438                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1439                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1440                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1441                         gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1442                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1443
1444                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1445                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1446
1447                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1448                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1449
1450                         gl.uniform1i(samplerLoc, 0);
1451                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1452
1453                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1454                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1455
1456                         gl.bindSampler(0, m_samplers[0]);
1457                         gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1458                         GLU_EXPECT_NO_ERROR(gl.getError(), "Sampler setup");
1459                 }),
1460                 MACRO_BLOCK({
1461                         gl.bindSampler(0, m_samplers[0]);
1462                 })
1463         )
1464
1465         ADD_TESTCASE(bind_vertex_array, "Change vertex array binding.",
1466                 true,
1467                 false,
1468                 MACRO_BLOCK({
1469                         requireCoordBuffers(1);
1470                         requireTextures(1);
1471                         requirePrograms(1);
1472                         requireVertexArrays(1);
1473
1474                         gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
1475                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
1476                         gl.linkProgram(m_programs[0]->getProgram());
1477                         GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
1478
1479                         gl.useProgram(m_programs[0]->getProgram());
1480                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1481
1482                         gl.bindVertexArray(m_vertexArrays[0]);
1483                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray()");
1484                         gl.enableVertexAttribArray(0);
1485                         GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
1486                         gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
1487                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1488                         gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
1489                         GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
1490
1491                         GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
1492                         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
1493
1494                         gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
1495                         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
1496
1497                         gl.uniform1i(samplerLoc, 0);
1498                         GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
1499
1500                         gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
1501                         GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
1502                 }),
1503                 MACRO_BLOCK({
1504                         gl.bindVertexArray(m_vertexArrays[0]);
1505                 })
1506         )
1507 }
1508
1509 } // Performance
1510 } // gles3
1511 } // deqp