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