blob: e0c0253d9cc7cd0fc0310723df9f1405f8b7521f [file] [log] [blame]
/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL (ES) Module
* -----------------------------------------------
*
* Copyright 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief State Query test utils.
*//*--------------------------------------------------------------------*/
#include "glsStateQueryUtil.hpp"
#include "tcuTestContext.hpp"
#include "tcuFormatUtil.hpp"
#include "gluCallLogWrapper.hpp"
#include "gluStrUtil.hpp"
#include "glwEnums.hpp"
#include "deStringUtil.hpp"
namespace deqp
{
namespace gls
{
namespace StateQueryUtil
{
static bool checkError (tcu::ResultCollector& result, glu::CallLogWrapper& gl, const char* msg)
{
const glw::GLenum errorCode = gl.glGetError();
if (errorCode == GL_NO_ERROR)
return true;
result.fail(std::string(msg) + ": glGetError() returned " + glu::getErrorStr(errorCode).toString());
return false;
}
QueriedState::QueriedState (void)
: m_type(DATATYPE_LAST)
{
}
QueriedState::QueriedState (glw::GLint v)
: m_type(DATATYPE_INTEGER)
{
m_v.vInt = v;
}
QueriedState::QueriedState (glw::GLint64 v)
: m_type(DATATYPE_INTEGER64)
{
m_v.vInt64 = v;
}
QueriedState::QueriedState (glw::GLboolean v)
: m_type(DATATYPE_BOOLEAN)
{
m_v.vBool = v;
}
QueriedState::QueriedState (glw::GLfloat v)
: m_type(DATATYPE_FLOAT)
{
m_v.vFloat = v;
}
QueriedState::QueriedState (glw::GLuint v)
: m_type(DATATYPE_UNSIGNED_INTEGER)
{
m_v.vUint = v;
}
QueriedState::QueriedState (const GLIntVec3& v)
: m_type(DATATYPE_INTEGER_VEC3)
{
m_v.vIntVec3[0] = v[0];
m_v.vIntVec3[1] = v[1];
m_v.vIntVec3[2] = v[2];
}
bool QueriedState::isUndefined (void) const
{
return m_type == DATATYPE_LAST;
}
DataType QueriedState::getType (void) const
{
return m_type;
}
glw::GLint& QueriedState::getIntAccess (void)
{
DE_ASSERT(m_type == DATATYPE_INTEGER);
return m_v.vInt;
}
glw::GLint64& QueriedState::getInt64Access (void)
{
DE_ASSERT(m_type == DATATYPE_INTEGER64);
return m_v.vInt64;
}
glw::GLboolean& QueriedState::getBoolAccess (void)
{
DE_ASSERT(m_type == DATATYPE_BOOLEAN);
return m_v.vBool;
}
glw::GLfloat& QueriedState::getFloatAccess (void)
{
DE_ASSERT(m_type == DATATYPE_FLOAT);
return m_v.vFloat;
}
glw::GLuint& QueriedState::getUintAccess (void)
{
DE_ASSERT(m_type == DATATYPE_UNSIGNED_INTEGER);
return m_v.vUint;
}
QueriedState::GLIntVec3& QueriedState::getIntVec3Access (void)
{
DE_ASSERT(m_type == DATATYPE_INTEGER_VEC3);
return m_v.vIntVec3;
}
// query
void queryState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, QueriedState& state)
{
switch (type)
{
case QUERY_ISENABLED:
{
const glw::GLboolean value = gl.glIsEnabled(target);
if (!checkError(result, gl, "glIsEnabled"))
return;
state = QueriedState(value);
break;
}
case QUERY_BOOLEAN:
{
StateQueryMemoryWriteGuard<glw::GLboolean> value;
gl.glGetBooleanv(target, &value);
if (!checkError(result, gl, "glGetBooleanv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetIntegerv(target, &value);
if (!checkError(result, gl, "glGetIntegerv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_INTEGER64:
{
StateQueryMemoryWriteGuard<glw::GLint64> value;
gl.glGetInteger64v(target, &value);
if (!checkError(result, gl, "glGetInteger64v"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_FLOAT:
{
StateQueryMemoryWriteGuard<glw::GLfloat> value;
gl.glGetFloatv(target, &value);
if (!checkError(result, gl, "glGetFloatv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void queryIndexedState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int index, QueriedState& state)
{
switch (type)
{
case QUERY_INDEXED_BOOLEAN:
{
StateQueryMemoryWriteGuard<glw::GLboolean> value;
gl.glGetBooleani_v(target, index, &value);
if (!checkError(result, gl, "glGetBooleani_v"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_INDEXED_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetIntegeri_v(target, index, &value);
if (!checkError(result, gl, "glGetIntegeri_v"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_INDEXED_INTEGER64:
{
StateQueryMemoryWriteGuard<glw::GLint64> value;
gl.glGetInteger64i_v(target, index, &value);
if (!checkError(result, gl, "glGetInteger64i_v"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void queryAttributeState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int index, QueriedState& state)
{
switch (type)
{
case QUERY_ATTRIBUTE_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetVertexAttribiv(index, target, &value);
if (!checkError(result, gl, "glGetVertexAttribiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_ATTRIBUTE_FLOAT:
{
StateQueryMemoryWriteGuard<glw::GLfloat> value;
gl.glGetVertexAttribfv(index, target, &value);
if (!checkError(result, gl, "glGetVertexAttribfv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_ATTRIBUTE_PURE_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetVertexAttribIiv(index, target, &value);
if (!checkError(result, gl, "glGetVertexAttribIiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_ATTRIBUTE_PURE_UNSIGNED_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLuint> value;
gl.glGetVertexAttribIuiv(index, target, &value);
if (!checkError(result, gl, "glGetVertexAttribIuiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(false);
}
}
void queryFramebufferState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state)
{
switch (type)
{
case QUERY_FRAMEBUFFER_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetFramebufferParameteriv(target, pname, &value);
if (!checkError(result, gl, "glGetVertexAttribiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(false);
}
}
void queryProgramState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint program, glw::GLenum pname, QueriedState& state)
{
switch (type)
{
case QUERY_PROGRAM_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetProgramiv(program, pname, &value);
if (!checkError(result, gl, "glGetProgramiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_PROGRAM_INTEGER_VEC3:
{
StateQueryMemoryWriteGuard<glw::GLint[3]> value;
gl.glGetProgramiv(program, pname, value);
if (!checkError(result, gl, "glGetProgramiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(false);
}
}
void queryPipelineState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint pipeline, glw::GLenum pname, QueriedState& state)
{
switch (type)
{
case QUERY_PIPELINE_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetProgramPipelineiv(pipeline, pname, &value);
if (!checkError(result, gl, "glGetProgramiv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(false);
}
}
void queryTextureParamState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state)
{
switch (type)
{
case QUERY_TEXTURE_PARAM_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetTexParameteriv(target, pname, &value);
if (!checkError(result, gl, "glGetTexParameteriv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_TEXTURE_PARAM_FLOAT:
{
StateQueryMemoryWriteGuard<glw::GLfloat> value;
gl.glGetTexParameterfv(target, pname, &value);
if (!checkError(result, gl, "glGetTexParameterfv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(false);
}
}
void queryTextureLevelState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int level, glw::GLenum pname, QueriedState& state)
{
switch (type)
{
case QUERY_TEXTURE_LEVEL_INTEGER:
{
StateQueryMemoryWriteGuard<glw::GLint> value;
gl.glGetTexLevelParameteriv(target, level, pname, &value);
if (!checkError(result, gl, "glGetTexLevelParameteriv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
case QUERY_TEXTURE_LEVEL_FLOAT:
{
StateQueryMemoryWriteGuard<glw::GLfloat> value;
gl.glGetTexLevelParameterfv(target, level, pname, &value);
if (!checkError(result, gl, "glGetTexLevelParameterfv"))
return;
if (!value.verifyValidity(result))
return;
state = QueriedState(value);
break;
}
default:
DE_ASSERT(false);
}
}
// verify
void verifyBoolean (tcu::ResultCollector& result, QueriedState& state, bool expected)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
const glw::GLboolean reference = expected ? GL_TRUE : GL_FALSE;
if (state.getBoolAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << glu::getBooleanStr(reference) << ", got " << glu::getBooleanStr(state.getBoolAccess());
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER:
{
const glw::GLint reference = expected ? 1 : 0;
if (state.getIntAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << ", got " << state.getIntAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
const glw::GLint64 reference = expected ? 1 : 0;
if (state.getInt64Access() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << ", got " << state.getInt64Access();
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
const glw::GLfloat reference = expected ? 1.0f : 0.0f;
if (state.getFloatAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyInteger (tcu::ResultCollector& result, QueriedState& state, int expected)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
const glw::GLboolean reference = (expected == 0) ? (GL_FALSE) : (GL_TRUE);
if (state.getBoolAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << glu::getBooleanStr(reference) << ", got " << glu::getBooleanStr(state.getBoolAccess());
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER:
{
const glw::GLint reference = expected;
if (state.getIntAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference))
<< ") , got " << state.getIntAccess() << "(" << de::toString(tcu::Format::Hex<8>(state.getIntAccess())) << ")";
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
const glw::GLint64 reference = (glw::GLint64)expected;
if (state.getInt64Access() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) << "), got "
<< state.getInt64Access() << "(" << de::toString(tcu::Format::Hex<8>(state.getInt64Access())) << ")";
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
const glw::GLfloat reference = (glw::GLfloat)expected;
if (state.getFloatAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_UNSIGNED_INTEGER:
{
const glw::GLuint reference = (glw::GLuint)expected;
if (state.getUintAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) << "), got "
<< state.getInt64Access() << "(" << de::toString(tcu::Format::Hex<8>(state.getInt64Access())) << ")";
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyIntegerMin (tcu::ResultCollector& result, QueriedState& state, int minValue)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
if (minValue > 0 && state.getBoolAccess() != GL_TRUE)
{
std::ostringstream buf;
buf << "Expected GL_TRUE, got GL_FALSE";
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER:
{
if (state.getIntAccess() < minValue)
{
std::ostringstream buf;
buf << "Expected greater or equal to " << minValue << ", got " << state.getIntAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
if (state.getInt64Access() < minValue)
{
std::ostringstream buf;
buf << "Expected greater or equal to " << minValue << ", got " << state.getInt64Access();
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
if (state.getFloatAccess() < minValue)
{
std::ostringstream buf;
buf << "Expected greater or equal to " << minValue << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyIntegerMax (tcu::ResultCollector& result, QueriedState& state, int maxValue)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
if (maxValue < 0 && state.getBoolAccess() != GL_TRUE)
{
std::ostringstream buf;
buf << "Expected GL_TRUE, got GL_FALSE";
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER:
{
if (state.getIntAccess() > maxValue)
{
std::ostringstream buf;
buf << "Expected less or equal to " << maxValue << ", got " << state.getIntAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
if (state.getInt64Access() > maxValue)
{
std::ostringstream buf;
buf << "Expected less or equal to " << maxValue << ", got " << state.getInt64Access();
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
if (state.getFloatAccess() > maxValue)
{
std::ostringstream buf;
buf << "Expected less or equal to " << maxValue << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyFloat (tcu::ResultCollector& result, QueriedState& state, float expected)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
const glw::GLboolean reference = (expected == 0.0f) ? (GL_FALSE) : (GL_TRUE);
if (state.getBoolAccess() != reference)
{
std::ostringstream buf;
buf << "Expected " << glu::getBooleanStr(reference) << ", got " << glu::getBooleanStr(state.getBoolAccess());
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER:
{
const glw::GLint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(expected);
const glw::GLint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(expected);
if (state.getIntAccess() < refValueMin ||
state.getIntAccess() > refValueMax)
{
std::ostringstream buf;
if (refValueMin == refValueMax)
buf << "Expected " << refValueMin << ", got " << state.getIntAccess();
else
buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getIntAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
if (state.getFloatAccess() != expected)
{
std::ostringstream buf;
buf << "Expected " << expected << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
const glw::GLint64 refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint64>(expected);
const glw::GLint64 refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint64>(expected);
if (state.getInt64Access() < refValueMin ||
state.getInt64Access() > refValueMax)
{
std::ostringstream buf;
if (refValueMin == refValueMax)
buf << "Expected " << refValueMin << ", got " << state.getInt64Access();
else
buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getInt64Access();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyFloatMin (tcu::ResultCollector& result, QueriedState& state, float minValue)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
if (minValue > 0.0f && state.getBoolAccess() != GL_TRUE)
result.fail("expected GL_TRUE, got GL_FALSE");
break;
}
case DATATYPE_INTEGER:
{
const glw::GLint refValue = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(minValue);
if (state.getIntAccess() < refValue)
{
std::ostringstream buf;
buf << "Expected greater or equal to " << refValue << ", got " << state.getIntAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
if (state.getFloatAccess() < minValue)
{
std::ostringstream buf;
buf << "Expected greater or equal to " << minValue << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
const glw::GLint64 refValue = roundGLfloatToNearestIntegerHalfDown<glw::GLint64>(minValue);
if (state.getInt64Access() < refValue)
{
std::ostringstream buf;
buf << "Expected greater or equal to " << refValue << ", got " << state.getInt64Access();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyFloatMax (tcu::ResultCollector& result, QueriedState& state, float maxValue)
{
switch (state.getType())
{
case DATATYPE_BOOLEAN:
{
if (maxValue < 0.0f && state.getBoolAccess() != GL_TRUE)
result.fail("expected GL_TRUE, got GL_FALSE");
break;
}
case DATATYPE_INTEGER:
{
const glw::GLint refValue = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(maxValue);
if (state.getIntAccess() > refValue)
{
std::ostringstream buf;
buf << "Expected less or equal to " << refValue << ", got " << state.getIntAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_FLOAT:
{
if (state.getFloatAccess() > maxValue)
{
std::ostringstream buf;
buf << "Expected less or equal to " << maxValue << ", got " << state.getFloatAccess();
result.fail(buf.str());
}
break;
}
case DATATYPE_INTEGER64:
{
const glw::GLint64 refValue = roundGLfloatToNearestIntegerHalfUp<glw::GLint64>(maxValue);
if (state.getInt64Access() > refValue)
{
std::ostringstream buf;
buf << "Expected less or equal to " << refValue << ", got " << state.getInt64Access();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyIntegerVec3 (tcu::ResultCollector& result, QueriedState& state, const tcu::IVec3& expected)
{
switch (state.getType())
{
case DATATYPE_INTEGER_VEC3:
{
if (state.getIntVec3Access()[0] != expected[0] ||
state.getIntVec3Access()[1] != expected[1] ||
state.getIntVec3Access()[2] != expected[2])
{
std::ostringstream buf;
buf << "Expected " << expected << ", got " << state.getIntVec3Access();
result.fail(buf.str());
}
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
// helpers
void verifyStateBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, bool refValue, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyBoolean(result, state, refValue);
}
void verifyStateInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int refValue, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyInteger(result, state, refValue);
}
void verifyStateIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int minValue, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyIntegerMin(result, state, minValue);
}
void verifyStateIntegerMax (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int maxValue, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyIntegerMax(result, state, maxValue);
}
void verifyStateIntegerEqualToOther (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum other, QueryType type)
{
QueriedState stateA;
QueriedState stateB;
queryState(result, gl, type, target, stateA);
queryState(result, gl, type, other, stateB);
if (stateA.isUndefined() || stateB.isUndefined())
return;
switch (type)
{
case QUERY_BOOLEAN:
{
if (stateA.getBoolAccess() != stateB.getBoolAccess())
result.fail("expected equal results");
break;
}
case QUERY_INTEGER:
{
if (stateA.getIntAccess() != stateB.getIntAccess())
result.fail("expected equal results");
break;
}
case QUERY_INTEGER64:
{
if (stateA.getInt64Access() != stateB.getInt64Access())
result.fail("expected equal results");
break;
}
case QUERY_FLOAT:
{
if (stateA.getFloatAccess() != stateB.getFloatAccess())
result.fail("expected equal results");
break;
}
default:
DE_ASSERT(DE_FALSE);
break;
}
}
void verifyStateFloat (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float reference, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyFloat(result, state, reference);
}
void verifyStateFloatMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float minValue, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyFloatMin(result, state, minValue);
}
void verifyStateFloatMax (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float maxValue, QueryType type)
{
QueriedState state;
queryState(result, gl, type, target, state);
if (!state.isUndefined())
verifyFloatMax(result, state, maxValue);
}
void verifyStateIndexedBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, bool expected, QueryType type)
{
QueriedState state;
queryIndexedState(result, gl, type, target, index, state);
if (!state.isUndefined())
verifyBoolean(result, state, expected);
}
void verifyStateIndexedInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int expected, QueryType type)
{
QueriedState state;
queryIndexedState(result, gl, type, target, index, state);
if (!state.isUndefined())
verifyInteger(result, state, expected);
}
void verifyStateIndexedIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int minValue, QueryType type)
{
QueriedState state;
queryIndexedState(result, gl, type, target, index, state);
if (!state.isUndefined())
verifyIntegerMin(result, state, minValue);
}
void verifyStateAttributeInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int expected, QueryType type)
{
QueriedState state;
queryAttributeState(result, gl, type, target, index, state);
if (!state.isUndefined())
verifyInteger(result, state, expected);
}
void verifyStateFramebufferInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type)
{
QueriedState state;
queryFramebufferState(result, gl, type, target, pname, state);
if (!state.isUndefined())
verifyInteger(result, state, expected);
}
void verifyStateFramebufferIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int minValue, QueryType type)
{
QueriedState state;
queryFramebufferState(result, gl, type, target, pname, state);
if (!state.isUndefined())
verifyIntegerMin(result, state, minValue);
}
void verifyStateProgramInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint program, glw::GLenum pname, int expected, QueryType type)
{
QueriedState state;
queryProgramState(result, gl, type, program, pname, state);
if (!state.isUndefined())
verifyInteger(result, state, expected);
}
void verifyStateProgramIntegerVec3 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint program, glw::GLenum pname, const tcu::IVec3& expected, QueryType type)
{
QueriedState state;
queryProgramState(result, gl, type, program, pname, state);
if (!state.isUndefined())
verifyIntegerVec3(result, state, expected);
}
void verifyStatePipelineInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint pipeline, glw::GLenum pname, int expected, QueryType type)
{
QueriedState state;
queryPipelineState(result, gl, type, pipeline, pname, state);
if (!state.isUndefined())
verifyInteger(result, state, expected);
}
void verifyStateTextureParamInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type)
{
QueriedState state;
queryTextureParamState(result, gl, type, target, pname, state);
if (!state.isUndefined())
verifyInteger(result, state, expected);
}
} // StateQueryUtil
} // gls
} // deqp