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