13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief State Query tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fIntegerStateQueryTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsStateQueryUtil.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fApiCase.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluContextInfo.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw; // GLint and other GL types
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef GL_SLUMINANCE_NV
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define	GL_SLUMINANCE_NV 0x8C46
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef GL_SLUMINANCE_ALPHA_NV
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define	GL_SLUMINANCE_ALPHA_NV 0x8C44
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef GL_BGR_NV
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define GL_BGR_NV 0x80E0
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace IntegerStateQueryVerifiers
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// StateVerifier
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StateVerifier : protected glu::CallLogWrapper
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						StateVerifier						(const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix);
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual				~StateVerifier						(); // make GCC happy
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*			getTestNamePostfix					(void) const;
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference)																																		= DE_NULL;
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)																				= DE_NULL;
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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;
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference)																																		= DE_NULL;
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference)																																		= DE_NULL;
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference)																																		= DE_NULL;
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)																													= DE_NULL;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)																											= DE_NULL;
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits)																																		= DE_NULL;
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*	const	m_testNamePostfix;
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryStateVerifier::StateVerifier (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix)
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: glu::CallLogWrapper	(gl, log)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_testNamePostfix		(testNamePostfix)
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(true);
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryStateVerifier::~StateVerifier ()
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* StateVerifier::getTestNamePostfix (void) const
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_testNamePostfix;
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// GetBooleanVerifier
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetBooleanVerifier : public StateVerifier
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetBooleanVerifier			(const glw::Functions& gl, tcu::TestLog& log);
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1123c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetBooleanVerifier::GetBooleanVerifier (const glw::Functions& gl, tcu::TestLog& log)
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getboolean")
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLboolean expectedGLState = reference ? GL_TRUE : GL_FALSE;
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state != expectedGLState)
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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;
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean[4]> boolVector4;
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, boolVector4);
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!boolVector4.verifyValidity(testCtx))
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLboolean referenceAsGLBoolean[] =
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference0 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference1 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference2 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference3 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((enableRef0 && (boolVector4[0] != referenceAsGLBoolean[0])) ||
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef1 && (boolVector4[1] != referenceAsGLBoolean[1])) ||
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef2 && (boolVector4[2] != referenceAsGLBoolean[2])) ||
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef3 && (boolVector4[3] != referenceAsGLBoolean[3])))
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef0 ? (referenceAsGLBoolean[0] ? "GL_TRUE" : "GL_FALSE") : " - ") << ", "
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef1 ? (referenceAsGLBoolean[1] ? "GL_TRUE" : "GL_FALSE") : " - ") << ", "
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef2 ? (referenceAsGLBoolean[2] ? "GL_TRUE" : "GL_FALSE") : " - ") << ", "
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef3 ? (referenceAsGLBoolean[3] ? "GL_TRUE" : "GL_FALSE") : " - ") << TestLog::EndMessage;
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state == GL_TRUE) // state is non-zero, could be greater than reference (correct)
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state == GL_FALSE) // state is zero
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (reference > 0) // and reference is greater than zero?
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state == GL_TRUE) // state is non-zero, could be greater than reference (correct)
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state == GL_FALSE) // state is zero
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (reference > 0) // and reference is greater than zero?
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state == GL_TRUE) // state is non-zero, could be less than reference (correct)
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state == GL_FALSE) // state is zero
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (reference < 0) // and reference is less than zero?
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean[2]> boolVector;
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, boolVector);
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!boolVector.verifyValidity(testCtx))
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLboolean referenceAsGLBoolean[2] =
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference0 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE,
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference1 ? (GLboolean)GL_TRUE : (GLboolean)GL_FALSE
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(referenceAsGLBoolean); ++ndx)
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (boolVector[ndx] == GL_TRUE) // state is non-zero, could be greater than any integer
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			continue;
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (boolVector[ndx] == GL_FALSE) // state is zero
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (referenceAsGLBoolean[ndx] > 0) // and reference is greater than zero?
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE or GL_FALSE" << TestLog::EndMessage;
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLboolean expectedGLState = references[ndx] ? GL_TRUE : GL_FALSE;
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state == expectedGLState)
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	testCtx.getLog() << TestLog::Message << "// ERROR: got " << (state==GL_TRUE ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// if stencilBits == 0, the mask is allowed to be either GL_TRUE or GL_FALSE
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// otherwise it must be GL_TRUE
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (stencilBits > 0 && state != GL_TRUE)
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected GL_TRUE" << TestLog::EndMessage;
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//GetIntegerVerifier
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetIntegerVerifier : public StateVerifier
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetIntegerVerifier			(const glw::Functions& gl, tcu::TestLog& log);
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetIntegerVerifier::GetIntegerVerifier (const glw::Functions& gl, tcu::TestLog& log)
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getinteger")
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state != reference)
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint[4]> intVector4;
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, intVector4);
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!intVector4.verifyValidity(testCtx))
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((enableRef0 && (intVector4[0] != reference0)) ||
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef1 && (intVector4[1] != reference1)) ||
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef2 && (intVector4[2] != reference2)) ||
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef3 && (intVector4[3] != reference3)))
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef0?"":"(") << reference0 << (enableRef0?"":")") << ", "
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef1?"":"(") << reference1 << (enableRef1?"":")") << ", "
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef2?"":"(") << reference2 << (enableRef2?"":")") << ", "
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef3?"":"(") << reference3 << (enableRef3?"":")")	<< TestLog::EndMessage;
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < reference)
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << reference << "; got " << state << TestLog::EndMessage;
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (GLuint(state) < reference)
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << reference << "; got " << GLuint(state) << TestLog::EndMessage;
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state > reference)
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected less or equal to " << reference << "; got " << state << TestLog::EndMessage;
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint[2]> intVector2;
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, intVector2);
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!intVector2.verifyValidity(testCtx))
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (intVector2[0] < reference0 || intVector2[1] < reference1)
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << reference0 << ", " << reference1 << "; got " << intVector2[0] << ", " << intVector2[0] << TestLog::EndMessage;
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLint expectedGLState = references[ndx];
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state == expectedGLState)
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	testCtx.getLog() << TestLog::Message << "// ERROR: got " << state << TestLog::EndMessage;
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint reference = (1 << stencilBits) - 1;
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((state & reference) != reference) // the least significant stencilBits bits should be on
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected minimum mask of " << reference << "; got " << state << TestLog::EndMessage;
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid mask value");
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//GetInteger64Verifier
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetInteger64Verifier : public StateVerifier
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetInteger64Verifier			(const glw::Functions& gl, tcu::TestLog& log);
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5533c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetInteger64Verifier::GetInteger64Verifier (const glw::Functions& gl, tcu::TestLog& log)
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getinteger64")
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state != GLint64(reference))
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64[4]> intVector4;
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, intVector4);
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!intVector4.verifyValidity(testCtx))
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((enableRef0 && (intVector4[0] != GLint64(reference0))) ||
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef1 && (intVector4[1] != GLint64(reference1))) ||
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef2 && (intVector4[2] != GLint64(reference2))) ||
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef3 && (intVector4[3] != GLint64(reference3))))
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef0?"":"(") << reference0 << (enableRef0?"":")") << ", "
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef1?"":"(") << reference1 << (enableRef1?"":")") << ", "
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef2?"":"(") << reference2 << (enableRef2?"":")") << ", "
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef3?"":"(") << reference3 << (enableRef3?"":")")	<< TestLog::EndMessage;
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < GLint64(reference))
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLint64(reference) << "; got " << state << TestLog::EndMessage;
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (GLuint(state) < GLint64(reference))
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLint64(reference) << "; got " << GLuint(state) << TestLog::EndMessage;
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state > GLint64(reference))
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected less or equal to " << GLint64(reference) << "; got " << state << TestLog::EndMessage;
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64[2]> intVector2;
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, intVector2);
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!intVector2.verifyValidity(testCtx))
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (intVector2[0] < GLint64(reference0) || intVector2[1] < GLint64(reference1))
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLint64(reference0) << ", " << GLint64(reference1) << "; got " << intVector2[0] << ", " << intVector2[1] << TestLog::EndMessage;
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLint64 expectedGLState = GLint64(references[ndx]);
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state == expectedGLState)
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	testCtx.getLog() << TestLog::Message << "// ERROR: got " << state << TestLog::EndMessage;
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 reference = (1ULL << stencilBits) - 1;
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((state & reference) != reference) // the least significant stencilBits bits should be on
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected mimimum mask of " << reference << "; got " << state << TestLog::EndMessage;
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid mask value");
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//GetFloatVerifier
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetFloatVerifier : public StateVerifier
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetFloatVerifier				(const glw::Functions& gl, tcu::TestLog& log);
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger						(tcu::TestContext& testCtx, GLenum name, GLint reference);
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4						(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3);
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyInteger4Mask					(tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3);
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyUnsignedIntegerGreaterOrEqual	(tcu::TestContext& testCtx, GLenum name, GLuint reference);
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerLessOrEqual			(tcu::TestContext& testCtx, GLenum name, GLint reference);
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerGreaterOrEqual2		(tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1);
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyIntegerAnyOf					(tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength);
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyStencilMaskInitial			(tcu::TestContext& testCtx, GLenum name, int stencilBits);
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7393c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetFloatVerifier::GetFloatVerifier (const glw::Functions& gl, tcu::TestLog& log)
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getfloat")
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum name, GLint reference)
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLfloat referenceAsFloat = GLfloat(reference);
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat> state;
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, &state);
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state != referenceAsFloat)
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << referenceAsFloat << "; got " << state << TestLog::EndMessage;
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyInteger4 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1, GLint reference2, GLint reference3)
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyInteger4Mask(testCtx, name, reference0, true, reference1, true, reference2, true, reference3, true);
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyInteger4Mask (tcu::TestContext& testCtx, GLenum name, GLint reference0, bool enableRef0, GLint reference1, bool enableRef1, GLint reference2, bool enableRef2, GLint reference3, bool enableRef3)
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat[4]> floatVector4;
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, floatVector4);
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector4.verifyValidity(testCtx))
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((enableRef0 && (floatVector4[0] != GLfloat(reference0))) ||
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef1 && (floatVector4[1] != GLfloat(reference1))) ||
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef2 && (floatVector4[2] != GLfloat(reference2))) ||
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(enableRef3 && (floatVector4[3] != GLfloat(reference3))))
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef0?"":"(") << GLfloat(reference0) << (enableRef0?"":")") << ", "
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef1?"":"(") << GLfloat(reference1) << (enableRef1?"":")") << ", "
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef2?"":"(") << GLfloat(reference2) << (enableRef2?"":")") << ", "
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (enableRef3?"":"(") << GLfloat(reference3) << (enableRef3?"":")") << TestLog::EndMessage;
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat> state;
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, &state);
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < GLfloat(reference))
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLfloat(reference) << "; got " << state << TestLog::EndMessage;
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyUnsignedIntegerGreaterOrEqual (tcu::TestContext& testCtx, GLenum name, GLuint reference)
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat> state;
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, &state);
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (GLuint(state) < GLfloat(reference))
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLfloat(reference) << "; got " << GLuint(state) << TestLog::EndMessage;
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyIntegerLessOrEqual (tcu::TestContext& testCtx, GLenum name, GLint reference)
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat> state;
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, &state);
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state > GLfloat(reference))
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected less or equal to " << GLfloat(reference) << "; got " << state << TestLog::EndMessage;
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyIntegerGreaterOrEqual2 (tcu::TestContext& testCtx, GLenum name, GLint reference0, GLint reference1)
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat[2]> floatVector2;
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, floatVector2);
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector2.verifyValidity(testCtx))
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector2[0] < GLfloat(reference0) || floatVector2[1] < GLfloat(reference1))
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected greater or equal to " << GLfloat(reference0) << ", " << GLfloat(reference1) << "; got " << floatVector2[0] << ", " << floatVector2[1] << TestLog::EndMessage;
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyIntegerAnyOf (tcu::TestContext& testCtx, GLenum name, const GLint references[], size_t referencesLength)
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat> state;
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, &state);
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (size_t ndx = 0; ndx < referencesLength; ++ndx)
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLfloat expectedGLState = GLfloat(references[ndx]);
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state == expectedGLState)
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	testCtx.getLog() << TestLog::Message << "// ERROR: got " << state << TestLog::EndMessage;
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyStencilMaskInitial (tcu::TestContext& testCtx, GLenum name, int stencilBits)
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// checking the mask bits with float doesn't make much sense because of conversion errors
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// just verify that the value is greater or equal to the minimum value
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint reference = (1 << stencilBits) - 1;
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyIntegerGreaterOrEqual(testCtx, name, reference);
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // IntegerStateQueryVerifiers
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace IntegerStateQueryVerifiers;
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* transformFeedbackTestVertSource	=	"#version 300 es\n"
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"void main (void)\n"
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"{\n"
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"	gl_Position = vec4(0.0);\n"
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"}\n\0";
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* transformFeedbackTestFragSource	=	"#version 300 es\n"
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"layout(location = 0) out mediump vec4 fragColor;"
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"void main (void)\n"
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"{\n"
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"	fragColor = vec4(0.0);\n"
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"}\n\0";
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* testVertSource					=	"#version 300 es\n"
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"void main (void)\n"
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"{\n"
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"	gl_Position = vec4(0.0);\n"
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"}\n\0";
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* testFragSource					=	"#version 300 es\n"
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"layout(location = 0) out mediump vec4 fragColor;"
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"void main (void)\n"
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"{\n"
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"	fragColor = vec4(0.0);\n"
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														"}\n\0";
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TransformFeedbackTestCase : public ApiCase
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TransformFeedbackTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase				(context, name, description)
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier			(verifier)
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_transformfeedback	(0)
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenTransformFeedbacks(1, &m_transformfeedback);
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint shaderVert = glCreateShader(GL_VERTEX_SHADER);
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glShaderSource(shaderVert, 1, &transformFeedbackTestVertSource, DE_NULL);
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glCompileShader(shaderVert);
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint compileStatus;
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetShaderiv(shaderVert, GL_COMPILE_STATUS, &compileStatus);
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkBooleans(compileStatus, GL_TRUE);
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint shaderFrag = glCreateShader(GL_FRAGMENT_SHADER);
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glShaderSource(shaderFrag, 1, &transformFeedbackTestFragSource, DE_NULL);
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glCompileShader(shaderFrag);
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetShaderiv(shaderFrag, GL_COMPILE_STATUS, &compileStatus);
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkBooleans(compileStatus, GL_TRUE);
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint shaderProg = glCreateProgram();
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glAttachShader(shaderProg, shaderVert);
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glAttachShader(shaderProg, shaderFrag);
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* transform_feedback_outputs = "gl_Position";
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glTransformFeedbackVaryings(shaderProg, 1, &transform_feedback_outputs, GL_INTERLEAVED_ATTRIBS);
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glLinkProgram(shaderProg);
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint linkStatus;
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetProgramiv(shaderProg, GL_LINK_STATUS, &linkStatus);
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkBooleans(linkStatus, GL_TRUE);
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_transformfeedback);
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint feedbackBufferId;
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenBuffers(1, &feedbackBufferId);
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, feedbackBufferId);
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_DYNAMIC_READ);
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, feedbackBufferId);
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glUseProgram(shaderProg);
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testTransformFeedback();
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glUseProgram(0);
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteTransformFeedbacks(1, &m_transformfeedback);
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteBuffers(1, &feedbackBufferId);
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteShader(shaderVert);
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteShader(shaderFrag);
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteProgram(shaderProg);
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void testTransformFeedback (void) = DE_NULL;
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint			m_transformfeedback;
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TransformFeedbackBindingTestCase : public TransformFeedbackTestCase
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TransformFeedbackBindingTestCase (Context& context, StateVerifier* verifier, const char* name)
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: TransformFeedbackTestCase	(context, verifier, name, "GL_TRANSFORM_FEEDBACK_BINDING")
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void beforeTransformFeedbackTest (void)
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_TRANSFORM_FEEDBACK_BINDING, 0);
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void testTransformFeedback (void)
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_TRANSFORM_FEEDBACK_BINDING, m_transformfeedback);
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void afterTransformFeedbackTest (void)
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_TRANSFORM_FEEDBACK_BINDING, 0);
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ConstantMinimumValueTestCase : public ApiCase
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ConstantMinimumValueTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum targetName, GLint minValue)
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_targetName	(targetName)
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_minValue	(minValue)
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyUnsignedIntegerGreaterOrEqual(m_testCtx, m_targetName, m_minValue);
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_targetName;
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint			m_minValue;
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ConstantMaximumValueTestCase : public ApiCase
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ConstantMaximumValueTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum targetName, GLint minValue)
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_targetName	(targetName)
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_minValue	(minValue)
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerLessOrEqual(m_testCtx, m_targetName, m_minValue);
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_targetName;
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint			m_minValue;
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass SampleBuffersTestCase : public ApiCase
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SampleBuffersTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int expectedSampleBuffers = (m_context.getRenderTarget().getNumSamples() > 1) ? 1 : 0;
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_log << tcu::TestLog::Message << "Sample count is " << (m_context.getRenderTarget().getNumSamples()) << ", expecting GL_SAMPLE_BUFFERS to be " << expectedSampleBuffers << tcu::TestLog::EndMessage;
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_SAMPLE_BUFFERS, expectedSampleBuffers);
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass SamplesTestCase : public ApiCase
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SamplesTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// MSAA?
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_context.getRenderTarget().getNumSamples() > 1)
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Message << "Sample count is " << (m_context.getRenderTarget().getNumSamples()) << tcu::TestLog::EndMessage;
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_SAMPLES, m_context.getRenderTarget().getNumSamples());
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const glw::GLint validSamples[] = {0, 1};
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_log << tcu::TestLog::Message << "Expecting GL_SAMPLES to be 0 or 1" << tcu::TestLog::EndMessage;
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyIntegerAnyOf(m_testCtx, GL_SAMPLES, validSamples, DE_LENGTH_OF_ARRAY(validSamples));
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass HintTestCase : public ApiCase
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HintTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum targetName)
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_targetName	(targetName)
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_DONT_CARE);
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glHint(m_targetName, GL_NICEST);
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_NICEST);
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glHint(m_targetName, GL_FASTEST);
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_FASTEST);
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glHint(m_targetName, GL_DONT_CARE);
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_targetName, GL_DONT_CARE);
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_targetName;
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DepthFuncTestCase : public ApiCase
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DepthFuncTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DEPTH_FUNC, GL_LESS);
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum depthFunctions[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GREATER, GL_GEQUAL, GL_NOTEQUAL};
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthFunctions); ndx++)
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDepthFunc(depthFunctions[ndx]);
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_DEPTH_FUNC, depthFunctions[ndx]);
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CullFaceTestCase : public ApiCase
11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CullFaceTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_CULL_FACE_MODE, GL_BACK);
12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum cullFaces[] = {GL_FRONT, GL_BACK, GL_FRONT_AND_BACK};
12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(cullFaces); ndx++)
12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCullFace(cullFaces[ndx]);
12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_CULL_FACE_MODE, cullFaces[ndx]);
12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
12203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
12213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass FrontFaceTestCase : public ApiCase
12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FrontFaceTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRONT_FACE, GL_CCW);
12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum frontFaces[] = {GL_CW, GL_CCW};
12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(frontFaces); ndx++)
12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glFrontFace(frontFaces[ndx]);
12413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_FRONT_FACE, frontFaces[ndx]);
12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
12463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ViewPortTestCase : public ApiCase
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ViewPortTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint maxViewportDimensions[2] = {0};
12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportDimensions);
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// verify initial value of first two values
12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, 0, 0, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight());
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int numIterations = 120;
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numIterations; ++i)
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint x			= rnd.getInt(-64000, 64000);
12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint y			= rnd.getInt(-64000, 64000);
12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLsizei width	= rnd.getInt(0, maxViewportDimensions[0]);
12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLsizei height	= rnd.getInt(0, maxViewportDimensions[1]);
12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glViewport(x, y, width, height);
12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, x, y, width, height);
12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ScissorBoxTestCase : public ApiCase
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ScissorBoxTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// verify initial value of first two values
13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger4Mask(m_testCtx, GL_SCISSOR_BOX, 0, true, 0, true, 0, false, 0, false);
13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int numIterations = 120;
13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numIterations; ++i)
13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint left		= rnd.getInt(-64000, 64000);
13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint bottom	= rnd.getInt(-64000, 64000);
13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLsizei width	= rnd.getInt(0, 64000);
13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLsizei height	= rnd.getInt(0, 64000);
13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glScissor(left, bottom, width, height);
13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger4(m_testCtx, GL_SCISSOR_BOX, left, bottom, width, height);
13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass MaxViewportDimsTestCase : public ApiCase
13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MaxViewportDimsTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerGreaterOrEqual2(m_testCtx, GL_MAX_VIEWPORT_DIMS, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight());
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilRefTestCase : public ApiCase
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilRefTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testTargetName, 0);
13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int ref = 1 << stencilBit;
13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFunc(GL_ALWAYS, ref, 0); // mask should not affect the REF
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFunc(GL_ALWAYS, ref, ref);
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilRefSeparateTestCase : public ApiCase
13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilRefSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum stencilFuncTargetFace)
13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase					(context, name, description)
13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier				(verifier)
13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName			(testTargetName)
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilFuncTargetFace	(stencilFuncTargetFace)
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testTargetName, 0);
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int ref = 1 << stencilBit;
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFuncSeparate(m_stencilFuncTargetFace, GL_ALWAYS, ref, 0);
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFuncSeparate(m_stencilFuncTargetFace, GL_ALWAYS, ref, ref);
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, ref);
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_stencilFuncTargetFace;
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilOpTestCase : public ApiCase
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilOpTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum stencilOpName)
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase					(context, name, description)
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier				(verifier)
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilOpName			(stencilOpName)
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_stencilOpName, GL_KEEP);
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum stencilOpValues[] = {GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP};
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilOpValues); ++ndx)
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SetStencilOp(stencilOpValues[ndx]);
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_stencilOpName, stencilOpValues[ndx]);
14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void SetStencilOp (GLenum stencilOpValue)
14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_stencilOpName)
14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_FAIL:
14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_BACK_FAIL:
14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilOp(stencilOpValue, GL_KEEP, GL_KEEP);
14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_PASS_DEPTH_FAIL:
14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilOp(GL_KEEP, stencilOpValue, GL_KEEP);
14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_PASS_DEPTH_PASS:
14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_BACK_PASS_DEPTH_PASS:
14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilOp(GL_KEEP, GL_KEEP, stencilOpValue);
14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false && "should not happen");
14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*				m_verifier;
14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum					m_stencilOpName;
14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilOpSeparateTestCase : public StencilOpTestCase
14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilOpSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum stencilOpName, GLenum stencilOpFace)
14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: StencilOpTestCase		(context, verifier, name, description, stencilOpName)
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilOpFace		(stencilOpFace)
14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void SetStencilOp (GLenum stencilOpValue)
14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_stencilOpName)
14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_FAIL:
14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_BACK_FAIL:
14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilOpSeparate(m_stencilOpFace, stencilOpValue, GL_KEEP, GL_KEEP);
14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_PASS_DEPTH_FAIL:
15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilOpSeparate(m_stencilOpFace, GL_KEEP, stencilOpValue, GL_KEEP);
15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_PASS_DEPTH_PASS:
15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_BACK_PASS_DEPTH_PASS:
15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilOpSeparate(m_stencilOpFace, GL_KEEP, GL_KEEP, stencilOpValue);
15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false && "should not happen");
15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_stencilOpFace;
15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilFuncTestCase : public ApiCase
15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilFuncTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_STENCIL_FUNC, GL_ALWAYS);
15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum stencilfuncValues[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL};
15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilfuncValues); ++ndx)
15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFunc(stencilfuncValues[ndx], 0, 0);
15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_STENCIL_FUNC, stencilfuncValues[ndx]);
15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_STENCIL_BACK_FUNC, stencilfuncValues[ndx]);
15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilFuncSeparateTestCase : public ApiCase
15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilFuncSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum stencilFuncName, GLenum stencilFuncFace)
15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilFuncName	(stencilFuncName)
15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilFuncFace	(stencilFuncFace)
15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_stencilFuncName, GL_ALWAYS);
15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum stencilfuncValues[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL};
15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilfuncValues); ++ndx)
15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFuncSeparate(m_stencilFuncFace, stencilfuncValues[ndx], 0, 0);
15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_stencilFuncName, stencilfuncValues[ndx]);
15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_stencilFuncName;
15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_stencilFuncFace;
15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilMaskTestCase : public ApiCase
15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilMaskTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyStencilMaskInitial(m_testCtx, m_testTargetName, stencilBits);
15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int mask = 1 << stencilBit;
16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFunc(GL_ALWAYS, 0, mask);
16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
16163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilMaskSeparateTestCase : public ApiCase
16183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
16203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilMaskSeparateTestCase	(Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum stencilFuncTargetFace)
16213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase					(context, name, description)
16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier				(verifier)
16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName			(testTargetName)
16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilFuncTargetFace	(stencilFuncTargetFace)
16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyStencilMaskInitial(m_testCtx, m_testTargetName, stencilBits);
16333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
16343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
16363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int mask = 1 << stencilBit;
16383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilFuncSeparate(m_stencilFuncTargetFace, GL_ALWAYS, 0, mask);
16403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
16413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
16433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
16443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
16453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
16473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
16483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
16493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_stencilFuncTargetFace;
16503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
16513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilWriteMaskTestCase : public ApiCase
16533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
16553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilWriteMaskTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
16563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
16573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
16583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
16593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
16633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
16653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
16673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int mask = 1 << stencilBit;
16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilMask(mask);
16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
16743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
16783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
16793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
16803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
16813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilWriteMaskSeparateTestCase : public ApiCase
16833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16843c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
16853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilWriteMaskSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum stencilTargetFace)
16863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase				(context, name, description)
16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier			(verifier)
16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName		(testTargetName)
16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_stencilTargetFace	(stencilTargetFace)
16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
16963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int mask = 1 << stencilBit;
17003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glStencilMaskSeparate(m_stencilTargetFace, mask);
17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, mask);
17053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
17083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
17093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
17103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_stencilTargetFace;
17123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
17133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PixelStoreTestCase : public ApiCase
17153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
17163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
17173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PixelStoreTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
17183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
17193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
17213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_initialValue	(initialValue)
17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
17263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
17273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
17283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testTargetName, m_initialValue);
17303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int numIterations = 120;
17333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numIterations; ++i)
17343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int referenceValue = rnd.getInt(0, 64000);
17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPixelStorei(m_testTargetName, referenceValue);
17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
17443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			m_initialValue;
17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PixelStoreAlignTestCase : public ApiCase
17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
17533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PixelStoreAlignTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName)
17553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
17563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
17573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
17583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
17593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
17603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
17623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
17633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testTargetName, 4);
17643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
17653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int alignments[] = {1, 2, 4, 8};
17673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(alignments); ++ndx)
17693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
17703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int referenceValue = alignments[ndx];
17713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glPixelStorei(m_testTargetName, referenceValue);
17733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
17743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
17763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
17773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
17783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
17793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testTargetName;
17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
17843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BlendFuncTestCase : public ApiCase
17863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
17873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
17883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BlendFuncTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
17893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
17923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_initialValue	(initialValue)
17933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testTargetName, m_initialValue);
17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum blendFuncValues[] =
18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR,
18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR,
18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA,
18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_SRC_ALPHA_SATURATE
18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
18083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(blendFuncValues); ++ndx)
18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const GLenum referenceValue = blendFuncValues[ndx];
18123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SetBlendFunc(referenceValue);
18143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
18153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
18173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
18183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
18193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
18203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
18213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void SetBlendFunc (GLenum func)
18223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_testTargetName)
18243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_SRC_RGB:
18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_SRC_ALPHA:
18273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendFunc(func, GL_ZERO);
18283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_DST_RGB:
18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_DST_ALPHA:
18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendFunc(GL_ZERO, func);
18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false && "should not happen");
18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
18393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
18403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
18423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_testTargetName;
18433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				m_initialValue;
18443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
18453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BlendFuncSeparateTestCase : public BlendFuncTestCase
18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BlendFuncSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: BlendFuncTestCase	(context, verifier, name, description, testTargetName, initialValue)
18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void SetBlendFunc (GLenum func)
18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_testTargetName)
18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_SRC_RGB:
18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendFuncSeparate(func, GL_ZERO, GL_ZERO, GL_ZERO);
18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_DST_RGB:
18633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendFuncSeparate(GL_ZERO, func, GL_ZERO, GL_ZERO);
18643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_SRC_ALPHA:
18673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendFuncSeparate(GL_ZERO, GL_ZERO, func, GL_ZERO);
18683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_DST_ALPHA:
18713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendFuncSeparate(GL_ZERO, GL_ZERO, GL_ZERO, func);
18723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
18753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false && "should not happen");
18763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
18773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
18783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
18793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
18803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BlendEquationTestCase : public ApiCase
18823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
18833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
18843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BlendEquationTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
18853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase			(context, name, description)
18863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier		(verifier)
18873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName	(testTargetName)
18883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_initialValue	(initialValue)
18893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
18913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
18933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testTargetName, m_initialValue);
18953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
18963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLenum blendFuncValues[] =
18983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, GL_MIN, GL_MAX
19003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
19013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(blendFuncValues); ++ndx)
19033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
19043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const GLenum referenceValue = blendFuncValues[ndx];
19053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			SetBlendEquation(referenceValue);
19073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
19083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, m_testTargetName, referenceValue);
19103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
19113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
19123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
19143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void SetBlendEquation (GLenum equation)
19153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
19163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBlendEquation(equation);
19173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
19203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_testTargetName;
19213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				m_initialValue;
19223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
19233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BlendEquationSeparateTestCase : public BlendEquationTestCase
19243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
19263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BlendEquationSeparateTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, int initialValue)
19273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: BlendEquationTestCase	(context, verifier, name, description, testTargetName, initialValue)
19283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
19293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
19323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void SetBlendEquation (GLenum equation)
19333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
19343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_testTargetName)
19353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
19363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_EQUATION_RGB:
19373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendEquationSeparate(equation, GL_FUNC_ADD);
19383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
19393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_BLEND_EQUATION_ALPHA:
19413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBlendEquationSeparate(GL_FUNC_ADD, equation);
19423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
19433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
19453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false && "should not happen");
19463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
19473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
19483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
19503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ImplementationArrayTestCase : public ApiCase
19523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
19543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ImplementationArrayTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testTargetName, GLenum testTargetLengthTargetName, int minValue)
19553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase						(context, name, description)
19563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier					(verifier)
19573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetName				(testTargetName)
19583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testTargetLengthTargetName	(testTargetLengthTargetName)
19593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_minValue					(minValue)
19603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
19613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
19643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
19653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerGreaterOrEqual(m_testCtx, m_testTargetLengthTargetName, m_minValue);
19663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
19673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint targetArrayLength = 0;
19693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetIntegerv(m_testTargetLengthTargetName, &targetArrayLength);
19703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
19713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (targetArrayLength)
19733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
19743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			std::vector<GLint> queryResult;
19753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			queryResult.resize(targetArrayLength, 0);
19763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGetIntegerv(m_testTargetName, &queryResult[0]);
19783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
19793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
19803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
19833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
19843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_testTargetName;
19853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_testTargetLengthTargetName;
19863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				m_minValue;
19873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
19883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CurrentProgramBindingTestCase : public ApiCase
19903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
19923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CurrentProgramBindingTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
19933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
19943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
19953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
19963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
19973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
19993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_CURRENT_PROGRAM, 0);
20013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
20043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint shaderVert = glCreateShader(GL_VERTEX_SHADER);
20053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glShaderSource(shaderVert, 1, &testVertSource, DE_NULL);
20063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCompileShader(shaderVert);
20073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint compileStatus;
20093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGetShaderiv(shaderVert, GL_COMPILE_STATUS, &compileStatus);
20103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			checkBooleans(compileStatus, GL_TRUE);
20113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint shaderFrag = glCreateShader(GL_FRAGMENT_SHADER);
20133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glShaderSource(shaderFrag, 1, &testFragSource, DE_NULL);
20143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glCompileShader(shaderFrag);
20153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGetShaderiv(shaderFrag, GL_COMPILE_STATUS, &compileStatus);
20173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			checkBooleans(compileStatus, GL_TRUE);
20183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint shaderProg = glCreateProgram();
20203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glAttachShader(shaderProg, shaderVert);
20213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glAttachShader(shaderProg, shaderFrag);
20223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLinkProgram(shaderProg);
20233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLint linkStatus;
20253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGetProgramiv(shaderProg, GL_LINK_STATUS, &linkStatus);
20263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			checkBooleans(linkStatus, GL_TRUE);
20273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glUseProgram(shaderProg);
20293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_CURRENT_PROGRAM, shaderProg);
20323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteShader(shaderVert);
20353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteShader(shaderFrag);
20363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteProgram(shaderProg);
20373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_CURRENT_PROGRAM, shaderProg);
20403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
20413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
20423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glUseProgram(0);
20443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_CURRENT_PROGRAM, 0);
20463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
20483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
20503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
20513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
20523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass VertexArrayBindingTestCase : public ApiCase
20543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
20553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
20563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VertexArrayBindingTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
20573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
20583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
20593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
20613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test(void)
20633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_VERTEX_ARRAY_BINDING, 0);
20653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint vertexArrayObject = 0;
20683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenVertexArrays(1, &vertexArrayObject);
20693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindVertexArray(vertexArrayObject);
20723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_VERTEX_ARRAY_BINDING, vertexArrayObject);
20733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteVertexArrays(1, &vertexArrayObject);
20763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_VERTEX_ARRAY_BINDING, 0);
20773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
20793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
20813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
20823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
20833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BufferBindingTestCase : public ApiCase
20853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
20863c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
20873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BufferBindingTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum bufferBindingName, GLenum bufferType)
20883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase				(context, name, description)
20893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier			(verifier)
20903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_bufferBindingName	(bufferBindingName)
20913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_bufferType			(bufferType)
20923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
20943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
20963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_bufferBindingName, 0);
20983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
20993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint bufferObject = 0;
21013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenBuffers(1, &bufferObject);
21023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
21033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindBuffer(m_bufferType, bufferObject);
21053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_bufferBindingName, bufferObject);
21063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
21073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteBuffers(1, &bufferObject);
21093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_bufferBindingName, 0);
21103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
21113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
21143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
21153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_bufferBindingName;
21163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum			m_bufferType;
21173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
21183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ElementArrayBufferBindingTestCase : public ApiCase
21203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
21213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
21223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ElementArrayBufferBindingTestCase (Context& context, StateVerifier* verifier, const char* name)
21233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, "GL_ELEMENT_ARRAY_BUFFER_BINDING")
21243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
21253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
21293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Test with default VAO
21313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
21323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const tcu::ScopedLogSection section(m_log, "DefaultVAO", "Test with default VAO");
21333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0);
21353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint bufferObject = 0;
21383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers(1, &bufferObject);
21393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObject);
21423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, bufferObject);
21433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers(1, &bufferObject);
21463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0);
21473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
21493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Test with multiple VAOs
21513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
21523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const tcu::ScopedLogSection section(m_log, "WithVAO", "Test with VAO");
21533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint vaos[2]		= {0};
21553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buffers[2]	= {0};
21563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenVertexArrays(2, vaos);
21583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenBuffers(2, buffers);
21613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// initial
21643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(vaos[0]);
21653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0);
21663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// after setting
21693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[0]);
21703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[0]);
21713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// initial of vao 2
21743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(vaos[1]);
21753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0);
21763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// after setting to 2
21793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
21803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[1]);
21813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// vao 1 still has buffer 1 bound?
21843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(vaos[0]);
21853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[0]);
21863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// deleting clears from bound vaos ...
21893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteBuffers(2, buffers);
21903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, 0);
21913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// ... but does not from non-bound vaos?
21943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindVertexArray(vaos[1]);
21953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ELEMENT_ARRAY_BUFFER_BINDING, buffers[1]);
21963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
21973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteVertexArrays(2, vaos);
21993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
22003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
22013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
22043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
22053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
22063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StencilClearValueTestCase : public ApiCase
22083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
22093c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
22103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StencilClearValueTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
22113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
22123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
22133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
22173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_STENCIL_CLEAR_VALUE, 0);
22193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int stencilBits = m_context.getRenderTarget().getStencilBits();
22223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int stencilBit = 0; stencilBit < stencilBits; ++stencilBit)
22243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
22253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int ref = 1 << stencilBit;
22263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glClearStencil(ref); // mask should not affect the REF
22283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
22293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_STENCIL_CLEAR_VALUE, ref);
22313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
22323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
22333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
22363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
22373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
22383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ActiveTextureTestCase : public ApiCase
22403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
22413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
22423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ActiveTextureTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
22433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
22443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
22453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
22493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_ACTIVE_TEXTURE, GL_TEXTURE0);
22513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint textureUnits = 0;
22543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &textureUnits);
22553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < textureUnits; ++ndx)
22583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
22593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glActiveTexture(GL_TEXTURE0 + ndx);
22603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
22613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_ACTIVE_TEXTURE, GL_TEXTURE0 + ndx);
22633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
22643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
22653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
22683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
22693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
22703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass RenderbufferBindingTestCase : public ApiCase
22723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
22733c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
22743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RenderbufferBindingTestCase	(Context& context, StateVerifier* verifier, const char* name, const char* description)
22753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
22763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
22773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
22813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
22823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_RENDERBUFFER_BINDING, 0);
22833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint renderBuffer = 0;
22863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenRenderbuffers(1, &renderBuffer);
22873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
22903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_RENDERBUFFER_BINDING, renderBuffer);
22933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
22953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteRenderbuffers(1, &renderBuffer);
22963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_RENDERBUFFER_BINDING, 0);
22973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
22983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
22993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
23013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
23023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
23033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass SamplerObjectBindingTestCase : public ApiCase
23053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
23063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
23073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SamplerObjectBindingTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
23083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
23093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
23103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
23133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_SAMPLER_BINDING, 0);
23153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
23163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const tcu::ScopedLogSection section(m_log, "SingleUnit", "Single unit");
23193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint sampler = 0;
23203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenSamplers(1, &sampler);
23213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindSampler(0, sampler);
23243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_SAMPLER_BINDING, sampler);
23273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteSamplers(1, &sampler);
23303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_SAMPLER_BINDING, 0);
23313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
23353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const tcu::ScopedLogSection section(m_log, "MultipleUnits", "Multiple units");
23363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint samplerA = 0;
23383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint samplerB = 0;
23393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenSamplers(1, &samplerA);
23403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glGenSamplers(1, &samplerB);
23413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindSampler(1, samplerA);
23443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glBindSampler(2, samplerB);
23453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_SAMPLER_BINDING, 0);
23483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glActiveTexture(GL_TEXTURE1);
23513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_SAMPLER_BINDING, samplerA);
23523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glActiveTexture(GL_TEXTURE2);
23553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyInteger(m_testCtx, GL_SAMPLER_BINDING, samplerB);
23563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteSamplers(1, &samplerB);
23593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glDeleteSamplers(1, &samplerA);
23603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
23613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
23623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
23653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*		m_verifier;
23663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
23673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureBindingTestCase : public ApiCase
23693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
23703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
23713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureBindingTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description, GLenum testBindingName, GLenum textureType)
23723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase				(context, name, description)
23733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier			(verifier)
23743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_testBindingName		(testBindingName)
23753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_textureType			(textureType)
23763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
23803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
23813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testBindingName, 0);
23823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
23833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint texture = 0;
23853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenTextures(1, &texture);
23863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
23873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindTexture(m_textureType, texture);
23893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testBindingName, texture);
23903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteTextures(1, &texture);
23923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
23933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
23943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, m_testBindingName, 0);
23953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
23963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
23973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
23983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
23993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_testBindingName;
24003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		m_textureType;
24013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
24023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass FrameBufferBindingTestCase : public ApiCase
24043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
24053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
24063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FrameBufferBindingTestCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
24073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
24083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
24093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
24133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_FRAMEBUFFER_BINDING,	0);
24153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRAMEBUFFER_BINDING,			0);
24163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_FRAMEBUFFER_BINDING,	0);
24173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint framebufferId = 0;
24203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenFramebuffers(1, &framebufferId);
24213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindFramebuffer(GL_FRAMEBUFFER, framebufferId);
24243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_FRAMEBUFFER_BINDING,	framebufferId);
24273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRAMEBUFFER_BINDING,		framebufferId);
24283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_FRAMEBUFFER_BINDING,	framebufferId);
24293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindFramebuffer(GL_FRAMEBUFFER, 0);
24323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_FRAMEBUFFER_BINDING,	0);
24353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRAMEBUFFER_BINDING,			0);
24363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_FRAMEBUFFER_BINDING,	0);
24373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferId);
24403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_FRAMEBUFFER_BINDING,	0);
24433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRAMEBUFFER_BINDING,		0);
24443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_FRAMEBUFFER_BINDING,	framebufferId);
24453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferId);
24483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_FRAMEBUFFER_BINDING,	framebufferId);
24513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRAMEBUFFER_BINDING,		framebufferId);
24523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_FRAMEBUFFER_BINDING,	framebufferId);
24533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteFramebuffers(1, &framebufferId);
24563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_FRAMEBUFFER_BINDING,	0);
24593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_FRAMEBUFFER_BINDING,		0);
24603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_FRAMEBUFFER_BINDING,	0);
24613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
24623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
24653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
24663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
24673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ImplementationColorReadTestCase : public ApiCase
24693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
24703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
24713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ImplementationColorReadTestCase	(Context& context, StateVerifier* verifier, const char* name, const char* description)
24723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
24733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
24743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
24763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
24783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
24793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLint defaultColorTypes[] =
24803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT,
24823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_UNSIGNED_INT, GL_INT, GL_HALF_FLOAT, GL_FLOAT, GL_UNSIGNED_SHORT_5_6_5,
24833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1,
24843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_10F_11F_11F_REV
24853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
24863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLint defaultColorFormats[] =
24873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
24883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_RGBA, GL_RGBA_INTEGER, GL_RGB, GL_RGB_INTEGER,
24893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GL_RG, GL_RG_INTEGER, GL_RED, GL_RED_INTEGER
24903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
24913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<GLint> validColorTypes;
24933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<GLint> validColorFormats;
24943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Defined by the spec
24963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
24973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(defaultColorTypes); ++ndx)
24983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorTypes.push_back(defaultColorTypes[ndx]);
24993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(defaultColorFormats); ++ndx)
25003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(defaultColorFormats[ndx]);
25013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Extensions
25033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_format_BGRA8888") ||
25053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_context.getContextInfo().isExtensionSupported("GL_APPLE_texture_format_BGRA8888"))
25063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(GL_BGRA);
25073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_context.getContextInfo().isExtensionSupported("GL_EXT_read_format_bgra"))
25093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(GL_BGRA);
25113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorTypes.push_back(GL_UNSIGNED_SHORT_4_4_4_4_REV);
25123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorTypes.push_back(GL_UNSIGNED_SHORT_1_5_5_5_REV);
25133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_context.getContextInfo().isExtensionSupported("GL_IMG_read_format"))
25163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(GL_BGRA);
25183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorTypes.push_back(GL_UNSIGNED_SHORT_4_4_4_4_REV);
25193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_context.getContextInfo().isExtensionSupported("GL_NV_sRGB_formats"))
25223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(GL_SLUMINANCE_NV);
25243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(GL_SLUMINANCE_ALPHA_NV);
25253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_context.getContextInfo().isExtensionSupported("GL_NV_bgr"))
25283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
25293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			validColorFormats.push_back(GL_BGR_NV);
25303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
25313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_IMPLEMENTATION_COLOR_READ_TYPE,	&validColorTypes[0],	validColorTypes.size());
25333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_IMPLEMENTATION_COLOR_READ_FORMAT,	&validColorFormats[0],	validColorFormats.size());
25343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
25383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
25393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
25403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ReadBufferCase : public ApiCase
25423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
25433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
25443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ReadBufferCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
25453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
25463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
25473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
25513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
25523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLint validInitialValues[] = {GL_BACK, GL_NONE};
25533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_READ_BUFFER, validInitialValues, DE_LENGTH_OF_ARRAY(validInitialValues));
25543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glReadBuffer(GL_NONE);
25573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_NONE);
25583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glReadBuffer(GL_BACK);
25613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_BACK);
25623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// test GL_READ_BUFFER with framebuffers
25653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint framebufferId = 0;
25673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenFramebuffers(1, &framebufferId);
25683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint renderbuffer_id = 0;
25713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenRenderbuffers(1, &renderbuffer_id);
25723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id);
25753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
25783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferId);
25813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_id);
25843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_COLOR_ATTACHMENT0);
25873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteFramebuffers(1, &framebufferId);
25893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteRenderbuffers(1, &renderbuffer_id);
25903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_READ_BUFFER, GL_BACK);
25933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
25943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
25953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
25963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
25973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
25983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
25993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DrawBufferCase : public ApiCase
26003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
26013c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
26023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DrawBufferCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
26033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
26043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
26053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
26063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
26073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
26093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
26103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const GLint validInitialValues[] = {GL_BACK, GL_NONE};
26113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyIntegerAnyOf(m_testCtx, GL_DRAW_BUFFER0, validInitialValues, DE_LENGTH_OF_ARRAY(validInitialValues));
26123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum bufs = GL_NONE;
26153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDrawBuffers(1, &bufs);
26163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_NONE);
26173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bufs = GL_BACK;
26203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDrawBuffers(1, &bufs);
26213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_BACK);
26223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// test GL_DRAW_BUFFER with framebuffers
26253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint framebufferId = 0;
26273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenFramebuffers(1, &framebufferId);
26283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLuint renderbuffer_ids[2] = {0};
26313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGenRenderbuffers(2, renderbuffer_ids);
26323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_ids[0]);
26353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
26373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_ids[1]);
26403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
26423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferId);
26453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_ids[0]);
26483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, renderbuffer_ids[1]);
26503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// only the initial state the draw buffer for fragment color zero is defined
26533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_COLOR_ATTACHMENT0);
26543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum bufTargets[2] = {GL_NONE, GL_COLOR_ATTACHMENT1};
26563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDrawBuffers(2, bufTargets);
26573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_NONE);
26583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER1, GL_COLOR_ATTACHMENT1);
26593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteFramebuffers(1, &framebufferId);
26613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteRenderbuffers(2, renderbuffer_ids);
26623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyInteger(m_testCtx, GL_DRAW_BUFFER0, GL_BACK);
26653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
26663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
26673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
26683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
26693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
26703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define FOR_EACH_VERIFIER(VERIFIERS, CODE_BLOCK)												\
26723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int _verifierNdx = 0; _verifierNdx < DE_LENGTH_OF_ARRAY(VERIFIERS); _verifierNdx++)	\
26733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{																							\
26743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StateVerifier* verifier = VERIFIERS[_verifierNdx];										\
26753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CODE_BLOCK;																				\
26763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
26773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
26793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26803c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIntegerStateQueryTests::IntegerStateQueryTests (Context& context)
26813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup			(context, "integers", "Integer Values")
26823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierBoolean		(DE_NULL)
26833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierInteger		(DE_NULL)
26843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierInteger64	(DE_NULL)
26853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierFloat		(DE_NULL)
26863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
26873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
26883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIntegerStateQueryTests::~IntegerStateQueryTests (void)
26903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
26913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deinit();
26923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
26933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
26943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid IntegerStateQueryTests::init (void)
26953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
26963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierBoolean == DE_NULL);
26973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierInteger == DE_NULL);
26983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierInteger64 == DE_NULL);
26993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierFloat == DE_NULL);
27003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierBoolean		= new GetBooleanVerifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
27023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierInteger		= new GetIntegerVerifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
27033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierInteger64		= new GetInteger64Verifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
27043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierFloat			= new GetFloatVerifier		(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
27053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct LimitedStateInteger
27073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
27083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		name;
27093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		description;
27103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum			targetName;
27113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLint			value;
27123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} implementationMinLimits[] =
27133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
27143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "subpixel_bits",									"SUBPIXEL_BITS has minimum value of 4",										GL_SUBPIXEL_BITS,									4	},
27153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_3d_texture_size",							"MAX_3D_TEXTURE_SIZE has minimum value of 256",								GL_MAX_3D_TEXTURE_SIZE,								256	},
27163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_texture_size",								"MAX_TEXTURE_SIZE has minimum value of 2048",								GL_MAX_TEXTURE_SIZE,								2048},
27173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_array_texture_layers",						"MAX_ARRAY_TEXTURE_LAYERS has minimum value of 256",						GL_MAX_ARRAY_TEXTURE_LAYERS,						256	},
27183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_cube_map_texture_size",						"MAX_CUBE_MAP_TEXTURE_SIZE has minimum value of 2048",						GL_MAX_CUBE_MAP_TEXTURE_SIZE,						2048},
27193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_renderbuffer_size",							"MAX_RENDERBUFFER_SIZE has minimum value of 2048",							GL_MAX_RENDERBUFFER_SIZE,							2048},
27203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_draw_buffers",								"MAX_DRAW_BUFFERS has minimum value of 4",									GL_MAX_DRAW_BUFFERS,								4	},
27213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_color_attachments",							"MAX_COLOR_ATTACHMENTS has minimum value of 4",								GL_MAX_COLOR_ATTACHMENTS,							4	},
27223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_elements_indices",							"MAX_ELEMENTS_INDICES has minimum value of 0",								GL_MAX_ELEMENTS_INDICES,							0	},
27233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_elements_vertices",							"MAX_ELEMENTS_VERTICES has minimum value of 0",								GL_MAX_ELEMENTS_VERTICES,							0	},
27243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "num_extensions",									"NUM_EXTENSIONS has minimum value of 0",									GL_NUM_EXTENSIONS,									0	},
27253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "major_version",									"MAJOR_VERSION has minimum value of 3",										GL_MAJOR_VERSION,									3	},
27263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "minor_version",									"MINOR_VERSION has minimum value of 0",										GL_MINOR_VERSION,									0	},
27273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_vertex_attribs",								"MAX_VERTEX_ATTRIBS has minimum value of 16",								GL_MAX_VERTEX_ATTRIBS,								16	},
27283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_vertex_uniform_components",					"MAX_VERTEX_UNIFORM_COMPONENTS has minimum value of 1024",					GL_MAX_VERTEX_UNIFORM_COMPONENTS,					1024},
27293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_vertex_uniform_vectors",						"MAX_VERTEX_UNIFORM_VECTORS has minimum value of 256",						GL_MAX_VERTEX_UNIFORM_VECTORS,						256	},
27303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_vertex_uniform_blocks",						"MAX_VERTEX_UNIFORM_BLOCKS has minimum value of 12",						GL_MAX_VERTEX_UNIFORM_BLOCKS,						12	},
27313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_vertex_output_components",					"MAX_VERTEX_OUTPUT_COMPONENTS has minimum value of 64",						GL_MAX_VERTEX_OUTPUT_COMPONENTS,					64	},
27323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_vertex_texture_image_units",					"MAX_VERTEX_TEXTURE_IMAGE_UNITS has minimum value of 16",					GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,					16	},
27333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_fragment_uniform_components",				"MAX_FRAGMENT_UNIFORM_COMPONENTS has minimum value of 896",					GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,					896	},
27343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_fragment_uniform_vectors",					"MAX_FRAGMENT_UNIFORM_VECTORS has minimum value of 224",					GL_MAX_FRAGMENT_UNIFORM_VECTORS,					224	},
27353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_fragment_uniform_blocks",					"MAX_FRAGMENT_UNIFORM_BLOCKS has minimum value of 12",						GL_MAX_FRAGMENT_UNIFORM_BLOCKS,						12	},
27363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_fragment_input_components",					"MAX_FRAGMENT_INPUT_COMPONENTS has minimum value of 60",					GL_MAX_FRAGMENT_INPUT_COMPONENTS,					60	},
27373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_texture_image_units",						"MAX_TEXTURE_IMAGE_UNITS has minimum value of 16",							GL_MAX_TEXTURE_IMAGE_UNITS,							16	},
27383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_program_texel_offset",						"MAX_PROGRAM_TEXEL_OFFSET has minimum value of 7",							GL_MAX_PROGRAM_TEXEL_OFFSET,						7	},
27393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_uniform_buffer_bindings",					"MAX_UNIFORM_BUFFER_BINDINGS has minimum value of 24",						GL_MAX_UNIFORM_BUFFER_BINDINGS,						24	},
27403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_combined_uniform_blocks",					"MAX_COMBINED_UNIFORM_BLOCKS has minimum value of 24",						GL_MAX_COMBINED_UNIFORM_BLOCKS,						24	},
27413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_varying_components",							"MAX_VARYING_COMPONENTS has minimum value of 60",							GL_MAX_VARYING_COMPONENTS,							60	},
27423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_varying_vectors",							"MAX_VARYING_VECTORS has minimum value of 15",								GL_MAX_VARYING_VECTORS,								15	},
27433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_combined_texture_image_units",				"MAX_COMBINED_TEXTURE_IMAGE_UNITS has minimum value of 32",					GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,				32	},
27443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_transform_feedback_interleaved_components",	"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS has minimum value of 64",	GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS,	64	},
27453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_transform_feedback_separate_attribs",		"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS has minimum value of 4",			GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,			4	},
27463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_transform_feedback_separate_components",		"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS has minimum value of 4",		GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS,		4	},
27473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "max_samples",									"MAX_SAMPLES has minimum value of 4",										GL_MAX_SAMPLES,										4	},
27483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "red_bits",										"RED_BITS has minimum value of 0",											GL_RED_BITS,										0	},
27493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "green_bits",										"GREEN_BITS has minimum value of 0",										GL_GREEN_BITS,										0	},
27503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blue_bits",										"BLUE_BITS has minimum value of 0",											GL_BLUE_BITS,										0	},
27513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "alpha_bits",										"ALPHA_BITS has minimum value of 0",										GL_ALPHA_BITS,										0	},
27523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "depth_bits",										"DEPTH_BITS has minimum value of 0",										GL_DEPTH_BITS,										0	},
27533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "stencil_bits",									"STENCIL_BITS has minimum value of 0",										GL_STENCIL_BITS,									0	},
27543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
27553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const LimitedStateInteger implementationMaxLimits[] =
27563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
27573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "min_program_texel_offset",						"MIN_PROGRAM_TEXEL_OFFSET has maximum value of -8",							GL_MIN_PROGRAM_TEXEL_OFFSET,						-8	},
27583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "uniform_buffer_offset_alignment",				"UNIFORM_BUFFER_OFFSET_ALIGNMENT has minimum value of 1",					GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,					256	},
27593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
27603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \note implementation defined limits have their own tests so just check the conversions to boolean, int64 and float
27623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier* implementationLimitVerifiers[] = {m_verifierBoolean, m_verifierInteger64, m_verifierFloat};
27633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(implementationMinLimits); testNdx++)
27653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
27663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(implementationMaxLimits); testNdx++)
27673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
27683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier* normalVerifiers[] = {m_verifierBoolean, m_verifierInteger, m_verifierInteger64, m_verifierFloat};
27703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(implementationLimitVerifiers, addChild(new SampleBuffersTestCase		(m_context,	 verifier, (std::string("sample_buffers")						+ verifier->getTestNamePostfix()).c_str(),		"SAMPLE_BUFFERS")));
27723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new SamplesTestCase				(m_context,	 verifier, (std::string("samples")								+ verifier->getTestNamePostfix()).c_str(),		"SAMPLES")));
27743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new DepthFuncTestCase			(m_context,	 verifier, (std::string("depth_func")							+ verifier->getTestNamePostfix()).c_str(),		"DEPTH_FUNC")));
27773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new CullFaceTestCase			(m_context,	 verifier, (std::string("cull_face_mode")						+ verifier->getTestNamePostfix()).c_str(),		"CULL_FACE_MODE")));
27783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new FrontFaceTestCase			(m_context,	 verifier, (std::string("front_face_mode")						+ verifier->getTestNamePostfix()).c_str(),		"FRONT_FACE")));
27793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ViewPortTestCase			(m_context,	 verifier, (std::string("viewport")								+ verifier->getTestNamePostfix()).c_str(),		"VIEWPORT")));
27803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ScissorBoxTestCase			(m_context,	 verifier, (std::string("scissor_box")							+ verifier->getTestNamePostfix()).c_str(),		"SCISSOR_BOX")));
27813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new MaxViewportDimsTestCase		(m_context,	 verifier, (std::string("max_viewport_dims")					+ verifier->getTestNamePostfix()).c_str(),		"MAX_VIEWPORT_DIMS")));
27823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilRefTestCase			(m_context,	 verifier, (std::string("stencil_ref")							+ verifier->getTestNamePostfix()).c_str(),		"STENCIL_REF",						GL_STENCIL_REF)));
27833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
27883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct NamedStencilOp
27903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
27913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		name;
27923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
27933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		frontDescription;
27943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum			frontTarget;
27953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		backDescription;
27963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum			backTarget;
27973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} stencilOps[] =
27983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
27993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "fail",		"STENCIL_FAIL",				GL_STENCIL_FAIL,			"STENCIL_BACK_FAIL",			GL_STENCIL_BACK_FAIL			},
28003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "depth_fail",	"STENCIL_PASS_DEPTH_FAIL",	GL_STENCIL_PASS_DEPTH_FAIL,	"STENCIL_BACK_PASS_DEPTH_FAIL",	GL_STENCIL_BACK_PASS_DEPTH_FAIL	},
28013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "depth_pass",	"STENCIL_PASS_DEPTH_PASS",	GL_STENCIL_PASS_DEPTH_PASS,	"STENCIL_BACK_PASS_DEPTH_PASS",	GL_STENCIL_BACK_PASS_DEPTH_PASS	}
28023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
28033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(stencilOps); testNdx++)
28053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilFuncTestCase					(m_context, verifier,	(std::string("stencil_func")								+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_FUNC")));
28173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilWriteMaskTestCase			(m_context, verifier,	(std::string("stencil_writemask")							+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_WRITEMASK",					GL_STENCIL_WRITEMASK)));
28283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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)));
28333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct PixelStoreState
28353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
28373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
28383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		target;
28393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			initialValue;
28403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} pixelStoreStates[] =
28413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "unpack_image_height","UNPACK_IMAGE_HEIGHT",	GL_UNPACK_IMAGE_HEIGHT,	0 },
28433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "unpack_skip_images",	"UNPACK_SKIP_IMAGES",	GL_UNPACK_SKIP_IMAGES,	0 },
28443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "unpack_row_length",	"UNPACK_ROW_LENGTH",	GL_UNPACK_ROW_LENGTH,	0 },
28453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "unpack_skip_rows",	"UNPACK_SKIP_ROWS",		GL_UNPACK_SKIP_ROWS,	0 },
28463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "unpack_skip_pixels",	"UNPACK_SKIP_PIXELS",	GL_UNPACK_SKIP_PIXELS,	0 },
28473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "pack_row_length",	"PACK_ROW_LENGTH",		GL_PACK_ROW_LENGTH,		0 },
28483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "pack_skip_rows",		"PACK_SKIP_ROWS",		GL_PACK_SKIP_ROWS,		0 },
28493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "pack_skip_pixels",	"PACK_SKIP_PIXELS",		GL_PACK_SKIP_PIXELS,	0 }
28503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
28513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(pixelStoreStates); testNdx++)
28523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new PixelStoreAlignTestCase(m_context, verifier, (std::string("unpack_alignment")	+ verifier->getTestNamePostfix()).c_str(),	"UNPACK_ALIGNMENT",	GL_UNPACK_ALIGNMENT)));
28573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new PixelStoreAlignTestCase(m_context, verifier, (std::string("pack_alignment")		+ verifier->getTestNamePostfix()).c_str(),	"PACK_ALIGNMENT",	GL_PACK_ALIGNMENT)));
28583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct BlendColorState
28603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
28623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
28633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		target;
28643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			initialValue;
28653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} blendColorStates[] =
28663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blend_src_rgb",		"BLEND_SRC_RGB",	GL_BLEND_SRC_RGB,		GL_ONE	},
28683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blend_src_alpha",	"BLEND_SRC_ALPHA",	GL_BLEND_SRC_ALPHA,		GL_ONE	},
28693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blend_dst_rgb",		"BLEND_DST_RGB",	GL_BLEND_DST_RGB,		GL_ZERO	},
28703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blend_dst_alpha",	"BLEND_DST_ALPHA",	GL_BLEND_DST_ALPHA,		GL_ZERO	}
28713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
28723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(blendColorStates); testNdx++)
28733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct BlendEquationState
28793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
28813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
28823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		target;
28833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			initialValue;
28843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} blendEquationStates[] =
28853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blend_equation_rgb",		"BLEND_EQUATION_RGB",	GL_BLEND_EQUATION_RGB,		GL_FUNC_ADD	},
28873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "blend_equation_alpha",	"BLEND_EQUATION_ALPHA",	GL_BLEND_EQUATION_ALPHA,	GL_FUNC_ADD	}
28883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
28893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(blendEquationStates); testNdx++)
28903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
28933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct ImplementationArrayReturningState
28963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
28973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
28983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
28993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		target;
29003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		targetLengthTarget;
29013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			minLength;
29023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} implementationArrayReturningStates[] =
29033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "compressed_texture_formats",		"COMPRESSED_TEXTURE_FORMATS",	GL_COMPRESSED_TEXTURE_FORMATS,	GL_NUM_COMPRESSED_TEXTURE_FORMATS,	10	},
29053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "program_binary_formats",			"PROGRAM_BINARY_FORMATS",		GL_PROGRAM_BINARY_FORMATS,		GL_NUM_PROGRAM_BINARY_FORMATS,		0	},
29063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "shader_binary_formats",			"SHADER_BINARY_FORMATS",		GL_SHADER_BINARY_FORMATS,		GL_NUM_SHADER_BINARY_FORMATS,		0	}
29073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
29083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(implementationArrayReturningStates); testNdx++)
29093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		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)));
29113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct BufferBindingState
29143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
29163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
29173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		target;
29183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		type;
29193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} bufferBindingStates[] =
29203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "array_buffer_binding",				"ARRAY_BUFFER_BINDING",					GL_ARRAY_BUFFER_BINDING,				GL_ARRAY_BUFFER				},
29223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "uniform_buffer_binding",				"UNIFORM_BUFFER_BINDING",				GL_UNIFORM_BUFFER_BINDING,				GL_UNIFORM_BUFFER			},
29233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "pixel_pack_buffer_binding",			"PIXEL_PACK_BUFFER_BINDING",			GL_PIXEL_PACK_BUFFER_BINDING,			GL_PIXEL_PACK_BUFFER		},
29243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "pixel_unpack_buffer_binding",		"PIXEL_UNPACK_BUFFER_BINDING",			GL_PIXEL_UNPACK_BUFFER_BINDING,			GL_PIXEL_UNPACK_BUFFER		},
29253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "transform_feedback_buffer_binding",	"TRANSFORM_FEEDBACK_BUFFER_BINDING",	GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,	GL_TRANSFORM_FEEDBACK_BUFFER},
29263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "copy_read_buffer_binding",			"COPY_READ_BUFFER_BINDING",				GL_COPY_READ_BUFFER_BINDING,			GL_COPY_READ_BUFFER			},
29273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "copy_write_buffer_binding",			"COPY_WRITE_BUFFER_BINDING",			GL_COPY_WRITE_BUFFER_BINDING,			GL_COPY_WRITE_BUFFER		}
29283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
29293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(bufferBindingStates); testNdx++)
29303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FOR_EACH_VERIFIER(normalVerifiers, addChild(new BufferBindingTestCase(m_context, verifier, (std::string(bufferBindingStates[testNdx].name) + verifier->getTestNamePostfix()).c_str(), bufferBindingStates[testNdx].description, bufferBindingStates[testNdx].target, bufferBindingStates[testNdx].type)));
29323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ElementArrayBufferBindingTestCase	(m_context, verifier, (std::string("element_array_buffer_binding")	+ verifier->getTestNamePostfix()).c_str())));
29353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new TransformFeedbackBindingTestCase	(m_context, verifier, (std::string("transform_feedback_binding")	+ verifier->getTestNamePostfix()).c_str())));
29363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new CurrentProgramBindingTestCase		(m_context, verifier, (std::string("current_program_binding")		+ verifier->getTestNamePostfix()).c_str(),	"CURRENT_PROGRAM")));
29373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new VertexArrayBindingTestCase			(m_context, verifier, (std::string("vertex_array_binding")			+ verifier->getTestNamePostfix()).c_str(),	"VERTEX_ARRAY_BINDING")));
29383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new StencilClearValueTestCase			(m_context, verifier, (std::string("stencil_clear_value")			+ verifier->getTestNamePostfix()).c_str(),	"STENCIL_CLEAR_VALUE")));
29393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ActiveTextureTestCase				(m_context, verifier, (std::string("active_texture")				+ verifier->getTestNamePostfix()).c_str(),	"ACTIVE_TEXTURE")));
29403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new RenderbufferBindingTestCase			(m_context, verifier, (std::string("renderbuffer_binding")			+ verifier->getTestNamePostfix()).c_str(),	"RENDERBUFFER_BINDING")));
29413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new SamplerObjectBindingTestCase		(m_context, verifier, (std::string("sampler_binding")				+ verifier->getTestNamePostfix()).c_str(),	"SAMPLER_BINDING")));
29423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const struct TextureBinding
29443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	name;
29463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	description;
29473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		target;
29483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLenum		type;
29493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} textureBindings[] =
29503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "texture_binding_2d",			"TEXTURE_BINDING_2D",		GL_TEXTURE_BINDING_2D,			GL_TEXTURE_2D		},
29523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "texture_binding_3d",			"TEXTURE_BINDING_3D",		GL_TEXTURE_BINDING_3D,			GL_TEXTURE_3D		},
29533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "texture_binding_2d_array",	"TEXTURE_BINDING_2D_ARRAY",	GL_TEXTURE_BINDING_2D_ARRAY,	GL_TEXTURE_2D_ARRAY	},
29543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "texture_binding_cube_map",	"TEXTURE_BINDING_CUBE_MAP",	GL_TEXTURE_BINDING_CUBE_MAP,	GL_TEXTURE_CUBE_MAP	}
29553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
29563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(textureBindings); testNdx++)
29583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FOR_EACH_VERIFIER(normalVerifiers, addChild(new TextureBindingTestCase(m_context, verifier, (std::string(textureBindings[testNdx].name) + verifier->getTestNamePostfix()).c_str(), textureBindings[testNdx].description, textureBindings[testNdx].target, textureBindings[testNdx].type)));
29603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new FrameBufferBindingTestCase		(m_context, verifier, (std::string("framebuffer_binding")			+ verifier->getTestNamePostfix()).c_str(),	"DRAW_FRAMEBUFFER_BINDING and READ_FRAMEBUFFER_BINDING")));
29643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	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")));
29653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new ReadBufferCase					(m_context, verifier, (std::string("read_buffer")					+ verifier->getTestNamePostfix()).c_str(),	"READ_BUFFER")));
29663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(normalVerifiers, addChild(new DrawBufferCase					(m_context, verifier, (std::string("draw_buffer")					+ verifier->getTestNamePostfix()).c_str(),	"DRAW_BUFFER")));
29673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
29683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid IntegerStateQueryTests::deinit (void)
29703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
29713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierBoolean)
29723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierBoolean;
29743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierBoolean = DE_NULL;
29753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierInteger)
29773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierInteger;
29793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierInteger = DE_NULL;
29803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierInteger64)
29823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierInteger64;
29843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierInteger64 = DE_NULL;
29853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierFloat)
29873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
29883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierFloat;
29893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierFloat = DE_NULL;
29903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
29913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	this->TestCaseGroup::deinit();
29933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
29943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
29953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
29963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
29973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
2998