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