Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 3.0 Module
      3  * -------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief State Query tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es3fIntegerStateQueryTests.hpp"
     25 #include "es3fApiCase.hpp"
     26 
     27 #include "glsStateQueryUtil.hpp"
     28 
     29 #include "gluRenderContext.hpp"
     30 #include "gluContextInfo.hpp"
     31 #include "gluStrUtil.hpp"
     32 
     33 #include "tcuRenderTarget.hpp"
     34 
     35 #include "deRandom.hpp"
     36 
     37 #include "glwEnums.hpp"
     38 
     39 using namespace glw; // GLint and other GL types
     40 using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
     41 
     42 #ifndef GL_SLUMINANCE_NV
     43 #define	GL_SLUMINANCE_NV 0x8C46
     44 #endif
     45 #ifndef GL_SLUMINANCE_ALPHA_NV
     46 #define	GL_SLUMINANCE_ALPHA_NV 0x8C44
     47 #endif
     48 #ifndef GL_BGR_NV
     49 #define GL_BGR_NV 0x80E0
     50 #endif
     51 
     52 namespace deqp
     53 {
     54 namespace gles3
     55 {
     56 namespace Functional
     57 {
     58 namespace IntegerStateQueryVerifiers
     59 {
     60 
     61 // StateVerifier
     62 
     63 class StateVerifier : protected glu::CallLogWrapper
     64 {
     65 public:
     66 						StateVerifier						(const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix);
     67 	virtual				~StateVerifier						(); // make GCC happy
     68 
     69 	const char*			getTestNamePostfix					(void) const;
     70 
     71 	virtual void		verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference)																																		= DE_NULL;
     72 	virtual void		verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)																				= DE_NULL;
     73 	virtual void		verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)			= DE_NULL;
     74 	virtual void		verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference)																																		= DE_NULL;
     75 	virtual void		verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference)																																		= DE_NULL;
     76 	virtual void		verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference)																																		= DE_NULL;
     77 	virtual void		verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)																													= DE_NULL;
     78 	virtual void		verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)																											= DE_NULL;
     79 	virtual void		verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits)																																		= DE_NULL;
     80 
     81 private:
     82 	const char*	const	m_testNamePostfix;
     83 };
     84 
     85 StateVerifier::StateVerifier (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix)
     86 	: glu::CallLogWrapper	(gl, log)
     87 	, m_testNamePostfix		(testNamePostfix)
     88 {
     89 	enableLogging(true);
     90 }
     91 
     92 StateVerifier::~StateVerifier ()
     93 {
     94 }
     95 
     96 const char* StateVerifier::getTestNamePostfix (void) const
     97 {
     98 	return m_testNamePostfix;
     99 }
    100 
    101 // GetBooleanVerifier
    102 
    103 class GetBooleanVerifier : public StateVerifier
    104 {
    105 public:
    106 			GetBooleanVerifier			(const glw::Functions& gl, tcu::TestLog& log);
    107 	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
    108 	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
    109 	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
    110 	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    111 	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
    112 	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    113 	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
    114 	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
    115 	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
    116 };
    117 
    118 GetBooleanVerifier::GetBooleanVerifier (const glw::Functions& gl, tcu::TestLog& log)
    119 	: StateVerifier(gl, log, "_getboolean")
    120 {
    121 }
    122 
    123 void GetBooleanVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
    124 {
    125 	using tcu::TestLog;
    126 
    127 	StateQueryMemoryWriteGuard<GLboolean> state;
    128 	glGetBooleanv(name, &state);
    129 
    130 	if (!state.verifyValidity(testCtx))
    131 		return;
    132 
    133 	const GLboolean expectedGLState = reference ? GL_TRUE : GL_FALSE;
    134 
    135 	if (state != expectedGLState)
    136 	{
    137 		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << (expectedGLState==GL_TRUE ? "GL_TRUE" : "GL_FALSE") << "; got " << (state == GL_TRUE ? "GL_TRUE" : (state == GL_FALSE ? "GL_FALSE" : "non-boolean")) << TestLog::EndMessage;
    138 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    139 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    140 	}
    141 }
    142 
    143 void GetBooleanVerifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
    144 {
    145 	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
    146 }
    147 
    148 void GetBooleanVerifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
    149 {
    150 	using tcu::TestLog;
    151 
    152 	StateQueryMemoryWriteGuard<GLboolean[4]> boolVector4;
    153 	glGetBooleanv(name, boolVector4);
    154 
    155 	if (!boolVector4.verifyValidity(testCtx))
    156 		return;
    157 
    158 	const GLboolean referenceAsGLBoolean[] =
    159 	{
    160 		reference0 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
    161 		reference1 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
    162 		reference2 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
    163 		reference3 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
    164 	};
    165 
    166 	if ((enableRef0 && (boolVector4[0] != referenceAsGLBoolean[0])) ||
    167 		(enableRef1 && (boolVector4[1] != referenceAsGLBoolean[1])) ||
    168 		(enableRef2 && (boolVector4[2] != referenceAsGLBoolean[2])) ||
    169 		(enableRef3 && (boolVector4[3] != referenceAsGLBoolean[3])))
    170 	{
    171 		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
    172 			<< (enableRef0 ? (referenceAsGLBoolean[0] ? "GL_TRUE" : "GL_FALSE") : " - ") << ", "
    173 			<< (enableRef1 ? (referenceAsGLBoolean[1] ? "GL_TRUE" : "GL_FALSE") : " - ") << ", "
    174 			<< (enableRef2 ? (referenceAsGLBoolean[2] ? "GL_TRUE" : "GL_FALSE") : " - ") << ", "
    175 			<< (enableRef3 ? (referenceAsGLBoolean[3] ? "GL_TRUE" : "GL_FALSE") : " - ") << TestLog::EndMessage;
    176 
    177 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    178 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    179 	}
    180 }
    181 
    182 void GetBooleanVerifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    183 {
    184 	using tcu::TestLog;
    185 
    186 	StateQueryMemoryWriteGuard<GLboolean> state;
    187 	glGetBooleanv(name, &state);
    188 
    189 	if (!state.verifyValidity(testCtx))
    190 		return;
    191 
    192 	if (state == GL_TRUE) // state is non-zero, could be greater than reference (correct)
    193 		return;
    194 
    195 	if (state == GL_FALSE) // state is zero
    196 	{
    197 		if (reference > 0) // and reference is greater than zero?
    198 		{
    199 			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
    200 			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    201 				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    202 		}
    203 	}
    204 	else
    205 	{
    206 		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
    207 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    208 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    209 	}
    210 }
    211 
    212 void GetBooleanVerifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
    213 {
    214 	using tcu::TestLog;
    215 
    216 	StateQueryMemoryWriteGuard<GLboolean> state;
    217 	glGetBooleanv(name, &state);
    218 
    219 	if (!state.verifyValidity(testCtx))
    220 		return;
    221 
    222 	if (state == GL_TRUE) // state is non-zero, could be greater than reference (correct)
    223 		return;
    224 
    225 	if (state == GL_FALSE) // state is zero
    226 	{
    227 		if (reference > 0) // and reference is greater than zero?
    228 		{
    229 			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
    230 			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    231 				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    232 		}
    233 	}
    234 	else
    235 	{
    236 		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
    237 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    238 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    239 	}
    240 }
    241 
    242 void GetBooleanVerifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    243 {
    244 	using tcu::TestLog;
    245 
    246 	StateQueryMemoryWriteGuard<GLboolean> state;
    247 	glGetBooleanv(name, &state);
    248 
    249 	if (!state.verifyValidity(testCtx))
    250 		return;
    251 
    252 	if (state == GL_TRUE) // state is non-zero, could be less than reference (correct)
    253 		return;
    254 
    255 	if (state == GL_FALSE) // state is zero
    256 	{
    257 		if (reference < 0) // and reference is less than zero?
    258 		{
    259 			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
    260 			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    261 				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    262 		}
    263 	}
    264 	else
    265 	{
    266 		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
    267 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    268 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    269 	}
    270 }
    271 
    272 void GetBooleanVerifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
    273 {
    274 	using tcu::TestLog;
    275 
    276 	StateQueryMemoryWriteGuard<GLboolean[2]> boolVector;
    277 	glGetBooleanv(name, boolVector);
    278 
    279 	if (!boolVector.verifyValidity(testCtx))
    280 		return;
    281 
    282 	const GLboolean referenceAsGLBoolean[2] =
    283 	{
    284 		reference0 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
    285 		reference1 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE
    286 	};
    287 
    288 	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(referenceAsGLBoolean); ++ndx)
    289 	{
    290 		if (boolVector[ndx] == GL_TRUE) // state is non-zero, could be greater than any integer
    291 		{
    292 			continue;
    293 		}
    294 		else if (boolVector[ndx] == GL_FALSE) // state is zero
    295 		{
    296 			if (referenceAsGLBoolean[ndx] > 0) // and reference is greater than zero?
    297 			{
    298 				testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
    299 				if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    300 					testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    301 			}
    302 		}
    303 		else
    304 		{
    305 			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
    306 			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    307 				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    308 		}
    309 	}
    310 }
    311 
    312 void GetBooleanVerifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
    313 {
    314 	using tcu::TestLog;
    315 
    316 	StateQueryMemoryWriteGuard<GLboolean> state;
    317 	glGetBooleanv(name, &state);
    318 
    319 	if (!state.verifyValidity(testCtx))
    320 		return;
    321 
    322 	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
    323 	{
    324 		const GLboolean expectedGLState = references[ndx] ? GL_TRUE : GL_FALSE;
    325 
    326 		if (state == expectedGLState)
    327 			return;
    328 	}
    329 
    330 	testCtx.getLog() << TestLog::Message << "// ERROR: got " << (state==GL_TRUE ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
    331 	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    332 		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    333 }
    334 
    335 void GetBooleanVerifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
    336 {
    337 	// if stencilBits == 0, the mask is allowed to be either GL_TRUE or GL_FALSE
    338 	// otherwise it must be GL_TRUE
    339 	using tcu::TestLog;
    340 
    341 	StateQueryMemoryWriteGuard<GLboolean> state;
    342 	glGetBooleanv(name, &state);
    343 
    344 	if (!state.verifyValidity(testCtx))
    345 		return;
    346 
    347 	if (stencilBits > 0 && state != GL_TRUE)
    348 	{
    349 		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
    350 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    351 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
    352 	}
    353 }
    354 
    355 //GetIntegerVerifier
    356 
    357 class GetIntegerVerifier : public StateVerifier
    358 {
    359 public:
    360 			GetIntegerVerifier			(const glw::Functions& gl, tcu::TestLog& log);
    361 	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
    362 	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
    363 	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
    364 	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    365 	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
    366 	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    367 	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
    368 	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
    369 	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
    370 };
    371 
    372 GetIntegerVerifier::GetIntegerVerifier (const glw::Functions& gl, tcu::TestLog& log)
    373 	: StateVerifier(gl, log, "_getinteger")
    374 {
    375 }
    376 
    377 void GetIntegerVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
    378 {
    379 	using tcu::TestLog;
    380 
    381 	StateQueryMemoryWriteGuard<GLint> state;
    382 	glGetIntegerv(name, &state);
    383 
    384 	if (!state.verifyValidity(testCtx))
    385 		return;
    386 
    387 	if (state != reference)
    388 	{
    389 		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
    390 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    391 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    392 	}
    393 }
    394 
    395 void GetIntegerVerifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
    396 {
    397 	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
    398 }
    399 
    400 void GetIntegerVerifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
    401 {
    402 	using tcu::TestLog;
    403 
    404 	StateQueryMemoryWriteGuard<GLint[4]> intVector4;
    405 	glGetIntegerv(name, intVector4);
    406 
    407 	if (!intVector4.verifyValidity(testCtx))
    408 		return;
    409 
    410 	if ((enableRef0 && (intVector4[0] != reference0)) ||
    411 		(enableRef1 && (intVector4[1] != reference1)) ||
    412 		(enableRef2 && (intVector4[2] != reference2)) ||
    413 		(enableRef3 && (intVector4[3] != reference3)))
    414 	{
    415 		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
    416 			<< (enableRef0?"":"(") << reference0 << (enableRef0?"":")") << ", "
    417 			<< (enableRef1?"":"(") << reference1 << (enableRef1?"":")") << ", "
    418 			<< (enableRef2?"":"(") << reference2 << (enableRef2?"":")") << ", "
    419 			<< (enableRef3?"":"(") << reference3 << (enableRef3?"":")")	<< TestLog::EndMessage;
    420 
    421 
    422 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    423 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    424 	}
    425 }
    426 
    427 void GetIntegerVerifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    428 {
    429 	using tcu::TestLog;
    430 
    431 	StateQueryMemoryWriteGuard<GLint> state;
    432 	glGetIntegerv(name, &state);
    433 
    434 	if (!state.verifyValidity(testCtx))
    435 		return;
    436 
    437 	if (state < reference)
    438 	{
    439 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << reference << "; got " << state << TestLog::EndMessage;
    440 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    441 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    442 	}
    443 }
    444 
    445 void GetIntegerVerifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
    446 {
    447 	using tcu::TestLog;
    448 
    449 	StateQueryMemoryWriteGuard<GLint> state;
    450 	glGetIntegerv(name, &state);
    451 
    452 	if (!state.verifyValidity(testCtx))
    453 		return;
    454 
    455 	if (GLuint(state) < reference)
    456 	{
    457 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << reference << "; got " << GLuint(state) << TestLog::EndMessage;
    458 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    459 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    460 	}
    461 }
    462 
    463 void GetIntegerVerifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    464 {
    465 	using tcu::TestLog;
    466 
    467 	StateQueryMemoryWriteGuard<GLint> state;
    468 	glGetIntegerv(name, &state);
    469 
    470 	if (!state.verifyValidity(testCtx))
    471 		return;
    472 
    473 	if (state > reference)
    474 	{
    475 		testCtx.getLog() << TestLog::Message << "// ERROR: expected less or equal to " << reference << "; got " << state << TestLog::EndMessage;
    476 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    477 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    478 	}
    479 }
    480 
    481 void GetIntegerVerifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
    482 {
    483 	using tcu::TestLog;
    484 
    485 	StateQueryMemoryWriteGuard<GLint[2]> intVector2;
    486 	glGetIntegerv(name, intVector2);
    487 
    488 	if (!intVector2.verifyValidity(testCtx))
    489 		return;
    490 
    491 	if (intVector2[0] < reference0 || intVector2[1] < reference1)
    492 	{
    493 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << reference0 << ", " << reference1 << "; got " << intVector2[0] << ", " << intVector2[0] << TestLog::EndMessage;
    494 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    495 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    496 	}
    497 }
    498 
    499 void GetIntegerVerifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
    500 {
    501 	using tcu::TestLog;
    502 
    503 	StateQueryMemoryWriteGuard<GLint> state;
    504 	glGetIntegerv(name, &state);
    505 
    506 	if (!state.verifyValidity(testCtx))
    507 		return;
    508 
    509 	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
    510 	{
    511 		const GLint expectedGLState = references[ndx];
    512 
    513 		if (state == expectedGLState)
    514 			return;
    515 	}
    516 
    517 	testCtx.getLog() << TestLog::Message << "// ERROR: got " << state << TestLog::EndMessage;
    518 	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    519 		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    520 }
    521 
    522 void GetIntegerVerifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
    523 {
    524 	using tcu::TestLog;
    525 
    526 	StateQueryMemoryWriteGuard<GLint> state;
    527 	glGetIntegerv(name, &state);
    528 
    529 	if (!state.verifyValidity(testCtx))
    530 		return;
    531 
    532 	const GLint reference = (1 << stencilBits) - 1;
    533 
    534 	if ((state & reference) != reference) // the least significant stencilBits bits should be on
    535 	{
    536 		testCtx.getLog() << TestLog::Message << "// ERROR: expected minimum mask of " << reference << "; got " << state << TestLog::EndMessage;
    537 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    538 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid mask value");
    539 	}
    540 }
    541 
    542 //GetInteger64Verifier
    543 
    544 class GetInteger64Verifier : public StateVerifier
    545 {
    546 public:
    547 			GetInteger64Verifier			(const glw::Functions& gl, tcu::TestLog& log);
    548 	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
    549 	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
    550 	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
    551 	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    552 	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
    553 	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    554 	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
    555 	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
    556 	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
    557 };
    558 
    559 GetInteger64Verifier::GetInteger64Verifier (const glw::Functions& gl, tcu::TestLog& log)
    560 	: StateVerifier(gl, log, "_getinteger64")
    561 {
    562 }
    563 
    564 void GetInteger64Verifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
    565 {
    566 	using tcu::TestLog;
    567 
    568 	StateQueryMemoryWriteGuard<GLint64> state;
    569 	glGetInteger64v(name, &state);
    570 
    571 	if (!state.verifyValidity(testCtx))
    572 		return;
    573 
    574 	if (state != GLint64(reference))
    575 	{
    576 		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
    577 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    578 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    579 	}
    580 }
    581 
    582 void GetInteger64Verifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
    583 {
    584 	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
    585 }
    586 
    587 void GetInteger64Verifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
    588 {
    589 	using tcu::TestLog;
    590 
    591 	StateQueryMemoryWriteGuard<GLint64[4]> intVector4;
    592 	glGetInteger64v(name, intVector4);
    593 
    594 	if (!intVector4.verifyValidity(testCtx))
    595 		return;
    596 
    597 	if ((enableRef0 && (intVector4[0] != GLint64(reference0))) ||
    598 		(enableRef1 && (intVector4[1] != GLint64(reference1))) ||
    599 		(enableRef2 && (intVector4[2] != GLint64(reference2))) ||
    600 		(enableRef3 && (intVector4[3] != GLint64(reference3))))
    601 	{
    602 		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
    603 			<< (enableRef0?"":"(") << reference0 << (enableRef0?"":")") << ", "
    604 			<< (enableRef1?"":"(") << reference1 << (enableRef1?"":")") << ", "
    605 			<< (enableRef2?"":"(") << reference2 << (enableRef2?"":")") << ", "
    606 			<< (enableRef3?"":"(") << reference3 << (enableRef3?"":")")	<< TestLog::EndMessage;
    607 
    608 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    609 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    610 	}
    611 }
    612 
    613 void GetInteger64Verifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    614 {
    615 	using tcu::TestLog;
    616 
    617 	StateQueryMemoryWriteGuard<GLint64> state;
    618 	glGetInteger64v(name, &state);
    619 
    620 	if (!state.verifyValidity(testCtx))
    621 		return;
    622 
    623 	if (state < GLint64(reference))
    624 	{
    625 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLint64(reference) << "; got " << state << TestLog::EndMessage;
    626 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    627 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    628 	}
    629 }
    630 
    631 void GetInteger64Verifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
    632 {
    633 	using tcu::TestLog;
    634 
    635 	StateQueryMemoryWriteGuard<GLint64> state;
    636 	glGetInteger64v(name, &state);
    637 
    638 	if (!state.verifyValidity(testCtx))
    639 		return;
    640 
    641 	if (GLuint(state) < GLint64(reference))
    642 	{
    643 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLint64(reference) << "; got " << GLuint(state) << TestLog::EndMessage;
    644 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    645 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    646 	}
    647 }
    648 
    649 void GetInteger64Verifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    650 {
    651 	using tcu::TestLog;
    652 
    653 	StateQueryMemoryWriteGuard<GLint64> state;
    654 	glGetInteger64v(name, &state);
    655 
    656 	if (!state.verifyValidity(testCtx))
    657 		return;
    658 
    659 	if (state > GLint64(reference))
    660 	{
    661 		testCtx.getLog() << TestLog::Message << "// ERROR: expected less or equal to " << GLint64(reference) << "; got " << state << TestLog::EndMessage;
    662 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    663 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    664 	}
    665 }
    666 
    667 void GetInteger64Verifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
    668 {
    669 	using tcu::TestLog;
    670 
    671 	StateQueryMemoryWriteGuard<GLint64[2]> intVector2;
    672 	glGetInteger64v(name, intVector2);
    673 
    674 	if (!intVector2.verifyValidity(testCtx))
    675 		return;
    676 
    677 	if (intVector2[0] < GLint64(reference0) || intVector2[1] < GLint64(reference1))
    678 	{
    679 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLint64(reference0) << ", " << GLint64(reference1) << "; got " << intVector2[0] << ", " << intVector2[1] << TestLog::EndMessage;
    680 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    681 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    682 	}
    683 }
    684 
    685 void GetInteger64Verifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
    686 {
    687 	using tcu::TestLog;
    688 
    689 	StateQueryMemoryWriteGuard<GLint64> state;
    690 	glGetInteger64v(name, &state);
    691 
    692 	if (!state.verifyValidity(testCtx))
    693 		return;
    694 
    695 	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
    696 	{
    697 		const GLint64 expectedGLState = GLint64(references[ndx]);
    698 
    699 		if (state == expectedGLState)
    700 			return;
    701 	}
    702 
    703 	testCtx.getLog() << TestLog::Message << "// ERROR: got " << state << TestLog::EndMessage;
    704 	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    705 		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
    706 }
    707 
    708 void GetInteger64Verifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
    709 {
    710 	using tcu::TestLog;
    711 
    712 	StateQueryMemoryWriteGuard<GLint64> state;
    713 	glGetInteger64v(name, &state);
    714 
    715 	if (!state.verifyValidity(testCtx))
    716 		return;
    717 
    718 	const GLint64 reference = (1ULL << stencilBits) - 1;
    719 
    720 	if ((state & reference) != reference) // the least significant stencilBits bits should be on
    721 	{
    722 		testCtx.getLog() << TestLog::Message << "// ERROR: expected mimimum mask of " << reference << "; got " << state << TestLog::EndMessage;
    723 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    724 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid mask value");
    725 	}
    726 }
    727 
    728 //GetFloatVerifier
    729 
    730 class GetFloatVerifier : public StateVerifier
    731 {
    732 public:
    733 			GetFloatVerifier				(const glw::Functions& gl, tcu::TestLog& log);
    734 	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
    735 	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
    736 	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
    737 	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    738 	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
    739 	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
    740 	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
    741 	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
    742 	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
    743 };
    744 
    745 GetFloatVerifier::GetFloatVerifier (const glw::Functions& gl, tcu::TestLog& log)
    746 	: StateVerifier(gl, log, "_getfloat")
    747 {
    748 }
    749 
    750 void GetFloatVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
    751 {
    752 	using tcu::TestLog;
    753 
    754 	const GLfloat referenceAsFloat = GLfloat(reference);
    755 	DE_ASSERT(reference == GLint(referenceAsFloat)); // reference integer must have 1:1 mapping to float for this to work. Reference value is always such value in these tests
    756 
    757 	StateQueryMemoryWriteGuard<GLfloat> state;
    758 	glGetFloatv(name, &state);
    759 
    760 	if (!state.verifyValidity(testCtx))
    761 		return;
    762 
    763 	if (state != referenceAsFloat)
    764 	{
    765 		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << referenceAsFloat << "; got " << state << TestLog::EndMessage;
    766 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    767 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    768 	}
    769 }
    770 
    771 void GetFloatVerifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
    772 {
    773 	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
    774 }
    775 
    776 void GetFloatVerifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
    777 {
    778 	using tcu::TestLog;
    779 
    780 	StateQueryMemoryWriteGuard<GLfloat[4]> floatVector4;
    781 	glGetFloatv(name, floatVector4);
    782 
    783 	if (!floatVector4.verifyValidity(testCtx))
    784 		return;
    785 
    786 	if ((enableRef0 && (floatVector4[0] != GLfloat(reference0))) ||
    787 		(enableRef1 && (floatVector4[1] != GLfloat(reference1))) ||
    788 		(enableRef2 && (floatVector4[2] != GLfloat(reference2))) ||
    789 		(enableRef3 && (floatVector4[3] != GLfloat(reference3))))
    790 	{
    791 		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
    792 			<< (enableRef0?"":"(") << GLfloat(reference0) << (enableRef0?"":")") << ", "
    793 			<< (enableRef1?"":"(") << GLfloat(reference1) << (enableRef1?"":")") << ", "
    794 			<< (enableRef2?"":"(") << GLfloat(reference2) << (enableRef2?"":")") << ", "
    795 			<< (enableRef3?"":"(") << GLfloat(reference3) << (enableRef3?"":")") << TestLog::EndMessage;
    796 
    797 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    798 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    799 	}
    800 }
    801 
    802 void GetFloatVerifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    803 {
    804 	using tcu::TestLog;
    805 
    806 	StateQueryMemoryWriteGuard<GLfloat> state;
    807 	glGetFloatv(name, &state);
    808 
    809 	if (!state.verifyValidity(testCtx))
    810 		return;
    811 
    812 	if (state < GLfloat(reference))
    813 	{
    814 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLfloat(reference) << "; got " << state << TestLog::EndMessage;
    815 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    816 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    817 	}
    818 }
    819 
    820 void GetFloatVerifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
    821 {
    822 	using tcu::TestLog;
    823 
    824 	StateQueryMemoryWriteGuard<GLfloat> state;
    825 	glGetFloatv(name, &state);
    826 
    827 	if (!state.verifyValidity(testCtx))
    828 		return;
    829 
    830 	if (state < GLfloat(reference))
    831 	{
    832 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLfloat(reference) << "; got " << state << TestLog::EndMessage;
    833 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    834 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    835 	}
    836 }
    837 
    838 void GetFloatVerifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
    839 {
    840 	using tcu::TestLog;
    841 
    842 	StateQueryMemoryWriteGuard<GLfloat> state;
    843 	glGetFloatv(name, &state);
    844 
    845 	if (!state.verifyValidity(testCtx))
    846 		return;
    847 
    848 	if (state > GLfloat(reference))
    849 	{
    850 		testCtx.getLog() << TestLog::Message << "// ERROR: expected less or equal to " << GLfloat(reference) << "; got " << state << TestLog::EndMessage;
    851 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    852 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    853 	}
    854 }
    855 
    856 void GetFloatVerifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
    857 {
    858 	using tcu::TestLog;
    859 
    860 	StateQueryMemoryWriteGuard<GLfloat[2]> floatVector2;
    861 	glGetFloatv(name, floatVector2);
    862 
    863 	if (!floatVector2.verifyValidity(testCtx))
    864 		return;
    865 
    866 	if (floatVector2[0] < GLfloat(reference0) || floatVector2[1] < GLfloat(reference1))
    867 	{
    868 		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLfloat(reference0) << ", " << GLfloat(reference1) << "; got " << floatVector2[0] << ", " << floatVector2[1] << TestLog::EndMessage;
    869 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    870 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    871 	}
    872 }
    873 
    874 void GetFloatVerifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
    875 {
    876 	using tcu::TestLog;
    877 
    878 	StateQueryMemoryWriteGuard<GLfloat> state;
    879 	glGetFloatv(name, &state);
    880 
    881 	if (!state.verifyValidity(testCtx))
    882 		return;
    883 
    884 	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
    885 	{
    886 		const GLfloat expectedGLState = GLfloat(references[ndx]);
    887 		DE_ASSERT(references[ndx] == GLint(expectedGLState)); // reference integer must have 1:1 mapping to float for this to work. Reference value is always such value in these tests
    888 
    889 		if (state == expectedGLState)
    890 			return;
    891 	}
    892 
    893 	testCtx.getLog() << TestLog::Message << "// ERROR: got " << state << TestLog::EndMessage;
    894 	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    895 		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
    896 }
    897 
    898 void GetFloatVerifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
    899 {
    900 	// checking the mask bits with float doesn't make much sense because of conversion errors
    901 	// just verify that the value is greater or equal to the minimum value
    902 	const GLint reference = (1 << stencilBits) - 1;
    903 	verifyIntegerGreaterOrEqual(testCtx, name, reference);
    904 }
    905 
    906 } // IntegerStateQueryVerifiers
    907 
    908 namespace
    909 {
    910 
    911 using namespace IntegerStateQueryVerifiers;
    912 using namespace deqp::gls::StateQueryUtil;
    913 
    914 class ConstantMinimumValueTestCase : public ApiCase
    915 {
    916 public:
    917 	ConstantMinimumValueTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum targetName, GLint minValue)
    918 		: ApiCase		(context, name, description)
    919 		, m_targetName	(targetName)
    920 		, m_minValue	(minValue)
    921 		, m_verifier	(verifier)
    922 	{
    923 	}
    924 
    925 	void test (void)
    926 	{
    927 		m_verifier->verifyUnsignedIntegerGreaterOrEqual(m_testCtx, m_targetName, m_minValue);
    928 		expectError(GL_NO_ERROR);
    929 	}
    930 
    931 private:
    932 	GLenum			m_targetName;
    933 	GLint			m_minValue;
    934 	StateVerifier*	m_verifier;
    935 };
    936 
    937 class ConstantMaximumValueTestCase : public ApiCase
    938 {
    939 public:
    940 	ConstantMaximumValueTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum targetName, GLint minValue)
    941 		: ApiCase		(context, name, description)
    942 		, m_targetName	(targetName)
    943 		, m_minValue	(minValue)
    944 		, m_verifier	(verifier)
    945 	{
    946 	}
    947 
    948 	void test (void)
    949 	{
    950 		m_verifier->verifyIntegerLessOrEqual(m_testCtx, m_targetName, m_minValue);
    951 		expectError(GL_NO_ERROR);
    952 	}
    953 
    954 private:
    955 	GLenum			m_targetName;
    956 	GLint			m_minValue;
    957 	StateVerifier*	m_verifier;
    958 };
    959 
    960 class SampleBuffersTestCase : public ApiCase
    961 {
    962 public:
    963 	SampleBuffersTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
    964 		: ApiCase		(context, name, description)
    965 		, m_verifier	(verifier)
    966 	{
    967 	}
    968 
    969 	void test (void)
    970 	{
    971 		const int expectedSampleBuffers = (m_context.getRenderTarget().getNumSamples() > 1) ? 1 : 0;
    972 
    973 		m_log << tcu::TestLog::Message << "Sample count is " << (m_context.getRenderTarget().getNumSamples()) << ", expecting GL_SAMPLE_BUFFERS to be " << expectedSampleBuffers << tcu::TestLog::EndMessage;
    974 
    975 		m_verifier->verifyInteger(m_testCtx, GL_SAMPLE_BUFFERS, expectedSampleBuffers);
    976 		expectError(GL_NO_ERROR);
    977 	}
    978 
    979 private:
    980 	StateVerifier*	m_verifier;
    981 };
    982 
    983 class SamplesTestCase : public ApiCase
    984 {
    985 public:
    986 	SamplesTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
    987 		: ApiCase		(context, name, description)
    988 		, m_verifier	(verifier)
    989 	{
    990 	}
    991 
    992 	void test (void)
    993 	{
    994 		// MSAA?
    995 		if (m_context.getRenderTarget().getNumSamples() > 1)
    996 		{
    997 			m_log << tcu::TestLog::Message << "Sample count is " << (m_context.getRenderTarget().getNumSamples()) << tcu::TestLog::EndMessage;
    998 
    999 			m_verifier->verifyInteger(m_testCtx, GL_SAMPLES, m_context.getRenderTarget().getNumSamples());
   1000 			expectError(GL_NO_ERROR);
   1001 		}
   1002 		else
   1003 		{
   1004 			const glw::GLint validSamples[] = {0, 1};
   1005 
   1006 			m_log << tcu::TestLog::Message << "Expecting GL_SAMPLES to be 0 or 1" << tcu::TestLog::EndMessage;
   1007 
   1008 			m_verifier->verifyIntegerAnyOf(m_testCtx, GL_SAMPLES, validSamples, DE_LENGTH_OF_ARRAY(validSamples));
   1009 			expectError(GL_NO_ERROR);
   1010 		}
   1011 	}
   1012 
   1013 private:
   1014 	StateVerifier*	m_verifier;
   1015 };
   1016 
   1017 class HintTestCase : public ApiCase
   1018 {
   1019 public:
   1020 	HintTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum targetName)
   1021 		: ApiCase		(context, name, description)
   1022 		, m_targetName	(targetName)
   1023 		, m_verifier	(verifier)
   1024 	{
   1025 	}
   1026 
   1027 	void test (void)
   1028 	{
   1029 		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_DONT_CARE);
   1030 		expectError(GL_NO_ERROR);
   1031 
   1032 		glHint(m_targetName, GL_NICEST);
   1033 		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_NICEST);
   1034 		expectError(GL_NO_ERROR);
   1035 
   1036 		glHint(m_targetName, GL_FASTEST);
   1037 		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_FASTEST);
   1038 		expectError(GL_NO_ERROR);
   1039 
   1040 		glHint(m_targetName, GL_DONT_CARE);
   1041 		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_DONT_CARE);
   1042 		expectError(GL_NO_ERROR);
   1043 	}
   1044 
   1045 private:
   1046 	GLenum		m_targetName;
   1047 	StateVerifier*	m_verifier;
   1048 };
   1049 
   1050 class DepthFuncTestCase : public ApiCase
   1051 {
   1052 public:
   1053 	DepthFuncTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1054 		: ApiCase		(context, name, description)
   1055 		, m_verifier	(verifier)
   1056 	{
   1057 	}
   1058 
   1059 	void test (void)
   1060 	{
   1061 		m_verifier->verifyInteger(m_testCtx, GL_DEPTH_FUNC, GL_LESS);
   1062 		expectError(GL_NO_ERROR);
   1063 
   1064 		const GLenum depthFunctions[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GREATER, GL_GEQUAL, GL_NOTEQUAL};
   1065 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthFunctions); ndx++)
   1066 		{
   1067 			glDepthFunc(depthFunctions[ndx]);
   1068 			expectError(GL_NO_ERROR);
   1069 
   1070 			m_verifier->verifyInteger(m_testCtx, GL_DEPTH_FUNC, depthFunctions[ndx]);
   1071 			expectError(GL_NO_ERROR);
   1072 		}
   1073 	}
   1074 
   1075 private:
   1076 	StateVerifier*	m_verifier;
   1077 };
   1078 
   1079 class CullFaceTestCase : public ApiCase
   1080 {
   1081 public:
   1082 	CullFaceTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1083 		: ApiCase		(context, name, description)
   1084 		, m_verifier	(verifier)
   1085 	{
   1086 	}
   1087 
   1088 	void test (void)
   1089 	{
   1090 		m_verifier->verifyInteger(m_testCtx, GL_CULL_FACE_MODE, GL_BACK);
   1091 		expectError(GL_NO_ERROR);
   1092 
   1093 		const GLenum cullFaces[] = {GL_FRONT, GL_BACK, GL_FRONT_AND_BACK};
   1094 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(cullFaces); ndx++)
   1095 		{
   1096 			glCullFace(cullFaces[ndx]);
   1097 			expectError(GL_NO_ERROR);
   1098 
   1099 			m_verifier->verifyInteger(m_testCtx, GL_CULL_FACE_MODE, cullFaces[ndx]);
   1100 			expectError(GL_NO_ERROR);
   1101 		}
   1102 	}
   1103 
   1104 private:
   1105 	StateVerifier*	m_verifier;
   1106 };
   1107 
   1108 class FrontFaceTestCase : public ApiCase
   1109 {
   1110 public:
   1111 	FrontFaceTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1112 		: ApiCase		(context, name, description)
   1113 		, m_verifier	(verifier)
   1114 	{
   1115 	}
   1116 
   1117 	void test (void)
   1118 	{
   1119 		m_verifier->verifyInteger(m_testCtx, GL_FRONT_FACE, GL_CCW);
   1120 		expectError(GL_NO_ERROR);
   1121 
   1122 		const GLenum frontFaces[] = {GL_CW, GL_CCW};
   1123 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(frontFaces); ndx++)
   1124 		{
   1125 			glFrontFace(frontFaces[ndx]);
   1126 			expectError(GL_NO_ERROR);
   1127 
   1128 			m_verifier->verifyInteger(m_testCtx, GL_FRONT_FACE, frontFaces[ndx]);
   1129 			expectError(GL_NO_ERROR);
   1130 		}
   1131 	}
   1132 
   1133 private:
   1134 	StateVerifier*	m_verifier;
   1135 };
   1136 
   1137 class ViewPortTestCase : public ApiCase
   1138 {
   1139 public:
   1140 	ViewPortTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1141 		: ApiCase		(context, name, description)
   1142 		, m_verifier	(verifier)
   1143 	{
   1144 	}
   1145 
   1146 	void test (void)
   1147 	{
   1148 		de::Random rnd(0xabcdef);
   1149 
   1150 		GLint maxViewportDimensions[2] = {0};
   1151 		GLfloat viewportBoundsRange[2] = {0.0f};
   1152 		GLboolean hasViewportArray = false;
   1153 		glGetIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportDimensions);
   1154 		hasViewportArray = m_context.getContextInfo().isExtensionSupported("GL_OES_viewport_array") ||
   1155 						   m_context.getContextInfo().isExtensionSupported("GL_NV_viewport_array");
   1156 		if (hasViewportArray)
   1157 		{
   1158 			glGetFloatv(GL_VIEWPORT_BOUNDS_RANGE, viewportBoundsRange);
   1159 		}
   1160 
   1161 		// verify initial value of first two values
   1162 		m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, 0, 0, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight());
   1163 		expectError(GL_NO_ERROR);
   1164 
   1165 		const int numIterations = 120;
   1166 		for (int i = 0; i < numIterations; ++i)
   1167 		{
   1168 			GLint x			= rnd.getInt(-64000, 64000);
   1169 			GLint y			= rnd.getInt(-64000, 64000);
   1170 			GLsizei width	= rnd.getInt(0, maxViewportDimensions[0]);
   1171 			GLsizei height	= rnd.getInt(0, maxViewportDimensions[1]);
   1172 
   1173 			glViewport(x, y, width, height);
   1174 
   1175 			if (hasViewportArray)
   1176 			{
   1177 				m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT,
   1178 										   de::clamp(x, deFloorFloatToInt32(viewportBoundsRange[0]), deFloorFloatToInt32(viewportBoundsRange[1])),
   1179 										   de::clamp(y, deFloorFloatToInt32(viewportBoundsRange[0]), deFloorFloatToInt32(viewportBoundsRange[1])),
   1180 										   width, height);
   1181 			}
   1182 			else
   1183 			{
   1184 				m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, x, y, width, height);
   1185 			}
   1186 
   1187 			expectError(GL_NO_ERROR);
   1188 		}
   1189 	}
   1190 
   1191 private:
   1192 	StateVerifier*	m_verifier;
   1193 };
   1194 
   1195 class ScissorBoxTestCase : public ApiCase
   1196 {
   1197 public:
   1198 	ScissorBoxTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1199 		: ApiCase		(context, name, description)
   1200 		, m_verifier	(verifier)
   1201 	{
   1202 	}
   1203 
   1204 	void test (void)
   1205 	{
   1206 		de::Random rnd(0xabcdef);
   1207 
   1208 		// verify initial value of first two values
   1209 		m_verifier->verifyInteger4Mask(m_testCtx, GL_SCISSOR_BOX, 0, true, 0, true, 0, false, 0, false);
   1210 		expectError(GL_NO_ERROR);
   1211 
   1212 		const int numIterations = 120;
   1213 		for (int i = 0; i < numIterations; ++i)
   1214 		{
   1215 			GLint left		= rnd.getInt(-64000, 64000);
   1216 			GLint bottom	= rnd.getInt(-64000, 64000);
   1217 			GLsizei width	= rnd.getInt(0, 64000);
   1218 			GLsizei height	= rnd.getInt(0, 64000);
   1219 
   1220 			glScissor(left, bottom, width, height);
   1221 			m_verifier->verifyInteger4(m_testCtx, GL_SCISSOR_BOX, left, bottom, width, height);
   1222 			expectError(GL_NO_ERROR);
   1223 		}
   1224 	}
   1225 private:
   1226 	StateVerifier*	m_verifier;
   1227 };
   1228 
   1229 class MaxViewportDimsTestCase : public ApiCase
   1230 {
   1231 public:
   1232 	MaxViewportDimsTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1233 		: ApiCase		(context, name, description)
   1234 		, m_verifier	(verifier)
   1235 	{
   1236 	}
   1237 
   1238 	void test (void)
   1239 	{
   1240 		m_verifier->verifyIntegerGreaterOrEqual2(m_testCtx, GL_MAX_VIEWPORT_DIMS, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight());
   1241 		expectError(GL_NO_ERROR);
   1242 	}
   1243 private:
   1244 	StateVerifier*	m_verifier;
   1245 };
   1246 
   1247 class StencilRefTestCase : public ApiCase
   1248 {
   1249 public:
   1250 	StencilRefTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
   1251 		: ApiCase			(context, name, description)
   1252 		, m_verifier		(verifier)
   1253 		, m_testTargetName	(testTargetName)
   1254 	{
   1255 	}
   1256 
   1257 	void test (void)
   1258 	{
   1259 		m_verifier->verifyInteger(m_testCtx, m_testTargetName, 0);
   1260 		expectError(GL_NO_ERROR);
   1261 
   1262 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   1263 
   1264 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   1265 		{
   1266 			const int ref = 1 << stencilBit;
   1267 
   1268 			glStencilFunc(GL_ALWAYS, ref, 0); // mask should not affect the REF
   1269 			expectError(GL_NO_ERROR);
   1270 
   1271 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
   1272 			expectError(GL_NO_ERROR);
   1273 
   1274 			glStencilFunc(GL_ALWAYS, ref, ref);
   1275 			expectError(GL_NO_ERROR);
   1276 
   1277 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
   1278 			expectError(GL_NO_ERROR);
   1279 		}
   1280 	}
   1281 
   1282 private:
   1283 	StateVerifier*	m_verifier;
   1284 	GLenum		m_testTargetName;
   1285 };
   1286 
   1287 class StencilRefSeparateTestCase : public ApiCase
   1288 {
   1289 public:
   1290 	StencilRefSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum stencilFuncTargetFace)
   1291 		: ApiCase					(context, name, description)
   1292 		, m_verifier				(verifier)
   1293 		, m_testTargetName			(testTargetName)
   1294 		, m_stencilFuncTargetFace	(stencilFuncTargetFace)
   1295 	{
   1296 	}
   1297 
   1298 	void test (void)
   1299 	{
   1300 		m_verifier->verifyInteger(m_testCtx, m_testTargetName, 0);
   1301 		expectError(GL_NO_ERROR);
   1302 
   1303 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   1304 
   1305 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   1306 		{
   1307 			const int ref = 1 << stencilBit;
   1308 
   1309 			glStencilFuncSeparate(m_stencilFuncTargetFace, GL_ALWAYS, ref, 0);
   1310 			expectError(GL_NO_ERROR);
   1311 
   1312 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
   1313 			expectError(GL_NO_ERROR);
   1314 
   1315 			glStencilFuncSeparate(m_stencilFuncTargetFace, GL_ALWAYS, ref, ref);
   1316 			expectError(GL_NO_ERROR);
   1317 
   1318 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
   1319 			expectError(GL_NO_ERROR);
   1320 		}
   1321 	}
   1322 private:
   1323 	StateVerifier*	m_verifier;
   1324 	GLenum		m_testTargetName;
   1325 	GLenum		m_stencilFuncTargetFace;
   1326 };
   1327 
   1328 class StencilOpTestCase : public ApiCase
   1329 {
   1330 public:
   1331 	StencilOpTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum stencilOpName)
   1332 		: ApiCase					(context, name, description)
   1333 		, m_verifier				(verifier)
   1334 		, m_stencilOpName			(stencilOpName)
   1335 	{
   1336 	}
   1337 
   1338 	void test (void)
   1339 	{
   1340 		m_verifier->verifyInteger(m_testCtx, m_stencilOpName, GL_KEEP);
   1341 		expectError(GL_NO_ERROR);
   1342 
   1343 		const GLenum stencilOpValues[] = {GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP};
   1344 
   1345 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilOpValues); ++ndx)
   1346 		{
   1347 			SetStencilOp(stencilOpValues[ndx]);
   1348 			expectError(GL_NO_ERROR);
   1349 
   1350 			m_verifier->verifyInteger(m_testCtx, m_stencilOpName, stencilOpValues[ndx]);
   1351 			expectError(GL_NO_ERROR);
   1352 		}
   1353 	}
   1354 
   1355 protected:
   1356 	virtual void SetStencilOp (GLenum stencilOpValue)
   1357 	{
   1358 		switch (m_stencilOpName)
   1359 		{
   1360 		case GL_STENCIL_FAIL:
   1361 		case GL_STENCIL_BACK_FAIL:
   1362 			glStencilOp(stencilOpValue, GL_KEEP, GL_KEEP);
   1363 			break;
   1364 
   1365 		case GL_STENCIL_PASS_DEPTH_FAIL:
   1366 		case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
   1367 			glStencilOp(GL_KEEP, stencilOpValue, GL_KEEP);
   1368 			break;
   1369 
   1370 		case GL_STENCIL_PASS_DEPTH_PASS:
   1371 		case GL_STENCIL_BACK_PASS_DEPTH_PASS:
   1372 			glStencilOp(GL_KEEP, GL_KEEP, stencilOpValue);
   1373 			break;
   1374 
   1375 		default:
   1376 			DE_ASSERT(false && "should not happen");
   1377 			break;
   1378 		}
   1379 	}
   1380 
   1381 	StateVerifier*				m_verifier;
   1382 	GLenum					m_stencilOpName;
   1383 };
   1384 
   1385 
   1386 class StencilOpSeparateTestCase : public StencilOpTestCase
   1387 {
   1388 public:
   1389 	StencilOpSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum stencilOpName, GLenum stencilOpFace)
   1390 		: StencilOpTestCase		(context, verifier, name, description, stencilOpName)
   1391 		, m_stencilOpFace		(stencilOpFace)
   1392 	{
   1393 	}
   1394 
   1395 private:
   1396 	void SetStencilOp (GLenum stencilOpValue)
   1397 	{
   1398 		switch (m_stencilOpName)
   1399 		{
   1400 		case GL_STENCIL_FAIL:
   1401 		case GL_STENCIL_BACK_FAIL:
   1402 			glStencilOpSeparate(m_stencilOpFace, stencilOpValue, GL_KEEP, GL_KEEP);
   1403 			break;
   1404 
   1405 		case GL_STENCIL_PASS_DEPTH_FAIL:
   1406 		case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
   1407 			glStencilOpSeparate(m_stencilOpFace, GL_KEEP, stencilOpValue, GL_KEEP);
   1408 			break;
   1409 
   1410 		case GL_STENCIL_PASS_DEPTH_PASS:
   1411 		case GL_STENCIL_BACK_PASS_DEPTH_PASS:
   1412 			glStencilOpSeparate(m_stencilOpFace, GL_KEEP, GL_KEEP, stencilOpValue);
   1413 			break;
   1414 
   1415 		default:
   1416 			DE_ASSERT(false && "should not happen");
   1417 			break;
   1418 		}
   1419 	}
   1420 
   1421 	GLenum		m_stencilOpFace;
   1422 };
   1423 
   1424 class StencilFuncTestCase : public ApiCase
   1425 {
   1426 public:
   1427 	StencilFuncTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   1428 		: ApiCase		(context, name, description)
   1429 		, m_verifier	(verifier)
   1430 	{
   1431 	}
   1432 
   1433 	void test (void)
   1434 	{
   1435 		m_verifier->verifyInteger(m_testCtx, GL_STENCIL_FUNC, GL_ALWAYS);
   1436 		expectError(GL_NO_ERROR);
   1437 
   1438 		const GLenum stencilfuncValues[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL};
   1439 
   1440 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilfuncValues); ++ndx)
   1441 		{
   1442 			glStencilFunc(stencilfuncValues[ndx], 0, 0);
   1443 			expectError(GL_NO_ERROR);
   1444 
   1445 			m_verifier->verifyInteger(m_testCtx, GL_STENCIL_FUNC, stencilfuncValues[ndx]);
   1446 			expectError(GL_NO_ERROR);
   1447 
   1448 			m_verifier->verifyInteger(m_testCtx, GL_STENCIL_BACK_FUNC, stencilfuncValues[ndx]);
   1449 			expectError(GL_NO_ERROR);
   1450 		}
   1451 	}
   1452 private:
   1453 	StateVerifier*	m_verifier;
   1454 };
   1455 
   1456 class StencilFuncSeparateTestCase : public ApiCase
   1457 {
   1458 public:
   1459 	StencilFuncSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum stencilFuncName, GLenum stencilFuncFace)
   1460 		: ApiCase			(context, name, description)
   1461 		, m_verifier		(verifier)
   1462 		, m_stencilFuncName	(stencilFuncName)
   1463 		, m_stencilFuncFace	(stencilFuncFace)
   1464 	{
   1465 	}
   1466 
   1467 	void test (void)
   1468 	{
   1469 		m_verifier->verifyInteger(m_testCtx, m_stencilFuncName, GL_ALWAYS);
   1470 		expectError(GL_NO_ERROR);
   1471 
   1472 		const GLenum stencilfuncValues[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL};
   1473 
   1474 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilfuncValues); ++ndx)
   1475 		{
   1476 			glStencilFuncSeparate(m_stencilFuncFace, stencilfuncValues[ndx], 0, 0);
   1477 			expectError(GL_NO_ERROR);
   1478 
   1479 			m_verifier->verifyInteger(m_testCtx, m_stencilFuncName, stencilfuncValues[ndx]);
   1480 			expectError(GL_NO_ERROR);
   1481 		}
   1482 	}
   1483 private:
   1484 	StateVerifier*	m_verifier;
   1485 	GLenum		m_stencilFuncName;
   1486 	GLenum		m_stencilFuncFace;
   1487 };
   1488 
   1489 class StencilMaskTestCase : public ApiCase
   1490 {
   1491 public:
   1492 	StencilMaskTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
   1493 		: ApiCase			(context, name, description)
   1494 		, m_verifier		(verifier)
   1495 		, m_testTargetName	(testTargetName)
   1496 	{
   1497 	}
   1498 
   1499 	void test (void)
   1500 	{
   1501 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   1502 
   1503 		m_verifier->verifyStencilMaskInitial(m_testCtx, m_testTargetName, stencilBits);
   1504 		expectError(GL_NO_ERROR);
   1505 
   1506 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   1507 		{
   1508 			const int mask = 1 << stencilBit;
   1509 
   1510 			glStencilFunc(GL_ALWAYS, 0, mask);
   1511 			expectError(GL_NO_ERROR);
   1512 
   1513 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
   1514 			expectError(GL_NO_ERROR);
   1515 		}
   1516 	}
   1517 private:
   1518 	StateVerifier*	m_verifier;
   1519 	GLenum		m_testTargetName;
   1520 };
   1521 
   1522 class StencilMaskSeparateTestCase : public ApiCase
   1523 {
   1524 public:
   1525 	StencilMaskSeparateTestCase	(Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum stencilFuncTargetFace)
   1526 		: ApiCase					(context, name, description)
   1527 		, m_verifier				(verifier)
   1528 		, m_testTargetName			(testTargetName)
   1529 		, m_stencilFuncTargetFace	(stencilFuncTargetFace)
   1530 	{
   1531 	}
   1532 
   1533 	void test (void)
   1534 	{
   1535 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   1536 
   1537 		m_verifier->verifyStencilMaskInitial(m_testCtx, m_testTargetName, stencilBits);
   1538 		expectError(GL_NO_ERROR);
   1539 
   1540 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   1541 		{
   1542 			const int mask = 1 << stencilBit;
   1543 
   1544 			glStencilFuncSeparate(m_stencilFuncTargetFace, GL_ALWAYS, 0, mask);
   1545 			expectError(GL_NO_ERROR);
   1546 
   1547 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
   1548 			expectError(GL_NO_ERROR);
   1549 		}
   1550 	}
   1551 private:
   1552 	StateVerifier*	m_verifier;
   1553 	GLenum		m_testTargetName;
   1554 	GLenum		m_stencilFuncTargetFace;
   1555 };
   1556 
   1557 class StencilWriteMaskTestCase : public ApiCase
   1558 {
   1559 public:
   1560 	StencilWriteMaskTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
   1561 		: ApiCase			(context, name, description)
   1562 		, m_verifier		(verifier)
   1563 		, m_testTargetName	(testTargetName)
   1564 	{
   1565 	}
   1566 
   1567 	void test (void)
   1568 	{
   1569 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   1570 
   1571 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   1572 		{
   1573 			const int mask = 1 << stencilBit;
   1574 
   1575 			glStencilMask(mask);
   1576 			expectError(GL_NO_ERROR);
   1577 
   1578 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
   1579 			expectError(GL_NO_ERROR);
   1580 		}
   1581 	}
   1582 private:
   1583 	StateVerifier*	m_verifier;
   1584 	GLenum		m_testTargetName;
   1585 };
   1586 
   1587 class StencilWriteMaskSeparateTestCase : public ApiCase
   1588 {
   1589 public:
   1590 	StencilWriteMaskSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum stencilTargetFace)
   1591 		: ApiCase				(context, name, description)
   1592 		, m_verifier			(verifier)
   1593 		, m_testTargetName		(testTargetName)
   1594 		, m_stencilTargetFace	(stencilTargetFace)
   1595 	{
   1596 	}
   1597 
   1598 	void test (void)
   1599 	{
   1600 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   1601 
   1602 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   1603 		{
   1604 			const int mask = 1 << stencilBit;
   1605 
   1606 			glStencilMaskSeparate(m_stencilTargetFace, mask);
   1607 			expectError(GL_NO_ERROR);
   1608 
   1609 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
   1610 			expectError(GL_NO_ERROR);
   1611 		}
   1612 	}
   1613 private:
   1614 	StateVerifier*	m_verifier;
   1615 	GLenum		m_testTargetName;
   1616 	GLenum		m_stencilTargetFace;
   1617 };
   1618 
   1619 class PixelStoreTestCase : public ApiCase
   1620 {
   1621 public:
   1622 	PixelStoreTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
   1623 		: ApiCase			(context, name, description)
   1624 		, m_verifier		(verifier)
   1625 		, m_testTargetName	(testTargetName)
   1626 		, m_initialValue	(initialValue)
   1627 	{
   1628 	}
   1629 
   1630 	void test (void)
   1631 	{
   1632 		de::Random rnd(0xabcdef);
   1633 
   1634 		m_verifier->verifyInteger(m_testCtx, m_testTargetName, m_initialValue);
   1635 		expectError(GL_NO_ERROR);
   1636 
   1637 		const int numIterations = 120;
   1638 		for (int i = 0; i < numIterations; ++i)
   1639 		{
   1640 			const int referenceValue = rnd.getInt(0, 64000);
   1641 
   1642 			glPixelStorei(m_testTargetName, referenceValue);
   1643 			expectError(GL_NO_ERROR);
   1644 
   1645 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
   1646 			expectError(GL_NO_ERROR);
   1647 		}
   1648 	}
   1649 
   1650 private:
   1651 	StateVerifier*	m_verifier;
   1652 	GLenum		m_testTargetName;
   1653 	int			m_initialValue;
   1654 };
   1655 
   1656 class PixelStoreAlignTestCase : public ApiCase
   1657 {
   1658 public:
   1659 	PixelStoreAlignTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
   1660 		: ApiCase			(context, name, description)
   1661 		, m_verifier		(verifier)
   1662 		, m_testTargetName	(testTargetName)
   1663 	{
   1664 	}
   1665 
   1666 	void test (void)
   1667 	{
   1668 		m_verifier->verifyInteger(m_testCtx, m_testTargetName, 4);
   1669 		expectError(GL_NO_ERROR);
   1670 
   1671 		const int alignments[] = {1, 2, 4, 8};
   1672 
   1673 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(alignments); ++ndx)
   1674 		{
   1675 			const int referenceValue = alignments[ndx];
   1676 
   1677 			glPixelStorei(m_testTargetName, referenceValue);
   1678 			expectError(GL_NO_ERROR);
   1679 
   1680 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
   1681 			expectError(GL_NO_ERROR);
   1682 		}
   1683 	}
   1684 
   1685 private:
   1686 	StateVerifier*	m_verifier;
   1687 	GLenum		m_testTargetName;
   1688 };
   1689 
   1690 class BlendFuncTestCase : public ApiCase
   1691 {
   1692 public:
   1693 	BlendFuncTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
   1694 		: ApiCase			(context, name, description)
   1695 		, m_verifier		(verifier)
   1696 		, m_testTargetName	(testTargetName)
   1697 		, m_initialValue	(initialValue)
   1698 	{
   1699 	}
   1700 
   1701 	void test (void)
   1702 	{
   1703 		m_verifier->verifyInteger(m_testCtx, m_testTargetName, m_initialValue);
   1704 		expectError(GL_NO_ERROR);
   1705 
   1706 		const GLenum blendFuncValues[] =
   1707 		{
   1708 			GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR,
   1709 			GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR,
   1710 			GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA,
   1711 			GL_SRC_ALPHA_SATURATE
   1712 		};
   1713 
   1714 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(blendFuncValues); ++ndx)
   1715 		{
   1716 			const GLenum referenceValue = blendFuncValues[ndx];
   1717 
   1718 			SetBlendFunc(referenceValue);
   1719 			expectError(GL_NO_ERROR);
   1720 
   1721 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
   1722 			expectError(GL_NO_ERROR);
   1723 		}
   1724 	}
   1725 protected:
   1726 	virtual void SetBlendFunc (GLenum func)
   1727 	{
   1728 		switch (m_testTargetName)
   1729 		{
   1730 		case GL_BLEND_SRC_RGB:
   1731 		case GL_BLEND_SRC_ALPHA:
   1732 			glBlendFunc(func, GL_ZERO);
   1733 			break;
   1734 
   1735 		case GL_BLEND_DST_RGB:
   1736 		case GL_BLEND_DST_ALPHA:
   1737 			glBlendFunc(GL_ZERO, func);
   1738 			break;
   1739 
   1740 		default:
   1741 			DE_ASSERT(false && "should not happen");
   1742 			break;
   1743 		}
   1744 	}
   1745 
   1746 	StateVerifier*		m_verifier;
   1747 	GLenum			m_testTargetName;
   1748 	int				m_initialValue;
   1749 };
   1750 
   1751 class BlendFuncSeparateTestCase : public BlendFuncTestCase
   1752 {
   1753 public:
   1754 	BlendFuncSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
   1755 		: BlendFuncTestCase	(context, verifier, name, description, testTargetName, initialValue)
   1756 	{
   1757 	}
   1758 
   1759 	void SetBlendFunc (GLenum func)
   1760 	{
   1761 		switch (m_testTargetName)
   1762 		{
   1763 		case GL_BLEND_SRC_RGB:
   1764 			glBlendFuncSeparate(func, GL_ZERO, GL_ZERO, GL_ZERO);
   1765 			break;
   1766 
   1767 		case GL_BLEND_DST_RGB:
   1768 			glBlendFuncSeparate(GL_ZERO, func, GL_ZERO, GL_ZERO);
   1769 			break;
   1770 
   1771 		case GL_BLEND_SRC_ALPHA:
   1772 			glBlendFuncSeparate(GL_ZERO, GL_ZERO, func, GL_ZERO);
   1773 			break;
   1774 
   1775 		case GL_BLEND_DST_ALPHA:
   1776 			glBlendFuncSeparate(GL_ZERO, GL_ZERO, GL_ZERO, func);
   1777 			break;
   1778 
   1779 		default:
   1780 			DE_ASSERT(false && "should not happen");
   1781 			break;
   1782 		}
   1783 	}
   1784 };
   1785 
   1786 class BlendEquationTestCase : public ApiCase
   1787 {
   1788 public:
   1789 	BlendEquationTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
   1790 		: ApiCase			(context, name, description)
   1791 		, m_verifier		(verifier)
   1792 		, m_testTargetName	(testTargetName)
   1793 		, m_initialValue	(initialValue)
   1794 	{
   1795 	}
   1796 
   1797 	void test (void)
   1798 	{
   1799 		m_verifier->verifyInteger(m_testCtx, m_testTargetName, m_initialValue);
   1800 		expectError(GL_NO_ERROR);
   1801 
   1802 		const GLenum blendFuncValues[] =
   1803 		{
   1804 			GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN, GL_MAX
   1805 		};
   1806 
   1807 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(blendFuncValues); ++ndx)
   1808 		{
   1809 			const GLenum referenceValue = blendFuncValues[ndx];
   1810 
   1811 			SetBlendEquation(referenceValue);
   1812 			expectError(GL_NO_ERROR);
   1813 
   1814 			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
   1815 			expectError(GL_NO_ERROR);
   1816 		}
   1817 	}
   1818 protected:
   1819 	virtual void SetBlendEquation (GLenum equation)
   1820 	{
   1821 		glBlendEquation(equation);
   1822 	}
   1823 
   1824 	StateVerifier*		m_verifier;
   1825 	GLenum			m_testTargetName;
   1826 	int				m_initialValue;
   1827 };
   1828 class BlendEquationSeparateTestCase : public BlendEquationTestCase
   1829 {
   1830 public:
   1831 	BlendEquationSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
   1832 		: BlendEquationTestCase	(context, verifier, name, description, testTargetName, initialValue)
   1833 	{
   1834 	}
   1835 
   1836 protected:
   1837 	void SetBlendEquation (GLenum equation)
   1838 	{
   1839 		switch (m_testTargetName)
   1840 		{
   1841 		case GL_BLEND_EQUATION_RGB:
   1842 			glBlendEquationSeparate(equation, GL_FUNC_ADD);
   1843 			break;
   1844 
   1845 		case GL_BLEND_EQUATION_ALPHA:
   1846 			glBlendEquationSeparate(GL_FUNC_ADD, equation);
   1847 			break;
   1848 
   1849 		default:
   1850 			DE_ASSERT(false && "should not happen");
   1851 			break;
   1852 		}
   1853 	}
   1854 };
   1855 
   1856 class ImplementationArrayTestCase : public ApiCase
   1857 {
   1858 public:
   1859 	ImplementationArrayTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum testTargetLengthTargetName, int minValue)
   1860 		: ApiCase						(context, name, description)
   1861 		, m_verifier					(verifier)
   1862 		, m_testTargetName				(testTargetName)
   1863 		, m_testTargetLengthTargetName	(testTargetLengthTargetName)
   1864 		, m_minValue					(minValue)
   1865 	{
   1866 	}
   1867 
   1868 	void test (void)
   1869 	{
   1870 		m_verifier->verifyIntegerGreaterOrEqual(m_testCtx, m_testTargetLengthTargetName, m_minValue);
   1871 		expectError(GL_NO_ERROR);
   1872 
   1873 		GLint targetArrayLength = 0;
   1874 		glGetIntegerv(m_testTargetLengthTargetName, &targetArrayLength);
   1875 		expectError(GL_NO_ERROR);
   1876 
   1877 		if (targetArrayLength)
   1878 		{
   1879 			std::vector<GLint> queryResult;
   1880 			queryResult.resize(targetArrayLength, 0);
   1881 
   1882 			glGetIntegerv(m_testTargetName, &queryResult[0]);
   1883 			expectError(GL_NO_ERROR);
   1884 		}
   1885 	}
   1886 
   1887 private:
   1888 	StateVerifier*		m_verifier;
   1889 	GLenum			m_testTargetName;
   1890 	GLenum			m_testTargetLengthTargetName;
   1891 	int				m_minValue;
   1892 };
   1893 
   1894 class BindingTest : public TestCase
   1895 {
   1896 public:
   1897 						BindingTest	(Context&					context,
   1898 									 const char*				name,
   1899 									 const char*				desc,
   1900 									 QueryType					type);
   1901 
   1902 	IterateResult		iterate		(void);
   1903 
   1904 	virtual void		test		(glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
   1905 
   1906 protected:
   1907 	const QueryType		m_type;
   1908 };
   1909 
   1910 BindingTest::BindingTest (Context&		context,
   1911 						  const char*	name,
   1912 						  const char*	desc,
   1913 						  QueryType		type)
   1914 	: TestCase	(context, name, desc)
   1915 	, m_type	(type)
   1916 {
   1917 }
   1918 
   1919 BindingTest::IterateResult BindingTest::iterate (void)
   1920 {
   1921 	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
   1922 	tcu::ResultCollector	result	(m_context.getTestContext().getLog(), " // ERROR: ");
   1923 
   1924 	gl.enableLogging(true);
   1925 
   1926 	test(gl, result);
   1927 
   1928 	result.setTestContextResult(m_testCtx);
   1929 	return STOP;
   1930 }
   1931 
   1932 class TransformFeedbackBindingTestCase : public BindingTest
   1933 {
   1934 public:
   1935 	TransformFeedbackBindingTestCase (Context& context, QueryType type, const char* name)
   1936 		: BindingTest(context, name, "GL_TRANSFORM_FEEDBACK_BINDING", type)
   1937 	{
   1938 	}
   1939 
   1940 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   1941 	{
   1942 		static const char* transformFeedbackTestVertSource =
   1943 			"#version 300 es\n"
   1944 			"void main (void)\n"
   1945 			"{\n"
   1946 			"	gl_Position = vec4(0.0);\n"
   1947 			"}\n\0";
   1948 		static const char* transformFeedbackTestFragSource =
   1949 			"#version 300 es\n"
   1950 			"layout(location = 0) out mediump vec4 fragColor;"
   1951 			"void main (void)\n"
   1952 			"{\n"
   1953 			"	fragColor = vec4(0.0);\n"
   1954 			"}\n\0";
   1955 
   1956 		GLuint	shaderVert;
   1957 		GLuint	shaderFrag;
   1958 		GLuint	shaderProg;
   1959 		GLuint	transformfeedback = 0;
   1960 		GLuint	feedbackBufferId = 0;
   1961 
   1962 		{
   1963 			const tcu::ScopedLogSection section(gl.getLog(), "Initial", "Initial");
   1964 			verifyStateInteger(result, gl, GL_TRANSFORM_FEEDBACK_BINDING, 0, m_type);
   1965 		}
   1966 
   1967 		gl.glGenTransformFeedbacks(1, &transformfeedback);
   1968 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenTransformFeedbacks");
   1969 
   1970 		{
   1971 			const tcu::ScopedLogSection section(gl.getLog(), "VertexShader", "Vertex Shader");
   1972 
   1973 			GLint compileStatus = -1;
   1974 
   1975 			shaderVert = gl.glCreateShader(GL_VERTEX_SHADER);
   1976 			gl.glShaderSource(shaderVert, 1, &transformFeedbackTestVertSource, DE_NULL);
   1977 			gl.glCompileShader(shaderVert);
   1978 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glCompileShader");
   1979 
   1980 			gl.glGetShaderiv(shaderVert, GL_COMPILE_STATUS, &compileStatus);
   1981 			if (compileStatus != GL_TRUE)
   1982 				result.fail("expected GL_TRUE");
   1983 		}
   1984 		{
   1985 			const tcu::ScopedLogSection section(gl.getLog(), "FragmentShader", "Fragment Shader");
   1986 
   1987 			GLint compileStatus = -1;
   1988 
   1989 			shaderFrag = gl.glCreateShader(GL_FRAGMENT_SHADER);
   1990 			gl.glShaderSource(shaderFrag, 1, &transformFeedbackTestFragSource, DE_NULL);
   1991 			gl.glCompileShader(shaderFrag);
   1992 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glCompileShader");
   1993 
   1994 			gl.glGetShaderiv(shaderFrag, GL_COMPILE_STATUS, &compileStatus);
   1995 			if (compileStatus != GL_TRUE)
   1996 				result.fail("expected GL_TRUE");
   1997 		}
   1998 		{
   1999 			const tcu::ScopedLogSection section(gl.getLog(), "Program", "Create and bind program");
   2000 
   2001 			const char*	transform_feedback_outputs	= "gl_Position";
   2002 			GLint		linkStatus					= -1;
   2003 
   2004 			shaderProg = gl.glCreateProgram();
   2005 			gl.glAttachShader(shaderProg, shaderVert);
   2006 			gl.glAttachShader(shaderProg, shaderFrag);
   2007 			gl.glTransformFeedbackVaryings(shaderProg, 1, &transform_feedback_outputs, GL_INTERLEAVED_ATTRIBS);
   2008 			gl.glLinkProgram(shaderProg);
   2009 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glLinkProgram");
   2010 
   2011 			gl.glGetProgramiv(shaderProg, GL_LINK_STATUS, &linkStatus);
   2012 			if (linkStatus != GL_TRUE)
   2013 				result.fail("expected GL_TRUE");
   2014 		}
   2015 
   2016 		gl.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformfeedback);
   2017 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTransformFeedback");
   2018 
   2019 		gl.glGenBuffers(1, &feedbackBufferId);
   2020 		gl.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, feedbackBufferId);
   2021 		gl.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_DYNAMIC_READ);
   2022 		gl.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, feedbackBufferId);
   2023 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind buffers");
   2024 
   2025 		gl.glUseProgram(shaderProg);
   2026 
   2027 		verifyStateInteger(result, gl, GL_TRANSFORM_FEEDBACK_BINDING, transformfeedback, m_type);
   2028 
   2029 		gl.glUseProgram(0);
   2030 		gl.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
   2031 		gl.glDeleteTransformFeedbacks(1, &transformfeedback);
   2032 
   2033 		verifyStateInteger(result, gl, GL_TRANSFORM_FEEDBACK_BINDING, 0, m_type);
   2034 
   2035 		gl.glDeleteBuffers(1, &feedbackBufferId);
   2036 		gl.glDeleteShader(shaderVert);
   2037 		gl.glDeleteShader(shaderFrag);
   2038 		gl.glDeleteProgram(shaderProg);
   2039 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteProgram");
   2040 	}
   2041 };
   2042 
   2043 class CurrentProgramBindingTestCase : public BindingTest
   2044 {
   2045 public:
   2046 	CurrentProgramBindingTestCase (Context& context, QueryType type, const char* name, const char* description)
   2047 		: BindingTest(context, name, description, type)
   2048 	{
   2049 	}
   2050 
   2051 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2052 	{
   2053 		static const char* testVertSource =
   2054 			"#version 300 es\n"
   2055 			"void main (void)\n"
   2056 			"{\n"
   2057 			"	gl_Position = vec4(0.0);\n"
   2058 			"}\n\0";
   2059 		static const char* testFragSource =
   2060 			"#version 300 es\n"
   2061 			"layout(location = 0) out mediump vec4 fragColor;"
   2062 			"void main (void)\n"
   2063 			"{\n"
   2064 			"	fragColor = vec4(0.0);\n"
   2065 			"}\n\0";
   2066 
   2067 		GLuint	shaderVert;
   2068 		GLuint	shaderFrag;
   2069 		GLuint	shaderProg;
   2070 
   2071 		{
   2072 			const tcu::ScopedLogSection section(gl.getLog(), "Initial", "Initial");
   2073 
   2074 			verifyStateInteger(result, gl, GL_CURRENT_PROGRAM, 0, m_type);
   2075 		}
   2076 		{
   2077 			const tcu::ScopedLogSection section(gl.getLog(), "VertexShader", "Vertex Shader");
   2078 
   2079 			GLint compileStatus = -1;
   2080 
   2081 			shaderVert = gl.glCreateShader(GL_VERTEX_SHADER);
   2082 			gl.glShaderSource(shaderVert, 1, &testVertSource, DE_NULL);
   2083 			gl.glCompileShader(shaderVert);
   2084 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glCompileShader");
   2085 
   2086 			gl.glGetShaderiv(shaderVert, GL_COMPILE_STATUS, &compileStatus);
   2087 			if (compileStatus != GL_TRUE)
   2088 				result.fail("expected GL_TRUE");
   2089 		}
   2090 		{
   2091 			const tcu::ScopedLogSection section(gl.getLog(), "FragmentShader", "Fragment Shader");
   2092 
   2093 			GLint compileStatus = -1;
   2094 
   2095 			shaderFrag = gl.glCreateShader(GL_FRAGMENT_SHADER);
   2096 			gl.glShaderSource(shaderFrag, 1, &testFragSource, DE_NULL);
   2097 			gl.glCompileShader(shaderFrag);
   2098 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glCompileShader");
   2099 
   2100 			gl.glGetShaderiv(shaderFrag, GL_COMPILE_STATUS, &compileStatus);
   2101 			if (compileStatus != GL_TRUE)
   2102 				result.fail("expected GL_TRUE");
   2103 		}
   2104 		{
   2105 			const tcu::ScopedLogSection section(gl.getLog(), "Program", "Create and bind program");
   2106 
   2107 			GLint linkStatus = -1;
   2108 
   2109 			shaderProg = gl.glCreateProgram();
   2110 			gl.glAttachShader(shaderProg, shaderVert);
   2111 			gl.glAttachShader(shaderProg, shaderFrag);
   2112 			gl.glLinkProgram(shaderProg);
   2113 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glLinkProgram");
   2114 
   2115 			gl.glGetProgramiv(shaderProg, GL_LINK_STATUS, &linkStatus);
   2116 			if (linkStatus != GL_TRUE)
   2117 				result.fail("expected GL_TRUE");
   2118 
   2119 			gl.glUseProgram(shaderProg);
   2120 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glUseProgram");
   2121 
   2122 			verifyStateInteger(result, gl, GL_CURRENT_PROGRAM, shaderProg, m_type);
   2123 		}
   2124 		{
   2125 			const tcu::ScopedLogSection section(gl.getLog(), "Delete", "Delete program while in use");
   2126 
   2127 			gl.glDeleteShader(shaderVert);
   2128 			gl.glDeleteShader(shaderFrag);
   2129 			gl.glDeleteProgram(shaderProg);
   2130 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteProgram");
   2131 
   2132 			verifyStateInteger(result, gl, GL_CURRENT_PROGRAM, shaderProg, m_type);
   2133 		}
   2134 		{
   2135 			const tcu::ScopedLogSection section(gl.getLog(), "Unbind", "Unbind program");
   2136 			gl.glUseProgram(0);
   2137 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glUseProgram");
   2138 
   2139 			verifyStateInteger(result, gl, GL_CURRENT_PROGRAM, 0, m_type);
   2140 		}
   2141 	}
   2142 };
   2143 
   2144 class VertexArrayBindingTestCase : public BindingTest
   2145 {
   2146 public:
   2147 	VertexArrayBindingTestCase (Context& context, QueryType type, const char* name, const char* description)
   2148 		: BindingTest(context, name, description, type)
   2149 	{
   2150 	}
   2151 
   2152 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2153 	{
   2154 		verifyStateInteger(result, gl, GL_VERTEX_ARRAY_BINDING, 0, m_type);
   2155 
   2156 		GLuint vertexArrayObject = 0;
   2157 		gl.glGenVertexArrays(1, &vertexArrayObject);
   2158 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenVertexArrays");
   2159 
   2160 		gl.glBindVertexArray(vertexArrayObject);
   2161 		verifyStateInteger(result, gl, GL_VERTEX_ARRAY_BINDING, vertexArrayObject, m_type);
   2162 
   2163 		gl.glDeleteVertexArrays(1, &vertexArrayObject);
   2164 		verifyStateInteger(result, gl, GL_VERTEX_ARRAY_BINDING, 0, m_type);
   2165 	}
   2166 };
   2167 
   2168 class BufferBindingTestCase : public BindingTest
   2169 {
   2170 public:
   2171 	BufferBindingTestCase (Context& context, QueryType type, const char* name, const char* description, GLenum bufferBindingName, GLenum bufferType)
   2172 		: BindingTest			(context, name, description, type)
   2173 		, m_bufferBindingName	(bufferBindingName)
   2174 		, m_bufferType			(bufferType)
   2175 	{
   2176 	}
   2177 
   2178 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2179 	{
   2180 		verifyStateInteger(result, gl, m_bufferBindingName, 0, m_type);
   2181 
   2182 		GLuint bufferObject = 0;
   2183 		gl.glGenBuffers(1, &bufferObject);
   2184 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenBuffers");
   2185 
   2186 		gl.glBindBuffer(m_bufferType, bufferObject);
   2187 		verifyStateInteger(result, gl, m_bufferBindingName, bufferObject, m_type);
   2188 
   2189 		gl.glDeleteBuffers(1, &bufferObject);
   2190 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteBuffers");
   2191 
   2192 		verifyStateInteger(result, gl, m_bufferBindingName, 0, m_type);
   2193 	}
   2194 
   2195 private:
   2196 	const GLenum	m_bufferBindingName;
   2197 	const GLenum	m_bufferType;
   2198 };
   2199 
   2200 class ElementArrayBufferBindingTestCase : public BindingTest
   2201 {
   2202 public:
   2203 	ElementArrayBufferBindingTestCase (Context& context, QueryType type, const char* name)
   2204 		: BindingTest(context, name, "GL_ELEMENT_ARRAY_BUFFER_BINDING", type)
   2205 	{
   2206 	}
   2207 
   2208 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2209 	{
   2210 		// Test with default VAO
   2211 		{
   2212 			const tcu::ScopedLogSection section(gl.getLog(), "DefaultVAO", "Test with default VAO");
   2213 
   2214 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, m_type);
   2215 
   2216 			GLuint bufferObject = 0;
   2217 			gl.glGenBuffers(1, &bufferObject);
   2218 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenBuffers");
   2219 
   2220 			gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObject);
   2221 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, bufferObject, m_type);
   2222 
   2223 			gl.glDeleteBuffers(1, &bufferObject);
   2224 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, m_type);
   2225 		}
   2226 
   2227 		// Test with multiple VAOs
   2228 		{
   2229 			const tcu::ScopedLogSection section(gl.getLog(), "WithVAO", "Test with VAO");
   2230 
   2231 			GLuint vaos[2]		= {0};
   2232 			GLuint buffers[2]	= {0};
   2233 
   2234 			gl.glGenVertexArrays(2, vaos);
   2235 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenVertexArrays");
   2236 
   2237 			gl.glGenBuffers(2, buffers);
   2238 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenBuffers");
   2239 
   2240 			// initial
   2241 			gl.glBindVertexArray(vaos[0]);
   2242 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, m_type);
   2243 
   2244 			// after setting
   2245 			gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[0]);
   2246 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[0], m_type);
   2247 
   2248 			// initial of vao 2
   2249 			gl.glBindVertexArray(vaos[1]);
   2250 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, m_type);
   2251 
   2252 			// after setting to 2
   2253 			gl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
   2254 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[1], m_type);
   2255 
   2256 			// vao 1 still has buffer 1 bound?
   2257 			gl.glBindVertexArray(vaos[0]);
   2258 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[0], m_type);
   2259 
   2260 			// deleting clears from bound vaos ...
   2261 			gl.glDeleteBuffers(2, buffers);
   2262 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, m_type);
   2263 
   2264 			// ... but does not from non-bound vaos?
   2265 			gl.glBindVertexArray(vaos[1]);
   2266 			verifyStateInteger(result, gl, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[1], m_type);
   2267 
   2268 			gl.glDeleteVertexArrays(2, vaos);
   2269 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteVertexArrays");
   2270 		}
   2271 	}
   2272 };
   2273 
   2274 class StencilClearValueTestCase : public ApiCase
   2275 {
   2276 public:
   2277 	StencilClearValueTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   2278 		: ApiCase		(context, name, description)
   2279 		, m_verifier	(verifier)
   2280 	{
   2281 	}
   2282 
   2283 	void test (void)
   2284 	{
   2285 		m_verifier->verifyInteger(m_testCtx, GL_STENCIL_CLEAR_VALUE, 0);
   2286 		expectError(GL_NO_ERROR);
   2287 
   2288 		const int stencilBits = m_context.getRenderTarget().getStencilBits();
   2289 
   2290 		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
   2291 		{
   2292 			const int ref = 1 << stencilBit;
   2293 
   2294 			glClearStencil(ref); // mask should not affect the REF
   2295 			expectError(GL_NO_ERROR);
   2296 
   2297 			m_verifier->verifyInteger(m_testCtx, GL_STENCIL_CLEAR_VALUE, ref);
   2298 			expectError(GL_NO_ERROR);
   2299 		}
   2300 	}
   2301 
   2302 private:
   2303 	StateVerifier*	m_verifier;
   2304 };
   2305 
   2306 class ActiveTextureTestCase : public ApiCase
   2307 {
   2308 public:
   2309 	ActiveTextureTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   2310 		: ApiCase		(context, name, description)
   2311 		, m_verifier	(verifier)
   2312 	{
   2313 	}
   2314 
   2315 	void test (void)
   2316 	{
   2317 		m_verifier->verifyInteger(m_testCtx, GL_ACTIVE_TEXTURE, GL_TEXTURE0);
   2318 		expectError(GL_NO_ERROR);
   2319 
   2320 		GLint textureUnits = 0;
   2321 		glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &textureUnits);
   2322 		expectError(GL_NO_ERROR);
   2323 
   2324 		for (int ndx = 0; ndx < textureUnits; ++ndx)
   2325 		{
   2326 			glActiveTexture(GL_TEXTURE0 + ndx);
   2327 			expectError(GL_NO_ERROR);
   2328 
   2329 			m_verifier->verifyInteger(m_testCtx, GL_ACTIVE_TEXTURE, GL_TEXTURE0 + ndx);
   2330 			expectError(GL_NO_ERROR);
   2331 		}
   2332 	}
   2333 
   2334 private:
   2335 	StateVerifier*		m_verifier;
   2336 };
   2337 
   2338 class RenderbufferBindingTestCase : public BindingTest
   2339 {
   2340 public:
   2341 	RenderbufferBindingTestCase (Context& context, QueryType type, const char* name, const char* description)
   2342 		: BindingTest(context, name, description, type)
   2343 	{
   2344 	}
   2345 
   2346 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2347 	{
   2348 		verifyStateInteger(result, gl, GL_RENDERBUFFER_BINDING, 0, m_type);
   2349 
   2350 		GLuint renderBuffer = 0;
   2351 		gl.glGenRenderbuffers(1, &renderBuffer);
   2352 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenRenderbuffers");
   2353 
   2354 		gl.glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
   2355 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindRenderbuffer");
   2356 
   2357 		verifyStateInteger(result, gl, GL_RENDERBUFFER_BINDING, renderBuffer, m_type);
   2358 
   2359 		gl.glDeleteRenderbuffers(1, &renderBuffer);
   2360 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteRenderbuffers");
   2361 
   2362 		verifyStateInteger(result, gl, GL_RENDERBUFFER_BINDING, 0, m_type);
   2363 	}
   2364 };
   2365 
   2366 class SamplerObjectBindingTestCase : public BindingTest
   2367 {
   2368 public:
   2369 	SamplerObjectBindingTestCase (Context& context, QueryType type, const char* name, const char* description)
   2370 		: BindingTest(context, name, description, type)
   2371 	{
   2372 	}
   2373 
   2374 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2375 	{
   2376 		verifyStateInteger(result, gl, GL_SAMPLER_BINDING, 0, m_type);
   2377 
   2378 		{
   2379 			const tcu::ScopedLogSection section(gl.getLog(), "SingleUnit", "Single unit");
   2380 
   2381 			GLuint sampler = 0;
   2382 			gl.glGenSamplers(1, &sampler);
   2383 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenSamplers");
   2384 
   2385 			gl.glBindSampler(0, sampler);
   2386 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindSampler");
   2387 
   2388 			verifyStateInteger(result, gl, GL_SAMPLER_BINDING, sampler, m_type);
   2389 
   2390 			gl.glDeleteSamplers(1, &sampler);
   2391 			verifyStateInteger(result, gl, GL_SAMPLER_BINDING, 0, m_type);
   2392 		}
   2393 
   2394 		{
   2395 			const tcu::ScopedLogSection section(gl.getLog(), "MultipleUnits", "Multiple units");
   2396 
   2397 			GLuint samplerA = 0;
   2398 			GLuint samplerB = 0;
   2399 			gl.glGenSamplers(1, &samplerA);
   2400 			gl.glGenSamplers(1, &samplerB);
   2401 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenSamplers");
   2402 
   2403 			gl.glBindSampler(1, samplerA);
   2404 			gl.glBindSampler(2, samplerB);
   2405 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindSampler");
   2406 
   2407 			verifyStateInteger(result, gl, GL_SAMPLER_BINDING, 0, m_type);
   2408 
   2409 			gl.glActiveTexture(GL_TEXTURE1);
   2410 			verifyStateInteger(result, gl, GL_SAMPLER_BINDING, samplerA, m_type);
   2411 
   2412 			gl.glActiveTexture(GL_TEXTURE2);
   2413 			verifyStateInteger(result, gl, GL_SAMPLER_BINDING, samplerB, m_type);
   2414 
   2415 			gl.glDeleteSamplers(1, &samplerB);
   2416 			gl.glDeleteSamplers(1, &samplerA);
   2417 			GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteSamplers");
   2418 		}
   2419 	}
   2420 };
   2421 
   2422 class TextureBindingTestCase : public BindingTest
   2423 {
   2424 public:
   2425 	TextureBindingTestCase (Context& context, QueryType type, const char* name, const char* description, GLenum testBindingName, GLenum textureType)
   2426 		: BindingTest			(context, name, description, type)
   2427 		, m_testBindingName		(testBindingName)
   2428 		, m_textureType			(textureType)
   2429 	{
   2430 	}
   2431 
   2432 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2433 	{
   2434 		verifyStateInteger(result, gl, m_testBindingName, 0, m_type);
   2435 
   2436 		GLuint texture = 0;
   2437 		gl.glGenTextures(1, &texture);
   2438 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenTextures");
   2439 
   2440 		gl.glBindTexture(m_textureType, texture);
   2441 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
   2442 
   2443 		verifyStateInteger(result, gl, m_testBindingName, texture, m_type);
   2444 
   2445 		gl.glDeleteTextures(1, &texture);
   2446 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
   2447 
   2448 		verifyStateInteger(result, gl, m_testBindingName, 0, m_type);
   2449 	}
   2450 private:
   2451 	const GLenum	m_testBindingName;
   2452 	const GLenum	m_textureType;
   2453 };
   2454 
   2455 class FrameBufferBindingTestCase : public BindingTest
   2456 {
   2457 public:
   2458 	FrameBufferBindingTestCase (Context& context, QueryType type, const char* name, const char* description)
   2459 		: BindingTest(context, name, description, type)
   2460 	{
   2461 	}
   2462 
   2463 	void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
   2464 	{
   2465 		verifyStateInteger(result, gl, GL_DRAW_FRAMEBUFFER_BINDING,	0, m_type);
   2466 		verifyStateInteger(result, gl, GL_FRAMEBUFFER_BINDING,		0, m_type);
   2467 		verifyStateInteger(result, gl, GL_READ_FRAMEBUFFER_BINDING,	0, m_type);
   2468 
   2469 		GLuint framebufferId = 0;
   2470 		gl.glGenFramebuffers(1, &framebufferId);
   2471 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGenFramebuffers");
   2472 
   2473 		gl.glBindFramebuffer(GL_FRAMEBUFFER, framebufferId);
   2474 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind GL_FRAMEBUFFER");
   2475 
   2476 		verifyStateInteger(result, gl, GL_DRAW_FRAMEBUFFER_BINDING,	framebufferId, m_type);
   2477 		verifyStateInteger(result, gl, GL_FRAMEBUFFER_BINDING,		framebufferId, m_type);
   2478 		verifyStateInteger(result, gl, GL_READ_FRAMEBUFFER_BINDING,	framebufferId, m_type);
   2479 
   2480 		gl.glBindFramebuffer(GL_FRAMEBUFFER, 0);
   2481 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "unbind GL_FRAMEBUFFER");
   2482 
   2483 		verifyStateInteger(result, gl, GL_DRAW_FRAMEBUFFER_BINDING,	0, m_type);
   2484 		verifyStateInteger(result, gl, GL_FRAMEBUFFER_BINDING,		0, m_type);
   2485 		verifyStateInteger(result, gl, GL_READ_FRAMEBUFFER_BINDING,	0, m_type);
   2486 
   2487 		gl.glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferId);
   2488 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind GL_READ_FRAMEBUFFER");
   2489 
   2490 		verifyStateInteger(result, gl, GL_DRAW_FRAMEBUFFER_BINDING,	0,				m_type);
   2491 		verifyStateInteger(result, gl, GL_FRAMEBUFFER_BINDING,		0,				m_type);
   2492 		verifyStateInteger(result, gl, GL_READ_FRAMEBUFFER_BINDING,	framebufferId,	m_type);
   2493 
   2494 		gl.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferId);
   2495 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind GL_DRAW_FRAMEBUFFER");
   2496 
   2497 		verifyStateInteger(result, gl, GL_DRAW_FRAMEBUFFER_BINDING,	framebufferId, m_type);
   2498 		verifyStateInteger(result, gl, GL_FRAMEBUFFER_BINDING,		framebufferId, m_type);
   2499 		verifyStateInteger(result, gl, GL_READ_FRAMEBUFFER_BINDING,	framebufferId, m_type);
   2500 
   2501 		gl.glDeleteFramebuffers(1, &framebufferId);
   2502 		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteFramebuffers");
   2503 
   2504 		verifyStateInteger(result, gl, GL_DRAW_FRAMEBUFFER_BINDING,	0, m_type);
   2505 		verifyStateInteger(result, gl, GL_FRAMEBUFFER_BINDING,		0, m_type);
   2506 		verifyStateInteger(result, gl, GL_READ_FRAMEBUFFER_BINDING,	0, m_type);
   2507 	}
   2508 };
   2509 
   2510 class ImplementationColorReadTestCase : public ApiCase
   2511 {
   2512 public:
   2513 	ImplementationColorReadTestCase	(Context& context, StateVerifier* verifier, const char* name, const char* description)
   2514 		: ApiCase		(context, name, description)
   2515 		, m_verifier	(verifier)
   2516 	{
   2517 	}
   2518 
   2519 	void test (void)
   2520 	{
   2521 		const GLint defaultColorTypes[] =
   2522 		{
   2523 			GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT,
   2524 			GL_UNSIGNED_INT, GL_INT, GL_HALF_FLOAT, GL_FLOAT, GL_UNSIGNED_SHORT_5_6_5,
   2525 			GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1,
   2526 			GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_10F_11F_11F_REV
   2527 		};
   2528 		const GLint defaultColorFormats[] =
   2529 		{
   2530 			GL_RGBA, GL_RGBA_INTEGER, GL_RGB, GL_RGB_INTEGER,
   2531 			GL_RG, GL_RG_INTEGER, GL_RED, GL_RED_INTEGER
   2532 		};
   2533 
   2534 		std::vector<GLint> validColorTypes;
   2535 		std::vector<GLint> validColorFormats;
   2536 
   2537 		// Defined by the spec
   2538 
   2539 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(defaultColorTypes); ++ndx)
   2540 			validColorTypes.push_back(defaultColorTypes[ndx]);
   2541 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(defaultColorFormats); ++ndx)
   2542 			validColorFormats.push_back(defaultColorFormats[ndx]);
   2543 
   2544 		// Extensions
   2545 
   2546 		if (m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_format_BGRA8888") ||
   2547 			m_context.getContextInfo().isExtensionSupported("GL_APPLE_texture_format_BGRA8888"))
   2548 			validColorFormats.push_back(GL_BGRA);
   2549 
   2550 		if (m_context.getContextInfo().isExtensionSupported("GL_EXT_read_format_bgra"))
   2551 		{
   2552 			validColorFormats.push_back(GL_BGRA);
   2553 			validColorTypes.push_back(GL_UNSIGNED_SHORT_4_4_4_4_REV);
   2554 			validColorTypes.push_back(GL_UNSIGNED_SHORT_1_5_5_5_REV);
   2555 		}
   2556 
   2557 		if (m_context.getContextInfo().isExtensionSupported("GL_IMG_read_format"))
   2558 		{
   2559 			validColorFormats.push_back(GL_BGRA);
   2560 			validColorTypes.push_back(GL_UNSIGNED_SHORT_4_4_4_4_REV);
   2561 		}
   2562 
   2563 		if (m_context.getContextInfo().isExtensionSupported("GL_NV_sRGB_formats"))
   2564 		{
   2565 			validColorFormats.push_back(GL_SLUMINANCE_NV);
   2566 			validColorFormats.push_back(GL_SLUMINANCE_ALPHA_NV);
   2567 		}
   2568 
   2569 		if (m_context.getContextInfo().isExtensionSupported("GL_NV_bgr"))
   2570 		{
   2571 			validColorFormats.push_back(GL_BGR_NV);
   2572 		}
   2573 
   2574 		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_IMPLEMENTATION_COLOR_READ_TYPE,	&validColorTypes[0],	validColorTypes.size());
   2575 		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_IMPLEMENTATION_COLOR_READ_FORMAT,	&validColorFormats[0],	validColorFormats.size());
   2576 		expectError(GL_NO_ERROR);
   2577 	}
   2578 
   2579 private:
   2580 	StateVerifier*	m_verifier;
   2581 };
   2582 
   2583 class ReadBufferCase : public ApiCase
   2584 {
   2585 public:
   2586 	ReadBufferCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   2587 		: ApiCase		(context, name, description)
   2588 		, m_verifier	(verifier)
   2589 	{
   2590 	}
   2591 
   2592 	void test (void)
   2593 	{
   2594 		const GLint validInitialValues[] = {GL_BACK, GL_NONE};
   2595 		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_READ_BUFFER, validInitialValues, DE_LENGTH_OF_ARRAY(validInitialValues));
   2596 		expectError(GL_NO_ERROR);
   2597 
   2598 		glReadBuffer(GL_NONE);
   2599 		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_NONE);
   2600 		expectError(GL_NO_ERROR);
   2601 
   2602 		glReadBuffer(GL_BACK);
   2603 		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_BACK);
   2604 		expectError(GL_NO_ERROR);
   2605 
   2606 		// test GL_READ_BUFFER with framebuffers
   2607 
   2608 		GLuint framebufferId = 0;
   2609 		glGenFramebuffers(1, &framebufferId);
   2610 		expectError(GL_NO_ERROR);
   2611 
   2612 		GLuint renderbuffer_id = 0;
   2613 		glGenRenderbuffers(1, &renderbuffer_id);
   2614 		expectError(GL_NO_ERROR);
   2615 
   2616 		glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id);
   2617 		expectError(GL_NO_ERROR);
   2618 
   2619 		glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
   2620 		expectError(GL_NO_ERROR);
   2621 
   2622 		glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferId);
   2623 		expectError(GL_NO_ERROR);
   2624 
   2625 		glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_id);
   2626 		expectError(GL_NO_ERROR);
   2627 
   2628 		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_COLOR_ATTACHMENT0);
   2629 
   2630 		glDeleteFramebuffers(1, &framebufferId);
   2631 		glDeleteRenderbuffers(1, &renderbuffer_id);
   2632 		expectError(GL_NO_ERROR);
   2633 
   2634 		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_BACK);
   2635 		expectError(GL_NO_ERROR);
   2636 	}
   2637 private:
   2638 	StateVerifier*	m_verifier;
   2639 };
   2640 
   2641 class DrawBufferCase : public ApiCase
   2642 {
   2643 public:
   2644 	DrawBufferCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
   2645 		: ApiCase		(context, name, description)
   2646 		, m_verifier	(verifier)
   2647 	{
   2648 	}
   2649 
   2650 	void test (void)
   2651 	{
   2652 		const GLint validInitialValues[] = {GL_BACK, GL_NONE};
   2653 		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_DRAW_BUFFER0, validInitialValues, DE_LENGTH_OF_ARRAY(validInitialValues));
   2654 		expectError(GL_NO_ERROR);
   2655 
   2656 		GLenum bufs = GL_NONE;
   2657 		glDrawBuffers(1, &bufs);
   2658 		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_NONE);
   2659 		expectError(GL_NO_ERROR);
   2660 
   2661 		bufs = GL_BACK;
   2662 		glDrawBuffers(1, &bufs);
   2663 		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_BACK);
   2664 		expectError(GL_NO_ERROR);
   2665 
   2666 		// test GL_DRAW_BUFFER with framebuffers
   2667 
   2668 		GLuint framebufferId = 0;
   2669 		glGenFramebuffers(1, &framebufferId);
   2670 		expectError(GL_NO_ERROR);
   2671 
   2672 		GLuint renderbuffer_ids[2] = {0};
   2673 		glGenRenderbuffers(2, renderbuffer_ids);
   2674 		expectError(GL_NO_ERROR);
   2675 
   2676 		glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_ids[0]);
   2677 		expectError(GL_NO_ERROR);
   2678 		glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
   2679 		expectError(GL_NO_ERROR);
   2680 
   2681 		glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_ids[1]);
   2682 		expectError(GL_NO_ERROR);
   2683 		glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
   2684 		expectError(GL_NO_ERROR);
   2685 
   2686 		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferId);
   2687 		expectError(GL_NO_ERROR);
   2688 
   2689 		glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_ids[0]);
   2690 		expectError(GL_NO_ERROR);
   2691 		glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, renderbuffer_ids[1]);
   2692 		expectError(GL_NO_ERROR);
   2693 
   2694 		// only the initial state the draw buffer for fragment color zero is defined
   2695 		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_COLOR_ATTACHMENT0);
   2696 
   2697 		GLenum bufTargets[2] = {GL_NONE, GL_COLOR_ATTACHMENT1};
   2698 		glDrawBuffers(2, bufTargets);
   2699 		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_NONE);
   2700 		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER1, GL_COLOR_ATTACHMENT1);
   2701 
   2702 		glDeleteFramebuffers(1, &framebufferId);
   2703 		glDeleteRenderbuffers(2, renderbuffer_ids);
   2704 		expectError(GL_NO_ERROR);
   2705 
   2706 		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_BACK);
   2707 		expectError(GL_NO_ERROR);
   2708 	}
   2709 private:
   2710 	StateVerifier*	m_verifier;
   2711 };
   2712 
   2713 static const char* getQueryTypeSuffix (QueryType type)
   2714 {
   2715 	switch (type)
   2716 	{
   2717 		case QUERY_BOOLEAN:		return "_getboolean";
   2718 		case QUERY_INTEGER:		return "_getinteger";
   2719 		case QUERY_INTEGER64:	return "_getinteger64";
   2720 		case QUERY_FLOAT:		return "_getfloat";
   2721 		default:
   2722 			DE_ASSERT(DE_FALSE);
   2723 			return DE_NULL;
   2724 	}
   2725 }
   2726 
   2727 #define FOR_EACH_VERIFIER(VERIFIERS, CODE_BLOCK)												\
   2728 	for (int _verifierNdx = 0; _verifierNdx < DE_LENGTH_OF_ARRAY(VERIFIERS); _verifierNdx++)	\
   2729 	{																							\
   2730 		StateVerifier* verifier = (VERIFIERS)[_verifierNdx];									\
   2731 		CODE_BLOCK;																				\
   2732 	}
   2733 
   2734 #define FOR_EACH_QUERYTYPE(QUERYTYPES, CODE_BLOCK)													\
   2735 	for (int _queryTypeNdx = 0; _queryTypeNdx < DE_LENGTH_OF_ARRAY(QUERYTYPES); _queryTypeNdx++)	\
   2736 	{																								\
   2737 		const QueryType queryType = (QUERYTYPES)[_queryTypeNdx];									\
   2738 		CODE_BLOCK;																					\
   2739 	}
   2740 
   2741 } // anonymous
   2742 
   2743 IntegerStateQueryTests::IntegerStateQueryTests (Context& context)
   2744 	: TestCaseGroup			(context, "integers", "Integer Values")
   2745 	, m_verifierBoolean		(DE_NULL)
   2746 	, m_verifierInteger		(DE_NULL)
   2747 	, m_verifierInteger64	(DE_NULL)
   2748 	, m_verifierFloat		(DE_NULL)
   2749 {
   2750 }
   2751 
   2752 IntegerStateQueryTests::~IntegerStateQueryTests (void)
   2753 {
   2754 	deinit();
   2755 }
   2756 
   2757 void IntegerStateQueryTests::init (void)
   2758 {
   2759 	static const QueryType queryTypes[] =
   2760 	{
   2761 		QUERY_BOOLEAN,
   2762 		QUERY_INTEGER,
   2763 		QUERY_INTEGER64,
   2764 		QUERY_FLOAT,
   2765 	};
   2766 
   2767 	DE_ASSERT(m_verifierBoolean == DE_NULL);
   2768 	DE_ASSERT(m_verifierInteger == DE_NULL);
   2769 	DE_ASSERT(m_verifierInteger64 == DE_NULL);
   2770 	DE_ASSERT(m_verifierFloat == DE_NULL);
   2771 
   2772 	m_verifierBoolean		= new GetBooleanVerifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
   2773 	m_verifierInteger		= new GetIntegerVerifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
   2774 	m_verifierInteger64		= new GetInteger64Verifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
   2775 	m_verifierFloat			= new GetFloatVerifier		(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
   2776 
   2777 	const struct LimitedStateInteger
   2778 	{
   2779 		const char*		name;
   2780 		const char*		description;
   2781 		GLenum			targetName;
   2782 		GLint			value;
   2783 	} implementationMinLimits[] =
   2784 	{
   2785 		{ "subpixel_bits",									"SUBPIXEL_BITS has minimum value of 4",										GL_SUBPIXEL_BITS,									4	},
   2786 		{ "max_3d_texture_size",							"MAX_3D_TEXTURE_SIZE has minimum value of 256",								GL_MAX_3D_TEXTURE_SIZE,								256	},
   2787 		{ "max_texture_size",								"MAX_TEXTURE_SIZE has minimum value of 2048",								GL_MAX_TEXTURE_SIZE,								2048},
   2788 		{ "max_array_texture_layers",						"MAX_ARRAY_TEXTURE_LAYERS has minimum value of 256",						GL_MAX_ARRAY_TEXTURE_LAYERS,						256	},
   2789 		{ "max_cube_map_texture_size",						"MAX_CUBE_MAP_TEXTURE_SIZE has minimum value of 2048",						GL_MAX_CUBE_MAP_TEXTURE_SIZE,						2048},
   2790 		{ "max_renderbuffer_size",							"MAX_RENDERBUFFER_SIZE has minimum value of 2048",							GL_MAX_RENDERBUFFER_SIZE,							2048},
   2791 		{ "max_draw_buffers",								"MAX_DRAW_BUFFERS has minimum value of 4",									GL_MAX_DRAW_BUFFERS,								4	},
   2792 		{ "max_color_attachments",							"MAX_COLOR_ATTACHMENTS has minimum value of 4",								GL_MAX_COLOR_ATTACHMENTS,							4	},
   2793 		{ "max_elements_indices",							"MAX_ELEMENTS_INDICES has minimum value of 0",								GL_MAX_ELEMENTS_INDICES,							0	},
   2794 		{ "max_elements_vertices",							"MAX_ELEMENTS_VERTICES has minimum value of 0",								GL_MAX_ELEMENTS_VERTICES,							0	},
   2795 		{ "num_extensions",									"NUM_EXTENSIONS has minimum value of 0",									GL_NUM_EXTENSIONS,									0	},
   2796 		{ "major_version",									"MAJOR_VERSION has minimum value of 3",										GL_MAJOR_VERSION,									3	},
   2797 		{ "minor_version",									"MINOR_VERSION has minimum value of 0",										GL_MINOR_VERSION,									0	},
   2798 		{ "max_vertex_attribs",								"MAX_VERTEX_ATTRIBS has minimum value of 16",								GL_MAX_VERTEX_ATTRIBS,								16	},
   2799 		{ "max_vertex_uniform_components",					"MAX_VERTEX_UNIFORM_COMPONENTS has minimum value of 1024",					GL_MAX_VERTEX_UNIFORM_COMPONENTS,					1024},
   2800 		{ "max_vertex_uniform_vectors",						"MAX_VERTEX_UNIFORM_VECTORS has minimum value of 256",						GL_MAX_VERTEX_UNIFORM_VECTORS,						256	},
   2801 		{ "max_vertex_uniform_blocks",						"MAX_VERTEX_UNIFORM_BLOCKS has minimum value of 12",						GL_MAX_VERTEX_UNIFORM_BLOCKS,						12	},
   2802 		{ "max_vertex_output_components",					"MAX_VERTEX_OUTPUT_COMPONENTS has minimum value of 64",						GL_MAX_VERTEX_OUTPUT_COMPONENTS,					64	},
   2803 		{ "max_vertex_texture_image_units",					"MAX_VERTEX_TEXTURE_IMAGE_UNITS has minimum value of 16",					GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,					16	},
   2804 		{ "max_fragment_uniform_components",				"MAX_FRAGMENT_UNIFORM_COMPONENTS has minimum value of 896",					GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,					896	},
   2805 		{ "max_fragment_uniform_vectors",					"MAX_FRAGMENT_UNIFORM_VECTORS has minimum value of 224",					GL_MAX_FRAGMENT_UNIFORM_VECTORS,					224	},
   2806 		{ "max_fragment_uniform_blocks",					"MAX_FRAGMENT_UNIFORM_BLOCKS has minimum value of 12",						GL_MAX_FRAGMENT_UNIFORM_BLOCKS,						12	},
   2807 		{ "max_fragment_input_components",					"MAX_FRAGMENT_INPUT_COMPONENTS has minimum value of 60",					GL_MAX_FRAGMENT_INPUT_COMPONENTS,					60	},
   2808 		{ "max_texture_image_units",						"MAX_TEXTURE_IMAGE_UNITS has minimum value of 16",							GL_MAX_TEXTURE_IMAGE_UNITS,							16	},
   2809 		{ "max_program_texel_offset",						"MAX_PROGRAM_TEXEL_OFFSET has minimum value of 7",							GL_MAX_PROGRAM_TEXEL_OFFSET,						7	},
   2810 		{ "max_uniform_buffer_bindings",					"MAX_UNIFORM_BUFFER_BINDINGS has minimum value of 24",						GL_MAX_UNIFORM_BUFFER_BINDINGS,						24	},
   2811 		{ "max_combined_uniform_blocks",					"MAX_COMBINED_UNIFORM_BLOCKS has minimum value of 24",						GL_MAX_COMBINED_UNIFORM_BLOCKS,						24	},
   2812 		{ "max_varying_components",							"MAX_VARYING_COMPONENTS has minimum value of 60",							GL_MAX_VARYING_COMPONENTS,							60	},
   2813 		{ "max_varying_vectors",							"MAX_VARYING_VECTORS has minimum value of 15",								GL_MAX_VARYING_VECTORS,								15	},
   2814 		{ "max_combined_texture_image_units",				"MAX_COMBINED_TEXTURE_IMAGE_UNITS has minimum value of 32",					GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,				32	},
   2815 		{ "max_transform_feedback_interleaved_components",	"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS has minimum value of 64",	GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS,	64	},
   2816 		{ "max_transform_feedback_separate_attribs",		"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS has minimum value of 4",			GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,			4	},
   2817 		{ "max_transform_feedback_separate_components",		"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS has minimum value of 4",		GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS,		4	},
   2818 		{ "max_samples",									"MAX_SAMPLES has minimum value of 4",										GL_MAX_SAMPLES,										4	},
   2819 		{ "red_bits",										"RED_BITS has minimum value of 0",											GL_RED_BITS,										0	},
   2820 		{ "green_bits",										"GREEN_BITS has minimum value of 0",										GL_GREEN_BITS,										0	},
   2821 		{ "blue_bits",										"BLUE_BITS has minimum value of 0",											GL_BLUE_BITS,										0	},
   2822 		{ "alpha_bits",										"ALPHA_BITS has minimum value of 0",										GL_ALPHA_BITS,										0	},
   2823 		{ "depth_bits",										"DEPTH_BITS has minimum value of 0",										GL_DEPTH_BITS,										0	},
   2824 		{ "stencil_bits",									"STENCIL_BITS has minimum value of 0",										GL_STENCIL_BITS,									0	},
   2825 	};
   2826 	const LimitedStateInteger implementationMaxLimits[] =
   2827 	{
   2828 		{ "min_program_texel_offset",						"MIN_PROGRAM_TEXEL_OFFSET has maximum value of -8",							GL_MIN_PROGRAM_TEXEL_OFFSET,						-8	},
   2829 		{ "uniform_buffer_offset_alignment",				"UNIFORM_BUFFER_OFFSET_ALIGNMENT has minimum value of 1",					GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,					256	},
   2830 	};
   2831 
   2832 	// \note implementation defined limits have their own tests so just check the conversions to boolean, int64 and float
   2833 	StateVerifier* implementationLimitVerifiers[] = {m_verifierBoolean, m_verifierInteger64, m_verifierFloat};
   2834 
   2835 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(implementationMinLimits); testNdx++)
   2836 		FOR_EACH_VERIFIER(implementationLimitVerifiers, addChild(new ConstantMinimumValueTestCase(m_context, verifier, (std::string(implementationMinLimits[testNdx].name) + verifier->getTestNamePostfix()).c_str(), implementationMinLimits[testNdx].description, implementationMinLimits[testNdx].targetName, implementationMinLimits[testNdx].value)));
   2837 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(implementationMaxLimits); testNdx++)
   2838 		FOR_EACH_VERIFIER(implementationLimitVerifiers, addChild(new ConstantMaximumValueTestCase(m_context, verifier, (std::string(implementationMaxLimits[testNdx].name) + verifier->getTestNamePostfix()).c_str(), implementationMaxLimits[testNdx].description, implementationMaxLimits[testNdx].targetName, implementationMaxLimits[testNdx].value)));
   2839 
   2840 	StateVerifier* normalVerifiers[] = {m_verifierBoolean, m_verifierInteger, m_verifierInteger64, m_verifierFloat};
   2841 
   2842 	FOR_EACH_VERIFIER(implementationLimitVerifiers, addChild(new SampleBuffersTestCase		(m_context,	 verifier, (std::string("sample_buffers")						+ verifier->getTestNamePostfix()).c_str(),		"SAMPLE_BUFFERS")));
   2843 
   2844 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new SamplesTestCase				(m_context,	 verifier, (std::string("samples")								+ verifier->getTestNamePostfix()).c_str(),		"SAMPLES")));
   2845 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new HintTestCase				(m_context,	 verifier, (std::string("generate_mipmap_hint")					+ verifier->getTestNamePostfix()).c_str(),		"GENERATE_MIPMAP_HINT",				GL_GENERATE_MIPMAP_HINT)));
   2846 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new HintTestCase				(m_context,	 verifier, (std::string("fragment_shader_derivative_hint")		+ verifier->getTestNamePostfix()).c_str(),		"FRAGMENT_SHADER_DERIVATIVE_HINT",	GL_FRAGMENT_SHADER_DERIVATIVE_HINT)));
   2847 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new DepthFuncTestCase			(m_context,	 verifier, (std::string("depth_func")							+ verifier->getTestNamePostfix()).c_str(),		"DEPTH_FUNC")));
   2848 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new CullFaceTestCase			(m_context,	 verifier, (std::string("cull_face_mode")						+ verifier->getTestNamePostfix()).c_str(),		"CULL_FACE_MODE")));
   2849 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new FrontFaceTestCase			(m_context,	 verifier, (std::string("front_face_mode")						+ verifier->getTestNamePostfix()).c_str(),		"FRONT_FACE")));
   2850 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ViewPortTestCase			(m_context,	 verifier, (std::string("viewport")								+ verifier->getTestNamePostfix()).c_str(),		"VIEWPORT")));
   2851 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ScissorBoxTestCase			(m_context,	 verifier, (std::string("scissor_box")							+ verifier->getTestNamePostfix()).c_str(),		"SCISSOR_BOX")));
   2852 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new MaxViewportDimsTestCase		(m_context,	 verifier, (std::string("max_viewport_dims")					+ verifier->getTestNamePostfix()).c_str(),		"MAX_VIEWPORT_DIMS")));
   2853 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefTestCase			(m_context,	 verifier, (std::string("stencil_ref")							+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_REF",						GL_STENCIL_REF)));
   2854 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefTestCase			(m_context,	 verifier, (std::string("stencil_back_ref")						+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_BACK_REF",					GL_STENCIL_BACK_REF)));
   2855 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefSeparateTestCase	(m_context,	 verifier, (std::string("stencil_ref_separate")					+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_REF (separate)",			GL_STENCIL_REF,			GL_FRONT)));
   2856 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefSeparateTestCase	(m_context,	 verifier, (std::string("stencil_ref_separate_both")			+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_REF (separate)",			GL_STENCIL_REF,			GL_FRONT_AND_BACK)));
   2857 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefSeparateTestCase	(m_context,	 verifier, (std::string("stencil_back_ref_separate")			+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_BACK_REF (separate)",		GL_STENCIL_BACK_REF,	GL_BACK)));
   2858 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefSeparateTestCase	(m_context,	 verifier, (std::string("stencil_back_ref_separate_both")		+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_BACK_REF (separate)",		GL_STENCIL_BACK_REF,	GL_FRONT_AND_BACK)));
   2859 
   2860 	const struct NamedStencilOp
   2861 	{
   2862 		const char*		name;
   2863 
   2864 		const char*		frontDescription;
   2865 		GLenum			frontTarget;
   2866 		const char*		backDescription;
   2867 		GLenum			backTarget;
   2868 	} stencilOps[] =
   2869 	{
   2870 		{ "fail",		"STENCIL_FAIL",				GL_STENCIL_FAIL,			"STENCIL_BACK_FAIL",			GL_STENCIL_BACK_FAIL			},
   2871 		{ "depth_fail",	"STENCIL_PASS_DEPTH_FAIL",	GL_STENCIL_PASS_DEPTH_FAIL,	"STENCIL_BACK_PASS_DEPTH_FAIL",	GL_STENCIL_BACK_PASS_DEPTH_FAIL	},
   2872 		{ "depth_pass",	"STENCIL_PASS_DEPTH_PASS",	GL_STENCIL_PASS_DEPTH_PASS,	"STENCIL_BACK_PASS_DEPTH_PASS",	GL_STENCIL_BACK_PASS_DEPTH_PASS	}
   2873 	};
   2874 
   2875 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(stencilOps); testNdx++)
   2876 	{
   2877 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilOpTestCase			(m_context, verifier, (std::string("stencil_")		+ stencilOps[testNdx].name + verifier->getTestNamePostfix()).c_str(), stencilOps[testNdx].frontDescription,	stencilOps[testNdx].frontTarget)));
   2878 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilOpTestCase			(m_context, verifier, (std::string("stencil_back_")	+ stencilOps[testNdx].name + verifier->getTestNamePostfix()).c_str(), stencilOps[testNdx].backDescription,	stencilOps[testNdx].backTarget)));
   2879 
   2880 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilOpSeparateTestCase	(m_context, verifier, (std::string("stencil_")		+ stencilOps[testNdx].name + "_separate_both"	+ verifier->getTestNamePostfix()).c_str(), stencilOps[testNdx].frontDescription,	stencilOps[testNdx].frontTarget,	GL_FRONT_AND_BACK)));
   2881 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilOpSeparateTestCase	(m_context, verifier, (std::string("stencil_back_")	+ stencilOps[testNdx].name + "_separate_both"	+ verifier->getTestNamePostfix()).c_str(), stencilOps[testNdx].backDescription,		stencilOps[testNdx].backTarget,		GL_FRONT_AND_BACK)));
   2882 
   2883 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilOpSeparateTestCase	(m_context, verifier, (std::string("stencil_")		+ stencilOps[testNdx].name + "_separate"		+ verifier->getTestNamePostfix()).c_str(), stencilOps[testNdx].frontDescription,	stencilOps[testNdx].frontTarget,	GL_FRONT)));
   2884 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilOpSeparateTestCase	(m_context, verifier, (std::string("stencil_back_")	+ stencilOps[testNdx].name + "_separate"		+ verifier->getTestNamePostfix()).c_str(), stencilOps[testNdx].backDescription,		stencilOps[testNdx].backTarget,		GL_BACK)));
   2885 	}
   2886 
   2887 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilFuncTestCase					(m_context, verifier,	(std::string("stencil_func")								+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_FUNC")));
   2888 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilFuncSeparateTestCase			(m_context, verifier,	(std::string("stencil_func_separate")						+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_FUNC (separate)",				GL_STENCIL_FUNC,				GL_FRONT)));
   2889 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilFuncSeparateTestCase			(m_context, verifier,	(std::string("stencil_func_separate_both")					+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_FUNC (separate)",				GL_STENCIL_FUNC,				GL_FRONT_AND_BACK)));
   2890 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilFuncSeparateTestCase			(m_context, verifier,	(std::string("stencil_back_func_separate")					+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_FUNC (separate)",				GL_STENCIL_BACK_FUNC,			GL_BACK)));
   2891 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilFuncSeparateTestCase			(m_context, verifier,	(std::string("stencil_back_func_separate_both")				+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_FUNC (separate)",				GL_STENCIL_BACK_FUNC,			GL_FRONT_AND_BACK)));
   2892 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilMaskTestCase					(m_context, verifier,	(std::string("stencil_value_mask")							+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_VALUE_MASK",					GL_STENCIL_VALUE_MASK)));
   2893 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilMaskTestCase					(m_context, verifier,	(std::string("stencil_back_value_mask")						+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_BACK_VALUE_MASK",				GL_STENCIL_BACK_VALUE_MASK)));
   2894 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilMaskSeparateTestCase			(m_context, verifier,	(std::string("stencil_value_mask_separate")					+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_VALUE_MASK (separate)",		GL_STENCIL_VALUE_MASK,			GL_FRONT)));
   2895 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilMaskSeparateTestCase			(m_context, verifier,	(std::string("stencil_value_mask_separate_both")			+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_VALUE_MASK (separate)",		GL_STENCIL_VALUE_MASK,			GL_FRONT_AND_BACK)));
   2896 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilMaskSeparateTestCase			(m_context, verifier,	(std::string("stencil_back_value_mask_separate")			+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_BACK_VALUE_MASK (separate)",	GL_STENCIL_BACK_VALUE_MASK,		GL_BACK)));
   2897 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilMaskSeparateTestCase			(m_context, verifier,	(std::string("stencil_back_value_mask_separate_both")		+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_BACK_VALUE_MASK (separate)",	GL_STENCIL_BACK_VALUE_MASK,		GL_FRONT_AND_BACK)));
   2898 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskTestCase			(m_context, verifier,	(std::string("stencil_writemask")							+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_WRITEMASK",					GL_STENCIL_WRITEMASK)));
   2899 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskTestCase			(m_context, verifier,	(std::string("stencil_back_writemask")						+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_BACK_WRITEMASK",				GL_STENCIL_BACK_WRITEMASK)));
   2900 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskSeparateTestCase	(m_context, verifier,	(std::string("stencil_writemask_separate")					+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_WRITEMASK (separate)",			GL_STENCIL_WRITEMASK,			GL_FRONT)));
   2901 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskSeparateTestCase	(m_context, verifier,	(std::string("stencil_writemask_separate_both")				+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_WRITEMASK (separate)",			GL_STENCIL_WRITEMASK,			GL_FRONT_AND_BACK)));
   2902 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskSeparateTestCase	(m_context, verifier,	(std::string("stencil_back_writemask_separate")				+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_BACK_WRITEMASK (separate)",	GL_STENCIL_BACK_WRITEMASK,		GL_BACK)));
   2903 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskSeparateTestCase	(m_context, verifier,	(std::string("stencil_back_writemask_separate_both")		+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_BACK_WRITEMASK (separate)",	GL_STENCIL_BACK_WRITEMASK,		GL_FRONT_AND_BACK)));
   2904 
   2905 	const struct PixelStoreState
   2906 	{
   2907 		const char*	name;
   2908 		const char*	description;
   2909 		GLenum		target;
   2910 		int			initialValue;
   2911 	} pixelStoreStates[] =
   2912 	{
   2913 		{ "unpack_image_height","UNPACK_IMAGE_HEIGHT",	GL_UNPACK_IMAGE_HEIGHT,	0 },
   2914 		{ "unpack_skip_images",	"UNPACK_SKIP_IMAGES",	GL_UNPACK_SKIP_IMAGES,	0 },
   2915 		{ "unpack_row_length",	"UNPACK_ROW_LENGTH",	GL_UNPACK_ROW_LENGTH,	0 },
   2916 		{ "unpack_skip_rows",	"UNPACK_SKIP_ROWS",		GL_UNPACK_SKIP_ROWS,	0 },
   2917 		{ "unpack_skip_pixels",	"UNPACK_SKIP_PIXELS",	GL_UNPACK_SKIP_PIXELS,	0 },
   2918 		{ "pack_row_length",	"PACK_ROW_LENGTH",		GL_PACK_ROW_LENGTH,		0 },
   2919 		{ "pack_skip_rows",		"PACK_SKIP_ROWS",		GL_PACK_SKIP_ROWS,		0 },
   2920 		{ "pack_skip_pixels",	"PACK_SKIP_PIXELS",		GL_PACK_SKIP_PIXELS,	0 }
   2921 	};
   2922 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(pixelStoreStates); testNdx++)
   2923 	{
   2924 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new PixelStoreTestCase(m_context, verifier, (std::string(pixelStoreStates[testNdx].name) + verifier->getTestNamePostfix()).c_str(), pixelStoreStates[testNdx].description, pixelStoreStates[testNdx].target, pixelStoreStates[testNdx].initialValue)));
   2925 	}
   2926 
   2927 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new PixelStoreAlignTestCase(m_context, verifier, (std::string("unpack_alignment")	+ verifier->getTestNamePostfix()).c_str(),	"UNPACK_ALIGNMENT",	GL_UNPACK_ALIGNMENT)));
   2928 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new PixelStoreAlignTestCase(m_context, verifier, (std::string("pack_alignment")		+ verifier->getTestNamePostfix()).c_str(),	"PACK_ALIGNMENT",	GL_PACK_ALIGNMENT)));
   2929 
   2930 	const struct BlendColorState
   2931 	{
   2932 		const char*	name;
   2933 		const char*	description;
   2934 		GLenum		target;
   2935 		int			initialValue;
   2936 	} blendColorStates[] =
   2937 	{
   2938 		{ "blend_src_rgb",		"BLEND_SRC_RGB",	GL_BLEND_SRC_RGB,		GL_ONE	},
   2939 		{ "blend_src_alpha",	"BLEND_SRC_ALPHA",	GL_BLEND_SRC_ALPHA,		GL_ONE	},
   2940 		{ "blend_dst_rgb",		"BLEND_DST_RGB",	GL_BLEND_DST_RGB,		GL_ZERO	},
   2941 		{ "blend_dst_alpha",	"BLEND_DST_ALPHA",	GL_BLEND_DST_ALPHA,		GL_ZERO	}
   2942 	};
   2943 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(blendColorStates); testNdx++)
   2944 	{
   2945 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new BlendFuncTestCase			(m_context, verifier, (std::string(blendColorStates[testNdx].name)					+ verifier->getTestNamePostfix()).c_str(),	blendColorStates[testNdx].description,	blendColorStates[testNdx].target,	blendColorStates[testNdx].initialValue)));
   2946 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new BlendFuncSeparateTestCase	(m_context, verifier, (std::string(blendColorStates[testNdx].name) + "_separate"	+ verifier->getTestNamePostfix()).c_str(),	blendColorStates[testNdx].description,	blendColorStates[testNdx].target,	blendColorStates[testNdx].initialValue)));
   2947 	}
   2948 
   2949 	const struct BlendEquationState
   2950 	{
   2951 		const char*	name;
   2952 		const char*	description;
   2953 		GLenum		target;
   2954 		int			initialValue;
   2955 	} blendEquationStates[] =
   2956 	{
   2957 		{ "blend_equation_rgb",		"BLEND_EQUATION_RGB",	GL_BLEND_EQUATION_RGB,		GL_FUNC_ADD	},
   2958 		{ "blend_equation_alpha",	"BLEND_EQUATION_ALPHA",	GL_BLEND_EQUATION_ALPHA,	GL_FUNC_ADD	}
   2959 	};
   2960 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(blendEquationStates); testNdx++)
   2961 	{
   2962 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new BlendEquationTestCase			(m_context, verifier, (std::string(blendEquationStates[testNdx].name) +				+ verifier->getTestNamePostfix()).c_str(),		blendEquationStates[testNdx].description,	blendEquationStates[testNdx].target,	blendEquationStates[testNdx].initialValue)));
   2963 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new BlendEquationSeparateTestCase	(m_context, verifier, (std::string(blendEquationStates[testNdx].name) + "_separate"	+ verifier->getTestNamePostfix()).c_str(),		blendEquationStates[testNdx].description,	blendEquationStates[testNdx].target,	blendEquationStates[testNdx].initialValue)));
   2964 	}
   2965 
   2966 	const struct ImplementationArrayReturningState
   2967 	{
   2968 		const char*	name;
   2969 		const char*	description;
   2970 		GLenum		target;
   2971 		GLenum		targetLengthTarget;
   2972 		int			minLength;
   2973 	} implementationArrayReturningStates[] =
   2974 	{
   2975 		{ "compressed_texture_formats",		"COMPRESSED_TEXTURE_FORMATS",	GL_COMPRESSED_TEXTURE_FORMATS,	GL_NUM_COMPRESSED_TEXTURE_FORMATS,	10	},
   2976 		{ "program_binary_formats",			"PROGRAM_BINARY_FORMATS",		GL_PROGRAM_BINARY_FORMATS,		GL_NUM_PROGRAM_BINARY_FORMATS,		0	},
   2977 		{ "shader_binary_formats",			"SHADER_BINARY_FORMATS",		GL_SHADER_BINARY_FORMATS,		GL_NUM_SHADER_BINARY_FORMATS,		0	}
   2978 	};
   2979 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(implementationArrayReturningStates); testNdx++)
   2980 	{
   2981 		FOR_EACH_VERIFIER(normalVerifiers, addChild(new ImplementationArrayTestCase(m_context, verifier, (std::string(implementationArrayReturningStates[testNdx].name) + verifier->getTestNamePostfix()).c_str(), implementationArrayReturningStates[testNdx].description,	implementationArrayReturningStates[testNdx].target,	implementationArrayReturningStates[testNdx].targetLengthTarget,	implementationArrayReturningStates[testNdx].minLength)));
   2982 	}
   2983 
   2984 	const struct BufferBindingState
   2985 	{
   2986 		const char*	name;
   2987 		const char*	description;
   2988 		GLenum		target;
   2989 		GLenum		type;
   2990 	} bufferBindingStates[] =
   2991 	{
   2992 		{ "array_buffer_binding",				"ARRAY_BUFFER_BINDING",					GL_ARRAY_BUFFER_BINDING,				GL_ARRAY_BUFFER				},
   2993 		{ "uniform_buffer_binding",				"UNIFORM_BUFFER_BINDING",				GL_UNIFORM_BUFFER_BINDING,				GL_UNIFORM_BUFFER			},
   2994 		{ "pixel_pack_buffer_binding",			"PIXEL_PACK_BUFFER_BINDING",			GL_PIXEL_PACK_BUFFER_BINDING,			GL_PIXEL_PACK_BUFFER		},
   2995 		{ "pixel_unpack_buffer_binding",		"PIXEL_UNPACK_BUFFER_BINDING",			GL_PIXEL_UNPACK_BUFFER_BINDING,			GL_PIXEL_UNPACK_BUFFER		},
   2996 		{ "transform_feedback_buffer_binding",	"TRANSFORM_FEEDBACK_BUFFER_BINDING",	GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,	GL_TRANSFORM_FEEDBACK_BUFFER},
   2997 		{ "copy_read_buffer_binding",			"COPY_READ_BUFFER_BINDING",				GL_COPY_READ_BUFFER_BINDING,			GL_COPY_READ_BUFFER			},
   2998 		{ "copy_write_buffer_binding",			"COPY_WRITE_BUFFER_BINDING",			GL_COPY_WRITE_BUFFER_BINDING,			GL_COPY_WRITE_BUFFER		}
   2999 	};
   3000 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(bufferBindingStates); testNdx++)
   3001 	{
   3002 		FOR_EACH_QUERYTYPE(queryTypes, addChild(new BufferBindingTestCase(m_context, queryType, (std::string(bufferBindingStates[testNdx].name) + getQueryTypeSuffix(queryType)).c_str(), bufferBindingStates[testNdx].description, bufferBindingStates[testNdx].target, bufferBindingStates[testNdx].type)));
   3003 	}
   3004 
   3005 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new ElementArrayBufferBindingTestCase	(m_context, queryType, (std::string("element_array_buffer_binding")	+ getQueryTypeSuffix(queryType)).c_str())));
   3006 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new TransformFeedbackBindingTestCase	(m_context, queryType, (std::string("transform_feedback_binding")	+ getQueryTypeSuffix(queryType)).c_str())));
   3007 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new CurrentProgramBindingTestCase		(m_context, queryType, (std::string("current_program_binding")		+ getQueryTypeSuffix(queryType)).c_str(),	"CURRENT_PROGRAM")));
   3008 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new VertexArrayBindingTestCase			(m_context, queryType, (std::string("vertex_array_binding")			+ getQueryTypeSuffix(queryType)).c_str(),	"VERTEX_ARRAY_BINDING")));
   3009 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilClearValueTestCase			(m_context, verifier, (std::string("stencil_clear_value")			+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_CLEAR_VALUE")));
   3010 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ActiveTextureTestCase				(m_context, verifier, (std::string("active_texture")				+ verifier->getTestNamePostfix()).c_str(),	"ACTIVE_TEXTURE")));
   3011 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new RenderbufferBindingTestCase			(m_context, queryType, (std::string("renderbuffer_binding")			+ getQueryTypeSuffix(queryType)).c_str(),	"RENDERBUFFER_BINDING")));
   3012 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new SamplerObjectBindingTestCase		(m_context, queryType, (std::string("sampler_binding")				+ getQueryTypeSuffix(queryType)).c_str(),	"SAMPLER_BINDING")));
   3013 
   3014 	const struct TextureBinding
   3015 	{
   3016 		const char*	name;
   3017 		const char*	description;
   3018 		GLenum		target;
   3019 		GLenum		type;
   3020 	} textureBindings[] =
   3021 	{
   3022 		{ "texture_binding_2d",			"TEXTURE_BINDING_2D",		GL_TEXTURE_BINDING_2D,			GL_TEXTURE_2D		},
   3023 		{ "texture_binding_3d",			"TEXTURE_BINDING_3D",		GL_TEXTURE_BINDING_3D,			GL_TEXTURE_3D		},
   3024 		{ "texture_binding_2d_array",	"TEXTURE_BINDING_2D_ARRAY",	GL_TEXTURE_BINDING_2D_ARRAY,	GL_TEXTURE_2D_ARRAY	},
   3025 		{ "texture_binding_cube_map",	"TEXTURE_BINDING_CUBE_MAP",	GL_TEXTURE_BINDING_CUBE_MAP,	GL_TEXTURE_CUBE_MAP	}
   3026 	};
   3027 
   3028 	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(textureBindings); testNdx++)
   3029 	{
   3030 		FOR_EACH_QUERYTYPE(queryTypes, addChild(new TextureBindingTestCase(m_context, queryType, (std::string(textureBindings[testNdx].name) + getQueryTypeSuffix(queryType)).c_str(), textureBindings[testNdx].description, textureBindings[testNdx].target, textureBindings[testNdx].type)));
   3031 	}
   3032 
   3033 
   3034 	FOR_EACH_QUERYTYPE(queryTypes,     addChild(new FrameBufferBindingTestCase		(m_context, queryType, (std::string("framebuffer_binding")			+ getQueryTypeSuffix(queryType)).c_str(),	"DRAW_FRAMEBUFFER_BINDING and READ_FRAMEBUFFER_BINDING")));
   3035 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ImplementationColorReadTestCase	(m_context, verifier, (std::string("implementation_color_read")		+ verifier->getTestNamePostfix()).c_str(),	"IMPLEMENTATION_COLOR_READ_TYPE and IMPLEMENTATION_COLOR_READ_FORMAT")));
   3036 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ReadBufferCase					(m_context, verifier, (std::string("read_buffer")					+ verifier->getTestNamePostfix()).c_str(),	"READ_BUFFER")));
   3037 	FOR_EACH_VERIFIER(normalVerifiers, addChild(new DrawBufferCase					(m_context, verifier, (std::string("draw_buffer")					+ verifier->getTestNamePostfix()).c_str(),	"DRAW_BUFFER")));
   3038 }
   3039 
   3040 void IntegerStateQueryTests::deinit (void)
   3041 {
   3042 	if (m_verifierBoolean)
   3043 	{
   3044 		delete m_verifierBoolean;
   3045 		m_verifierBoolean = DE_NULL;
   3046 	}
   3047 	if (m_verifierInteger)
   3048 	{
   3049 		delete m_verifierInteger;
   3050 		m_verifierInteger = DE_NULL;
   3051 	}
   3052 	if (m_verifierInteger64)
   3053 	{
   3054 		delete m_verifierInteger64;
   3055 		m_verifierInteger64 = DE_NULL;
   3056 	}
   3057 	if (m_verifierFloat)
   3058 	{
   3059 		delete m_verifierFloat;
   3060 		m_verifierFloat = DE_NULL;
   3061 	}
   3062 
   3063 	this->TestCaseGroup::deinit();
   3064 }
   3065 
   3066 } // Functional
   3067 } // gles3
   3068 } // deqp
   3069