13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 2.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 Float State Query tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es2fFloatStateQueryTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsStateQueryUtil.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es2fApiCase.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuFormatUtil.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <limits>
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw; // GLint and other GL types
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls;
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles2
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace FloatStateQueryVerifiers
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
51b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyryconst int FLOAT_EXPANSION_E		= 0x03FF; // 10 bits error allowed, requires 22 accurate bits
52b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyryconst int FLOAT_EXPANSION_E_64	= 0x07FF;
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLint64 expandGLFloatToInteger (GLfloat f)
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLuint64 referenceValue = (GLint64)((f * double(0xFFFFFFFFULL) - 1) / 2);
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return referenceValue;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGLint clampToGLint (GLint64 val)
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (GLint)de::clamp<GLint64>(val, std::numeric_limits<GLint>::min(), std::numeric_limits<GLint>::max());
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// StateVerifier
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass StateVerifier : protected glu::CallLogWrapper
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						StateVerifier					(const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix);
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual				~StateVerifier					(); // make GCC happy
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*			getTestNamePostfix				(void) const;
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyFloat						(tcu::TestContext& testCtx, GLenum name, GLfloat reference)																																		= DE_NULL;
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// "Expanded" == Float to int conversion converts from [-1.0 to 1.0] -> [MIN_INT MAX_INT]
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyFloatExpanded				(tcu::TestContext& testCtx, GLenum name, GLfloat reference)																																		= DE_NULL;
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyFloat2Expanded			(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1)																												= DE_NULL;
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyFloat4Color				(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3)																		= DE_NULL;
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// verify that the given range is completely whitin the GL state range
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		verifyFloatRange				(tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max)																																= DE_NULL;
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*	const	m_testNamePostfix;
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryStateVerifier::StateVerifier (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix)
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: glu::CallLogWrapper	(gl, log)
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_testNamePostfix		(testNamePostfix)
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enableLogging(true);
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
983c827367444ee418f129b2c238299f49d3264554Jarkko PoyryStateVerifier::~StateVerifier ()
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* StateVerifier::getTestNamePostfix (void) const
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_testNamePostfix;
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// GetBooleanVerifier
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetBooleanVerifier : public StateVerifier
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetBooleanVerifier				(const glw::Functions& gl, tcu::TestLog& log);
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat						(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatExpanded				(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat2Expanded			(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1);
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat4Color				(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3);
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatRange				(tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max);
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1203c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetBooleanVerifier::GetBooleanVerifier (const glw::Functions& gl, tcu::TestLog& log)
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getboolean")
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyFloat (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean> state;
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, &state);
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLboolean expectedGLState = reference ? GL_TRUE : GL_FALSE;
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state != expectedGLState)
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1393c827367444ee418f129b2c238299f49d3264554Jarkko 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;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyFloatExpanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference, -1.0f, 1.0f));
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyFloat(testCtx, name, reference);
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyFloat2Expanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1)
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference0, -1.0f, 1.0f));
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference1, -1.0f, 1.0f));
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLboolean referenceAsGLBoolean[] =
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference0 ? GLboolean(GL_TRUE) : GLboolean(GL_FALSE),
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference1 ? GLboolean(GL_TRUE) : GLboolean(GL_FALSE),
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean[2]> boolVector2;
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, boolVector2);
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!boolVector2.verifyValidity(testCtx))
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (boolVector2[0] != referenceAsGLBoolean[0] ||
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		boolVector2[1] != referenceAsGLBoolean[1])
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (boolVector2[0] ? "GL_TRUE" : "GL_FALSE") << " "
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (boolVector2[1] ? "GL_TRUE" : "GL_FALSE") << " "
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< TestLog::EndMessage;
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyFloat4Color (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3)
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLboolean referenceAsGLBoolean[] =
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference0 ? GLboolean(GL_TRUE) : GLboolean(GL_FALSE),
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference1 ? GLboolean(GL_TRUE) : GLboolean(GL_FALSE),
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference2 ? GLboolean(GL_TRUE) : GLboolean(GL_FALSE),
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		reference3 ? GLboolean(GL_TRUE) : GLboolean(GL_FALSE),
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean[4]> boolVector4;
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, boolVector4);
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!boolVector4.verifyValidity(testCtx))
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (boolVector4[0] != referenceAsGLBoolean[0] ||
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		boolVector4[1] != referenceAsGLBoolean[1] ||
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		boolVector4[2] != referenceAsGLBoolean[2] ||
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		boolVector4[3] != referenceAsGLBoolean[3])
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected "
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (referenceAsGLBoolean[0] ? "GL_TRUE" : "GL_FALSE") << " "
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (referenceAsGLBoolean[1] ? "GL_TRUE" : "GL_FALSE") << " "
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (referenceAsGLBoolean[2] ? "GL_TRUE" : "GL_FALSE") << " "
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< (referenceAsGLBoolean[3] ? "GL_TRUE" : "GL_FALSE") << TestLog::EndMessage;
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean value");
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetBooleanVerifier::verifyFloatRange (tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLboolean[2]> range;
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetBooleanv(name, range);
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!range.verifyValidity(testCtx))
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (range[0] == GL_FALSE)
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (max < 0 || min < 0)
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.getLog() << TestLog::Message << "// ERROR: range [" << min << ", " << max << "] is not in range [" << (range[0] == GL_TRUE ? "GL_TRUE" : (range[0] == GL_FALSE ? "GL_FALSE" : "non-boolean")) << ", " << (range[1] == GL_TRUE ? "GL_TRUE" : (range[1] == GL_FALSE ? "GL_FALSE" : "non-boolean")) << "]"  << TestLog::EndMessage;
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean range");
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (range[1] == GL_FALSE)
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (max > 0 || min > 0)
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.getLog() << TestLog::Message << "// ERROR: range [" << min << ", " << max << "] is not in range [" << (range[0] == GL_TRUE ? "GL_TRUE" : (range[0] == GL_FALSE ? "GL_FALSE" : "non-boolean")) << ", " << (range[1] == GL_TRUE ? "GL_TRUE" : (range[1] == GL_FALSE ? "GL_FALSE" : "non-boolean")) << "]"  << TestLog::EndMessage;
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid boolean range");
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//GetIntegerVerifier
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetIntegerVerifier : public StateVerifier
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetIntegerVerifier		(const glw::Functions& gl, tcu::TestLog& log);
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat						(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatExpanded				(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat2Expanded			(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1);
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat4Color				(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3);
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatRange				(tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max);
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetIntegerVerifier::GetIntegerVerifier (const glw::Functions& gl, tcu::TestLog& log)
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getinteger")
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyFloat (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint expectedGLStateMax = StateQueryUtil::roundGLfloatToNearestIntegerHalfUp<GLint>(reference);
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint expectedGLStateMin = StateQueryUtil::roundGLfloatToNearestIntegerHalfDown<GLint>(reference);
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < expectedGLStateMin || state > expectedGLStateMax)
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected rounding to the nearest integer, valid range [" << expectedGLStateMin << "," << expectedGLStateMax << "]; got " << state << TestLog::EndMessage;
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyFloatExpanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference, -1.0f, 1.0f));
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::toHex;
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint expectedGLStateMax = clampToGLint(expandGLFloatToInteger(reference) + FLOAT_EXPANSION_E);
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint expectedGLStateMin = clampToGLint(expandGLFloatToInteger(reference) - FLOAT_EXPANSION_E);
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint> state;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, &state);
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < expectedGLStateMin || state > expectedGLStateMax)
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected in range [" << toHex(expectedGLStateMin) << "," << toHex(expectedGLStateMax) << "]; got " << toHex((GLint)state) << TestLog::EndMessage;
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyFloat2Expanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1)
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference0, -1.0f, 1.0f));
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference1, -1.0f, 1.0f));
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::toHex;
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint referenceAsGLintMin[] =
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference0) - FLOAT_EXPANSION_E),
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference1) - FLOAT_EXPANSION_E)
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint referenceAsGLintMax[] =
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference0) + FLOAT_EXPANSION_E),
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference1) + FLOAT_EXPANSION_E)
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint[2]> floatVector2;
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, floatVector2);
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector2.verifyValidity(testCtx))
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector2[0] < referenceAsGLintMin[0] || floatVector2[0] > referenceAsGLintMax[0] ||
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector2[1] < referenceAsGLintMin[1] || floatVector2[1] > referenceAsGLintMax[1])
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: expected in ranges "
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[0]) << " " << toHex(referenceAsGLintMax[0]) << "], "
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[1]) << " " << toHex(referenceAsGLintMax[1]) << "]"
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "; got "
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector2[0]) << ", "
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector2[1]) << " "<< TestLog::EndMessage;
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyFloat4Color (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3)
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::toHex;
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint referenceAsGLintMin[] =
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference0) - FLOAT_EXPANSION_E),
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference1) - FLOAT_EXPANSION_E),
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference2) - FLOAT_EXPANSION_E),
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference3) - FLOAT_EXPANSION_E)
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint referenceAsGLintMax[] =
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference0) + FLOAT_EXPANSION_E),
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference1) + FLOAT_EXPANSION_E),
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference2) + FLOAT_EXPANSION_E),
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		clampToGLint(expandGLFloatToInteger(reference3) + FLOAT_EXPANSION_E)
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint[4]> floatVector4;
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, floatVector4);
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector4.verifyValidity(testCtx))
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector4[0] < referenceAsGLintMin[0] || floatVector4[0] > referenceAsGLintMax[0] ||
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[1] < referenceAsGLintMin[1] || floatVector4[1] > referenceAsGLintMax[1] ||
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[2] < referenceAsGLintMin[2] || floatVector4[2] > referenceAsGLintMax[2] ||
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[3] < referenceAsGLintMin[3] || floatVector4[3] > referenceAsGLintMax[3])
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: expected in ranges "
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[0]) << " " << toHex(referenceAsGLintMax[0]) << "], "
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[1]) << " " << toHex(referenceAsGLintMax[1]) << "], "
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[2]) << " " << toHex(referenceAsGLintMax[2]) << "], "
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[3]) << " " << toHex(referenceAsGLintMax[3]) << "]"
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "; got "
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[0]) << ", "
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[1]) << ", "
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[2]) << ", "
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[3]) << " "<< TestLog::EndMessage;
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetIntegerVerifier::verifyFloatRange (tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max)
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint testRangeAsGLint[] =
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StateQueryUtil::roundGLfloatToNearestIntegerHalfUp<GLint>(min),
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StateQueryUtil::roundGLfloatToNearestIntegerHalfDown<GLint>(max)
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint[2]> range;
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetIntegerv(name, range);
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!range.verifyValidity(testCtx))
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// check if test range outside of gl state range
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (testRangeAsGLint[0] < range[0] ||
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testRangeAsGLint[1] > range[1])
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: range ["
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< testRangeAsGLint[0] << ", "
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< testRangeAsGLint[1] << "]"
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< " is not in range ["
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< range[0] << ", "
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< range[1] << "]" << TestLog::EndMessage;
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer range");
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//GetInteger64Verifier
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetInteger64Verifier : public StateVerifier
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetInteger64Verifier		(const glw::Functions& gl, tcu::TestLog& log);
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat						(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatExpanded				(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat2Expanded			(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1);
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat4Color				(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3);
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatRange				(tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max);
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetInteger64Verifier::GetInteger64Verifier (const glw::Functions& gl, tcu::TestLog& log)
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getinteger64")
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyFloat (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 expectedGLStateMax = StateQueryUtil::roundGLfloatToNearestIntegerHalfUp<GLint64>(reference);
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 expectedGLStateMin = StateQueryUtil::roundGLfloatToNearestIntegerHalfDown<GLint64>(reference);
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < expectedGLStateMin || state > expectedGLStateMax)
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected rounding to the nearest integer, valid range [" << expectedGLStateMin << "," << expectedGLStateMax << "]; got " << state << TestLog::EndMessage;
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyFloatExpanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference, -1.0f, 1.0f));
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::toHex;
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
480b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry	const GLint64 expectedGLStateMax = expandGLFloatToInteger(reference) + FLOAT_EXPANSION_E_64;
481b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry	const GLint64 expectedGLStateMin = expandGLFloatToInteger(reference) - FLOAT_EXPANSION_E_64;
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64> state;
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, &state);
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state < expectedGLStateMin || state > expectedGLStateMax)
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected in range [" << toHex(expectedGLStateMin) << "," << toHex(expectedGLStateMax) << "]; got " << toHex((GLint64)state) << TestLog::EndMessage;
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyFloat2Expanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1)
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference0, -1.0f, 1.0f));
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference1, -1.0f, 1.0f));
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::toHex;
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 referenceAsGLintMin[] =
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
507b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference0) - FLOAT_EXPANSION_E_64,
508b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference1) - FLOAT_EXPANSION_E_64
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 referenceAsGLintMax[] =
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
512b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference0) + FLOAT_EXPANSION_E_64,
513b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference1) + FLOAT_EXPANSION_E_64
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64[2]> floatVector2;
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, floatVector2);
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector2.verifyValidity(testCtx))
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector2[0] < referenceAsGLintMin[0] || floatVector2[0] > referenceAsGLintMax[0] ||
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector2[1] < referenceAsGLintMin[1] || floatVector2[1] > referenceAsGLintMax[1])
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: expected in ranges "
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[0]) << " " << toHex(referenceAsGLintMax[0]) << "], "
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[1]) << " " << toHex(referenceAsGLintMax[1]) << "]"
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "; got "
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector2[0]) << ", "
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector2[1]) << " "<< TestLog::EndMessage;
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyFloat4Color (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3)
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::toHex;
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 referenceAsGLintMin[] =
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
545b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference0) - FLOAT_EXPANSION_E_64,
546b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference1) - FLOAT_EXPANSION_E_64,
547b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference2) - FLOAT_EXPANSION_E_64,
548b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference3) - FLOAT_EXPANSION_E_64
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 referenceAsGLintMax[] =
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
552b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference0) + FLOAT_EXPANSION_E_64,
553b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference1) + FLOAT_EXPANSION_E_64,
554b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference2) + FLOAT_EXPANSION_E_64,
555b6017bbcad91d601e38d44c5ce129eb7580e75cbJarkko Pöyry		expandGLFloatToInteger(reference3) + FLOAT_EXPANSION_E_64
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64[4]> floatVector4;
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, floatVector4);
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector4.verifyValidity(testCtx))
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector4[0] < referenceAsGLintMin[0] || floatVector4[0] > referenceAsGLintMax[0] ||
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[1] < referenceAsGLintMin[1] || floatVector4[1] > referenceAsGLintMax[1] ||
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[2] < referenceAsGLintMin[2] || floatVector4[2] > referenceAsGLintMax[2] ||
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[3] < referenceAsGLintMin[3] || floatVector4[3] > referenceAsGLintMax[3])
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: expected in ranges "
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[0]) << " " << toHex(referenceAsGLintMax[0]) << "], "
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[1]) << " " << toHex(referenceAsGLintMax[1]) << "], "
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[2]) << " " << toHex(referenceAsGLintMax[2]) << "], "
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "[" << toHex(referenceAsGLintMin[3]) << " " << toHex(referenceAsGLintMax[3]) << "]"
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "; got "
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[0]) << ", "
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[1]) << ", "
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[2]) << ", "
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< toHex(floatVector4[3]) << " "<< TestLog::EndMessage;
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer value");
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetInteger64Verifier::verifyFloatRange (tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max)
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const GLint64 testRangeAsGLint[] =
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StateQueryUtil::roundGLfloatToNearestIntegerHalfUp<GLint64>(min),
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StateQueryUtil::roundGLfloatToNearestIntegerHalfDown<GLint64>(max)
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLint64[2]> range;
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetInteger64v(name, range);
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!range.verifyValidity(testCtx))
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// check if test range outside of gl state range
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (testRangeAsGLint[0] < range[0] ||
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testRangeAsGLint[1] > range[1])
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: range ["
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< testRangeAsGLint[0] << ", "
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< testRangeAsGLint[1] << "]"
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< " is not in range ["
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< range[0] << ", "
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< range[1] << "]" << TestLog::EndMessage;
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid integer range");
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//GetFloatVerifier
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GetFloatVerifier : public StateVerifier
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GetFloatVerifier			(const glw::Functions& gl, tcu::TestLog& log);
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat						(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatExpanded				(tcu::TestContext& testCtx, GLenum name, GLfloat reference);
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat2Expanded			(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1);
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloat4Color				(tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3);
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	verifyFloatRange				(tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max);
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6323c827367444ee418f129b2c238299f49d3264554Jarkko PoyryGetFloatVerifier::GetFloatVerifier (const glw::Functions& gl, tcu::TestLog& log)
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: StateVerifier(gl, log, "_getfloat")
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyFloat (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat> state;
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, &state);
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!state.verifyValidity(testCtx))
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state != reference)
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyFloatExpanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference)
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference, -1.0f, 1.0f));
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	verifyFloat(testCtx, name, reference);
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyFloat2Expanded (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1)
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference0, -1.0f, 1.0f));
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(reference1, -1.0f, 1.0f));
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat[2]> floatVector2;
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, floatVector2);
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector2.verifyValidity(testCtx))
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector2[0] != reference0 ||
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector2[1] != reference1)
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference0 << ", " << reference1 << "; got " << floatVector2[0] << " " << floatVector2[1] << TestLog::EndMessage;
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyFloat4Color (tcu::TestContext& testCtx, GLenum name, GLfloat reference0, GLfloat reference1, GLfloat reference2, GLfloat reference3)
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat[4]> floatVector4;
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, floatVector4);
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector4.verifyValidity(testCtx))
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector4[0] != reference0 ||
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[1] != reference1 ||
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[2] != reference2 ||
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector4[3] != reference3)
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "// ERROR: expected "<< reference0 << ", " << reference1 << ", " << reference2 << ", " << reference3
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "; got " << floatVector4[0] << ", " << floatVector4[1] << ", " << floatVector4[2] << ", " << floatVector4[3]
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< TestLog::EndMessage;
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid GetFloatVerifier::verifyFloatRange (tcu::TestContext& testCtx, GLenum name, GLfloat min, GLfloat max)
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using tcu::TestLog;
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateQueryMemoryWriteGuard<GLfloat[2]> floatVector2;
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGetFloatv(name, floatVector2);
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!floatVector2.verifyValidity(testCtx))
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (floatVector2[0] > min ||
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		floatVector2[1] < max)
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.getLog() << TestLog::Message << "// ERROR: expected in range [" << min << ", " << max << "]; got [" << floatVector2[0] << " " << floatVector2[1]  << "]" << TestLog::EndMessage;
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float range");
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // FloatStateQueryVerifiers
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace FloatStateQueryVerifiers;
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DepthRangeCase : public ApiCase
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DepthRangeCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloat2Expanded(m_testCtx, GL_DEPTH_RANGE, 0.0f, 1.0f);
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const struct FixedTest
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float n, f;
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			} fixedTests[] =
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 0.5f, 1.0f },
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 0.0f, 0.5f },
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 0.0f, 0.0f },
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 1.0f, 1.0f }
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(fixedTests); ++ndx)
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glDepthRangef(fixedTests[ndx].n, fixedTests[ndx].f);
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat2Expanded(m_testCtx, GL_DEPTH_RANGE, fixedTests[ndx].n, fixedTests[ndx].f);
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int numIterations = 120;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int i = 0; i < numIterations; ++i)
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLfloat n	= rnd.getFloat(0, 1);
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLfloat f	= rnd.getFloat(0, 1);
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glDepthRangef(n, f);
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat2Expanded(m_testCtx, GL_DEPTH_RANGE, n, f);
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass LineWidthCase : public ApiCase
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LineWidthCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLfloat range[2] = {1};
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloat(m_testCtx, GL_LINE_WIDTH, 1.0f);
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int numIterations = 120;
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numIterations; ++i)
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const GLfloat reference = rnd.getFloat(range[0], range[1]);
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glLineWidth(reference);
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyFloat(m_testCtx, GL_LINE_WIDTH, reference);
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PolygonOffsetFactorCase : public ApiCase
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PolygonOffsetFactorCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloat(m_testCtx, GL_POLYGON_OFFSET_FACTOR, 0.0f);
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const float fixedTests[] =
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				0.0f, 0.5f, -0.5f, 1.5f
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(fixedTests); ++ndx)
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glPolygonOffset(fixedTests[ndx], 0);
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_POLYGON_OFFSET_FACTOR, fixedTests[ndx]);
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int numIterations = 120;
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int i = 0; i < numIterations; ++i)
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const GLfloat reference = rnd.getFloat(-64000, 64000);
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glPolygonOffset(reference, 0);
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_POLYGON_OFFSET_FACTOR, reference);
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PolygonOffsetUnitsCase : public ApiCase
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PolygonOffsetUnitsCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloat(m_testCtx, GL_POLYGON_OFFSET_UNITS, 0.0f);
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const float fixedTests[] =
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				0.0f, 0.5f, -0.5f, 1.5f
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(fixedTests); ++ndx)
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glPolygonOffset(0, fixedTests[ndx]);
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_POLYGON_OFFSET_UNITS, fixedTests[ndx]);
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int numIterations = 120;
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int i = 0; i < numIterations; ++i)
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const GLfloat reference = rnd.getFloat(-64000, 64000);
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glPolygonOffset(0, reference);
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_POLYGON_OFFSET_UNITS, reference);
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass SampleCoverageCase : public ApiCase
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SampleCoverageCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloat(m_testCtx, GL_SAMPLE_COVERAGE_VALUE, 1.0f);
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const float fixedTests[] =
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				0.0f, 0.5f, 0.45f, 0.55f
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(fixedTests); ++ndx)
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glSampleCoverage(fixedTests[ndx], GL_FALSE);
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_SAMPLE_COVERAGE_VALUE, fixedTests[ndx]);
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const float clampTests[] =
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				-1.0f, -1.5f, 1.45f, 3.55f
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(clampTests); ++ndx)
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glSampleCoverage(clampTests[ndx], GL_FALSE);
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_SAMPLE_COVERAGE_VALUE, de::clamp(clampTests[ndx], 0.0f, 1.0f));
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int numIterations = 120;
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int i = 0; i < numIterations; ++i)
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLfloat		reference	= rnd.getFloat(0, 1);
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLboolean	invert		= rnd.getBool() ? GL_TRUE : GL_FALSE;
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glSampleCoverage(reference, invert);
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat(m_testCtx, GL_SAMPLE_COVERAGE_VALUE, reference);
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ColorClearCase : public ApiCase
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ColorClearCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \note Initial color clear value check is temorarily removed. (until the framework does not alter it)
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		//m_verifier->verifyFloat4Color(m_testCtx, GL_COLOR_CLEAR_VALUE, 0, 0, 0, 0);
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		//expectError(GL_NO_ERROR);
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const struct FixedTest
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float r, g, b, a;
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			} fixedTests[] =
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 0.5f, 1.0f, 0.5f, 1.0f },
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 0.0f, 0.5f, 0.0f, 0.5f },
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 0.0f, 0.0f, 0.0f, 0.0f },
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{ 1.0f, 1.0f, 1.0f, 1.0f },
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(fixedTests); ++ndx)
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glClearColor(fixedTests[ndx].r, fixedTests[ndx].g, fixedTests[ndx].b, fixedTests[ndx].a);
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat4Color(m_testCtx, GL_COLOR_CLEAR_VALUE, fixedTests[ndx].r, fixedTests[ndx].g, fixedTests[ndx].b, fixedTests[ndx].a);
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int numIterations = 120;
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int i = 0; i < numIterations; ++i)
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const GLfloat r = rnd.getFloat(0, 1);
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const GLfloat g = rnd.getFloat(0, 1);
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const GLfloat b = rnd.getFloat(0, 1);
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const GLfloat a = rnd.getFloat(0, 1);
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glClearColor(r, g, b, a);
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_verifier->verifyFloat4Color(m_testCtx, GL_COLOR_CLEAR_VALUE, r, g, b, a);
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				expectError(GL_NO_ERROR);
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass DepthClearCase : public ApiCase
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DepthClearCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int numIterations = 120;
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		de::Random rnd(0xabcdef);
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloatExpanded(m_testCtx, GL_DEPTH_CLEAR_VALUE, 1);
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < numIterations; ++i)
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const GLfloat ref = rnd.getFloat(0, 1);
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			glClearDepthf(ref);
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_verifier->verifyFloatExpanded(m_testCtx, GL_DEPTH_CLEAR_VALUE, ref);
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			expectError(GL_NO_ERROR);
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass AliasedPointSizeRangeCase : public ApiCase
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	AliasedPointSizeRangeCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloatRange(m_testCtx, GL_ALIASED_POINT_SIZE_RANGE, 1, 1);
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass AliasedLineWidthRangeCase : public ApiCase
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	AliasedLineWidthRangeCase (Context& context, StateVerifier* verifier, const char* name, const char* description)
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: ApiCase		(context, name, description)
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_verifier	(verifier)
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void test (void)
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifier->verifyFloatRange(m_testCtx, GL_ALIASED_LINE_WIDTH_RANGE, 1, 1);
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		expectError(GL_NO_ERROR);
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier*	m_verifier;
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define FOR_EACH_VERIFIER(VERIFIERS, CODE_BLOCK)												\
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int _verifierNdx = 0; _verifierNdx < DE_LENGTH_OF_ARRAY(VERIFIERS); _verifierNdx++)	\
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{																							\
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		StateVerifier* verifier = VERIFIERS[_verifierNdx];										\
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CODE_BLOCK;																				\
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11033c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFloatStateQueryTests::FloatStateQueryTests (Context& context)
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup			(context, "floats", "Float Values")
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierBoolean		(DE_NULL)
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierInteger		(DE_NULL)
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_verifierFloat		(DE_NULL)
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFloatStateQueryTests::~FloatStateQueryTests (void)
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deinit();
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FloatStateQueryTests::init (void)
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierBoolean == DE_NULL);
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierInteger == DE_NULL);
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_verifierFloat == DE_NULL);
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierBoolean		= new GetBooleanVerifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierInteger		= new GetIntegerVerifier	(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_verifierFloat			= new GetFloatVerifier		(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StateVerifier* verifiers[] = {m_verifierBoolean, m_verifierInteger, m_verifierFloat};
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new DepthRangeCase				(m_context, verifier,	(std::string("depth_range")					+ verifier->getTestNamePostfix()).c_str(),	"DEPTH_RANGE")));
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new LineWidthCase					(m_context, verifier,	(std::string("line_width")					+ verifier->getTestNamePostfix()).c_str(),	"LINE_WIDTH")));
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new PolygonOffsetFactorCase		(m_context, verifier,	(std::string("polygon_offset_factor")		+ verifier->getTestNamePostfix()).c_str(),	"POLYGON_OFFSET_FACTOR")));
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new PolygonOffsetUnitsCase		(m_context, verifier,	(std::string("polygon_offset_units")		+ verifier->getTestNamePostfix()).c_str(),	"POLYGON_OFFSET_UNITS")));
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new SampleCoverageCase			(m_context, verifier,	(std::string("sample_coverage_value")		+ verifier->getTestNamePostfix()).c_str(),	"SAMPLE_COVERAGE_VALUE")));
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new ColorClearCase				(m_context, verifier,	(std::string("color_clear_value")			+ verifier->getTestNamePostfix()).c_str(),	"COLOR_CLEAR_VALUE")));
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new DepthClearCase				(m_context, verifier,	(std::string("depth_clear_value")			+ verifier->getTestNamePostfix()).c_str(),	"DEPTH_CLEAR_VALUE")));
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new AliasedPointSizeRangeCase		(m_context, verifier,	(std::string("aliased_point_size_range")	+ verifier->getTestNamePostfix()).c_str(),	"ALIASED_POINT_SIZE_RANGE")));
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FOR_EACH_VERIFIER(verifiers, addChild(new AliasedLineWidthRangeCase		(m_context, verifier,	(std::string("aliased_line_width_range")	+ verifier->getTestNamePostfix()).c_str(),	"ALIASED_LINE_WIDTH_RANGE")));
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FloatStateQueryTests::deinit (void)
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierBoolean)
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierBoolean;
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierBoolean = DE_NULL;
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierInteger)
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierInteger;
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierInteger = DE_NULL;
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_verifierFloat)
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete m_verifierFloat;
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_verifierFloat = DE_NULL;
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	this->TestCaseGroup::deinit();
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles2
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
1163