/*------------------------------------------------------------------------- * 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 Texture State Query tests. *//*--------------------------------------------------------------------*/ #include "glsTextureStateQueryTests.hpp" #include "gluStrUtil.hpp" #include "gluObjectWrapper.hpp" #include "gluCallLogWrapper.hpp" #include "gluContextInfo.hpp" #include "gluTextureUtil.hpp" #include "glwEnums.hpp" #include "deUniquePtr.hpp" #include "deRandom.hpp" #include "deStringUtil.hpp" namespace deqp { namespace gls { namespace TextureStateQueryTests { namespace { using namespace glw; using namespace gls::StateQueryUtil; static glw::GLenum mapTesterToPname (TesterType tester) { #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT switch (tester) { CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R): return GL_TEXTURE_SWIZZLE_R; CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G): return GL_TEXTURE_SWIZZLE_G; CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B): return GL_TEXTURE_SWIZZLE_B; CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A): return GL_TEXTURE_SWIZZLE_A; CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S): case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_S; CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T): case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_T; CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R): case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: return GL_TEXTURE_WRAP_R; CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER): return GL_TEXTURE_MAG_FILTER; CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER): return GL_TEXTURE_MIN_FILTER; CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD): return GL_TEXTURE_MIN_LOD; CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD): return GL_TEXTURE_MAX_LOD; CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL): return GL_TEXTURE_BASE_LEVEL; CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL): return GL_TEXTURE_MAX_LEVEL; CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE): return GL_TEXTURE_COMPARE_MODE; CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): return GL_TEXTURE_COMPARE_FUNC; case TESTER_TEXTURE_IMMUTABLE_LEVELS: return GL_TEXTURE_IMMUTABLE_LEVELS; case TESTER_TEXTURE_IMMUTABLE_FORMAT: return GL_TEXTURE_IMMUTABLE_FORMAT; CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE): return GL_DEPTH_STENCIL_TEXTURE_MODE; CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): return GL_TEXTURE_SRGB_DECODE_EXT; case TESTER_TEXTURE_BORDER_COLOR: return GL_TEXTURE_BORDER_COLOR; default: DE_ASSERT(false); return -1; } #undef CASE_PURE_SETTERS } static bool querySupportsSigned (QueryType type) { return type != QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER && type != QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER; } static bool isPureIntTester (TesterType tester) { #define HANDLE_ALL_SETTERS(X) \ case X: \ case X ## _SET_PURE_UINT: return false; \ case X ## _SET_PURE_INT: return true; switch (tester) { HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A) HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S) HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T) HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD) HANDLE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL) HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE) HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC) HANDLE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT) case TESTER_TEXTURE_IMMUTABLE_LEVELS: case TESTER_TEXTURE_IMMUTABLE_FORMAT: case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: case TESTER_TEXTURE_BORDER_COLOR: return false; default: DE_ASSERT(false); return false; } #undef HANDLE_ALL_SETTERS } static bool isPureUintTester (TesterType tester) { #define HANDLE_ALL_SETTERS(X) \ case X: \ case X ## _SET_PURE_INT: return false; \ case X ## _SET_PURE_UINT: return true; switch (tester) { HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A) HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S) HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T) HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD) HANDLE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL) HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL) HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE) HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC) HANDLE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE) HANDLE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT) case TESTER_TEXTURE_IMMUTABLE_LEVELS: case TESTER_TEXTURE_IMMUTABLE_FORMAT: case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: case TESTER_TEXTURE_BORDER_COLOR: return false; default: DE_ASSERT(false); return false; } #undef HANDLE_ALL_SETTERS } class RequiredExtensions { public: RequiredExtensions (void) { } explicit RequiredExtensions (const char* ext) { add(ext); } RequiredExtensions (const char* extA, const char* extB) { add(extA); add(extB); } void add (const char* ext); void add (const RequiredExtensions& other); void check (const glu::ContextInfo&) const; private: std::vector m_extensions; }; void RequiredExtensions::add (const char* ext) { for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx) if (deStringEqual(m_extensions[ndx], ext) == DE_TRUE) return; m_extensions.push_back(ext); } void RequiredExtensions::add (const RequiredExtensions& other) { for (int ndx = 0; ndx < (int)other.m_extensions.size(); ++ndx) add(other.m_extensions[ndx]); } void RequiredExtensions::check (const glu::ContextInfo& ctxInfo) const { std::vector failedExtensions; for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx) if (!ctxInfo.isExtensionSupported(m_extensions[ndx])) failedExtensions.push_back(m_extensions[ndx]); if (!failedExtensions.empty()) { std::ostringstream buf; buf << "Test requires extension: "; for (int ndx = 0; ndx < (int)failedExtensions.size(); ++ndx) { if (ndx) buf << ", "; buf << failedExtensions[ndx]; } throw tcu::NotSupportedError(buf.str()); } } namespace es30 { static bool isCoreTextureTarget (glw::GLenum target) { return target == GL_TEXTURE_2D || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_CUBE_MAP; } static RequiredExtensions getTextureTargetExtension (glw::GLenum target) { DE_UNREF(target); DE_ASSERT(false); return RequiredExtensions(); } static bool isCoreTextureParam (glw::GLenum pname) { return pname == GL_TEXTURE_BASE_LEVEL || pname == GL_TEXTURE_COMPARE_MODE || pname == GL_TEXTURE_COMPARE_FUNC || pname == GL_TEXTURE_MAG_FILTER || pname == GL_TEXTURE_MAX_LEVEL || pname == GL_TEXTURE_MAX_LOD || pname == GL_TEXTURE_MIN_FILTER || pname == GL_TEXTURE_MIN_LOD || pname == GL_TEXTURE_SWIZZLE_R || pname == GL_TEXTURE_SWIZZLE_G || pname == GL_TEXTURE_SWIZZLE_B || pname == GL_TEXTURE_SWIZZLE_A || pname == GL_TEXTURE_WRAP_S || pname == GL_TEXTURE_WRAP_T || pname == GL_TEXTURE_WRAP_R || pname == GL_TEXTURE_IMMUTABLE_FORMAT || pname == GL_TEXTURE_IMMUTABLE_LEVELS; } static RequiredExtensions getTextureParamExtension (glw::GLenum pname) { DE_UNREF(pname); DE_ASSERT(false); return RequiredExtensions(); } static bool isCoreQuery (QueryType query) { return query == QUERY_TEXTURE_PARAM_INTEGER || query == QUERY_TEXTURE_PARAM_FLOAT || query == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || query == QUERY_TEXTURE_PARAM_FLOAT_VEC4 || query == QUERY_SAMPLER_PARAM_INTEGER || query == QUERY_SAMPLER_PARAM_FLOAT || query == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || query == QUERY_SAMPLER_PARAM_FLOAT_VEC4; } static RequiredExtensions getQueryExtension (QueryType query) { DE_UNREF(query); DE_ASSERT(false); return RequiredExtensions(); } static bool isCoreTester (TesterType tester) { return tester == TESTER_TEXTURE_SWIZZLE_R || tester == TESTER_TEXTURE_SWIZZLE_G || tester == TESTER_TEXTURE_SWIZZLE_B || tester == TESTER_TEXTURE_SWIZZLE_A || tester == TESTER_TEXTURE_WRAP_S || tester == TESTER_TEXTURE_WRAP_T || tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_MAG_FILTER || tester == TESTER_TEXTURE_MIN_FILTER || tester == TESTER_TEXTURE_MIN_LOD || tester == TESTER_TEXTURE_MAX_LOD || tester == TESTER_TEXTURE_BASE_LEVEL || tester == TESTER_TEXTURE_MAX_LEVEL || tester == TESTER_TEXTURE_COMPARE_MODE || tester == TESTER_TEXTURE_COMPARE_FUNC || tester == TESTER_TEXTURE_IMMUTABLE_LEVELS || tester == TESTER_TEXTURE_IMMUTABLE_FORMAT; } static RequiredExtensions getTesterExtension (TesterType tester) { DE_UNREF(tester); DE_ASSERT(false); return RequiredExtensions(); } } // es30 namespace es31 { static bool isCoreTextureTarget (glw::GLenum target) { return es30::isCoreTextureTarget(target) || target == GL_TEXTURE_2D_MULTISAMPLE; } static RequiredExtensions getTextureTargetExtension (glw::GLenum target) { switch (target) { case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: return RequiredExtensions("GL_OES_texture_storage_multisample_2d_array"); case GL_TEXTURE_BUFFER: return RequiredExtensions("GL_EXT_texture_buffer"); case GL_TEXTURE_CUBE_MAP_ARRAY: return RequiredExtensions("GL_EXT_texture_cube_map_array"); default: DE_ASSERT(false); return RequiredExtensions(); } } static bool isCoreTextureParam (glw::GLenum pname) { return es30::isCoreTextureParam(pname) || pname == GL_DEPTH_STENCIL_TEXTURE_MODE; } static RequiredExtensions getTextureParamExtension (glw::GLenum pname) { switch (pname) { case GL_TEXTURE_SRGB_DECODE_EXT: return RequiredExtensions("GL_EXT_texture_sRGB_decode"); case GL_TEXTURE_BORDER_COLOR: return RequiredExtensions("GL_EXT_texture_border_clamp"); default: DE_ASSERT(false); return RequiredExtensions(); } } static bool isCoreQuery (QueryType query) { return es30::isCoreQuery(query); } static RequiredExtensions getQueryExtension (QueryType query) { switch (query) { case QUERY_TEXTURE_PARAM_PURE_INTEGER: case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER: case QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4: case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4: case QUERY_SAMPLER_PARAM_PURE_INTEGER: case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER: case QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4: case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4: return RequiredExtensions("GL_EXT_texture_border_clamp"); default: DE_ASSERT(false); return RequiredExtensions(); } } static bool isCoreTester (TesterType tester) { return es30::isCoreTester(tester) || tester == TESTER_DEPTH_STENCIL_TEXTURE_MODE; } static RequiredExtensions getTesterExtension (TesterType tester) { #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT switch (tester) { CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_R): CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_G): CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_B): CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_A): CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_S): CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_T): CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_R): CASE_PURE_SETTERS(TESTER_TEXTURE_MAG_FILTER): CASE_PURE_SETTERS(TESTER_TEXTURE_MIN_FILTER): CASE_PURE_SETTERS(TESTER_TEXTURE_MIN_LOD): CASE_PURE_SETTERS(TESTER_TEXTURE_MAX_LOD): CASE_PURE_SETTERS(TESTER_TEXTURE_BASE_LEVEL): CASE_PURE_SETTERS(TESTER_TEXTURE_MAX_LEVEL): CASE_PURE_SETTERS(TESTER_TEXTURE_COMPARE_MODE): CASE_PURE_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): CASE_PURE_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE): case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: case TESTER_TEXTURE_BORDER_COLOR: return RequiredExtensions("GL_EXT_texture_border_clamp"); case TESTER_TEXTURE_SRGB_DECODE_EXT: return RequiredExtensions("GL_EXT_texture_sRGB_decode"); CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): return RequiredExtensions("GL_EXT_texture_sRGB_decode", "GL_EXT_texture_border_clamp"); default: DE_ASSERT(false); return RequiredExtensions(); } #undef CASE_PURE_SETTERS } } // es31 namespace es32 { static bool isCoreTextureTarget (glw::GLenum target) { return es31::isCoreTextureTarget(target) || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY || target == GL_TEXTURE_BUFFER || target == GL_TEXTURE_CUBE_MAP_ARRAY; } static RequiredExtensions getTextureTargetExtension (glw::GLenum target) { DE_UNREF(target); DE_ASSERT(false); return RequiredExtensions(); } static bool isCoreTextureParam (glw::GLenum pname) { return es31::isCoreTextureParam(pname) || pname == GL_TEXTURE_BORDER_COLOR; } static RequiredExtensions getTextureParamExtension (glw::GLenum pname) { switch (pname) { case GL_TEXTURE_SRGB_DECODE_EXT: return RequiredExtensions("GL_EXT_texture_sRGB_decode"); default: DE_ASSERT(false); return RequiredExtensions(); } } static bool isCoreQuery (QueryType query) { return es31::isCoreQuery(query) || query == QUERY_TEXTURE_PARAM_PURE_INTEGER || query == QUERY_TEXTURE_PARAM_PURE_INTEGER || query == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER || query == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4 || query == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4 || query == QUERY_SAMPLER_PARAM_PURE_INTEGER || query == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER || query == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4 || query == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4; } static RequiredExtensions getQueryExtension (QueryType query) { DE_UNREF(query); DE_ASSERT(false); return RequiredExtensions(); } static bool isCoreTester (TesterType tester) { #define COMPARE_PURE_SETTERS(TESTER, X) (TESTER == X ## _SET_PURE_INT) || (TESTER == X ## _SET_PURE_UINT) return es31::isCoreTester(tester) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_R) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_G) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_B) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_A) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_S) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_T) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_R) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAG_FILTER) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MIN_FILTER) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MIN_LOD) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAX_LOD) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_BASE_LEVEL) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAX_LEVEL) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_COMPARE_MODE) || COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_COMPARE_FUNC) || COMPARE_PURE_SETTERS(tester, TESTER_DEPTH_STENCIL_TEXTURE_MODE) || tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER || tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER || tester == TESTER_TEXTURE_BORDER_COLOR; #undef COMPARE_PURE_SETTERS } static RequiredExtensions getTesterExtension (TesterType tester) { #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT switch (tester) { CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): case TESTER_TEXTURE_SRGB_DECODE_EXT: return RequiredExtensions("GL_EXT_texture_sRGB_decode"); default: DE_ASSERT(false); return RequiredExtensions(); } #undef CASE_PURE_SETTERS } } // es32 static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target) { if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::isCoreTextureTarget(target); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::isCoreTextureTarget(target); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::isCoreTextureTarget(target); else { DE_ASSERT(false); return DE_NULL; } } static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname) { if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::isCoreTextureParam(pname); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::isCoreTextureParam(pname); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::isCoreTextureParam(pname); else { DE_ASSERT(false); return DE_NULL; } } static bool isCoreQuery (const glu::ContextType& contextType, QueryType query) { if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::isCoreQuery(query); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::isCoreQuery(query); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::isCoreQuery(query); else { DE_ASSERT(false); return DE_NULL; } } static bool isCoreTester (const glu::ContextType& contextType, TesterType tester) { if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::isCoreTester(tester); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::isCoreTester(tester); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::isCoreTester(tester); else { DE_ASSERT(false); return DE_NULL; } } static RequiredExtensions getTextureTargetExtension (const glu::ContextType& contextType, glw::GLenum target) { DE_ASSERT(!isCoreTextureTarget(contextType, target)); if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::getTextureTargetExtension(target); if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::getTextureTargetExtension(target); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::getTextureTargetExtension(target); else { DE_ASSERT(false); return RequiredExtensions(); } } static RequiredExtensions getTextureParamExtension (const glu::ContextType& contextType, glw::GLenum pname) { DE_ASSERT(!isCoreTextureParam(contextType, pname)); if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::getTextureParamExtension(pname); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::getTextureParamExtension(pname); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::getTextureParamExtension(pname); else { DE_ASSERT(false); return RequiredExtensions(); } } static RequiredExtensions getQueryExtension (const glu::ContextType& contextType, QueryType query) { DE_ASSERT(!isCoreQuery(contextType, query)); if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::getQueryExtension(query); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::getQueryExtension(query); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::getQueryExtension(query); else { DE_ASSERT(false); return RequiredExtensions(); } } static RequiredExtensions getTesterExtension (const glu::ContextType& contextType, TesterType tester) { DE_ASSERT(!isCoreTester(contextType, tester)); if (contextSupports(contextType, glu::ApiType::es(3,2))) return es32::getTesterExtension(tester); else if (contextSupports(contextType, glu::ApiType::es(3,1))) return es31::getTesterExtension(tester); else if (contextSupports(contextType, glu::ApiType::es(3,0))) return es30::getTesterExtension(tester); else { DE_ASSERT(false); return RequiredExtensions(); } } class TextureTest : public tcu::TestCase { public: TextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void init (void); IterateResult iterate (void); virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0; protected: const glu::RenderContext& m_renderCtx; const glw::GLenum m_target; const glw::GLenum m_pname; const TesterType m_tester; const QueryType m_type; }; TextureTest::TextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TestCase (testCtx, name, desc) , m_renderCtx (renderCtx) , m_target (target) , m_pname (mapTesterToPname(tester)) , m_tester (tester) , m_type (type) { } void TextureTest::init (void) { const de::UniquePtr ctxInfo (glu::ContextInfo::create(m_renderCtx)); RequiredExtensions extensions; // target if (!isCoreTextureTarget(m_renderCtx.getType(), m_target)) extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target)); // param if (!isCoreTextureParam(m_renderCtx.getType(), m_pname)) extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname)); // query if (!isCoreQuery(m_renderCtx.getType(), m_type)) extensions.add(getQueryExtension(m_renderCtx.getType(), m_type)); // test type if (!isCoreTester(m_renderCtx.getType(), m_tester)) extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester)); extensions.check(*ctxInfo); } TextureTest::IterateResult TextureTest::iterate (void) { glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog()); tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); gl.enableLogging(true); test(gl, result); result.setTestContextResult(m_testCtx); return STOP; } class IsTextureCase : public tcu::TestCase { public: IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target); void init (void); IterateResult iterate (void); protected: const glu::RenderContext& m_renderCtx; const glw::GLenum m_target; }; IsTextureCase::IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target) : tcu::TestCase (testCtx, name, desc) , m_renderCtx (renderCtx) , m_target (target) { } void IsTextureCase::init (void) { const de::UniquePtr ctxInfo (glu::ContextInfo::create(m_renderCtx)); RequiredExtensions extensions; // target if (!isCoreTextureTarget(m_renderCtx.getType(), m_target)) extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target)); extensions.check(*ctxInfo); } IsTextureCase::IterateResult IsTextureCase::iterate (void) { glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog()); tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); glw::GLuint textureId = 0; gl.enableLogging(true); gl.glGenTextures(1, &textureId); gl.glBindTexture(m_target, textureId); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); verifyStateObjectBoolean(result, gl, textureId, true, QUERY_ISTEXTURE); gl.glDeleteTextures(1, &textureId); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); verifyStateObjectBoolean(result, gl, textureId, false, QUERY_ISTEXTURE); result.setTestContextResult(m_testCtx); return STOP; } class DepthStencilModeCase : public TextureTest { public: DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; DepthStencilModeCase::DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void DepthStencilModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); glu::Texture texture (m_renderCtx); gl.glBindTexture(m_target, *texture); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind"); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type); } if (!isPureCase) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle"); const glw::GLint depthComponentInt = GL_DEPTH_COMPONENT; const glw::GLfloat depthComponentFloat = (glw::GLfloat)GL_DEPTH_COMPONENT; gl.glTexParameteri(m_target, m_pname, GL_STENCIL_INDEX); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type); gl.glTexParameteriv(m_target, m_pname, &depthComponentInt); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type); gl.glTexParameterf(m_target, m_pname, GL_STENCIL_INDEX); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type); gl.glTexParameterfv(m_target, m_pname, &depthComponentFloat); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type); } if (isPureIntTester(m_tester)) { const glw::GLint depthComponent = GL_DEPTH_COMPONENT; const glw::GLint stencilIndex = GL_STENCIL_INDEX; gl.glTexParameterIiv(m_target, m_pname, &stencilIndex); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type); gl.glTexParameterIiv(m_target, m_pname, &depthComponent); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type); } if (isPureUintTester(m_tester)) { const glw::GLuint depthComponent = GL_DEPTH_COMPONENT; const glw::GLuint stencilIndex = GL_STENCIL_INDEX; gl.glTexParameterIuiv(m_target, m_pname, &stencilIndex); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type); gl.glTexParameterIuiv(m_target, m_pname, &depthComponent); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type); } } class TextureSRGBDecodeCase : public TextureTest { public: TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureSRGBDecodeCase::TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); glu::Texture texture (m_renderCtx); gl.glBindTexture(m_target, *texture); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind"); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } if (!isPureCase) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle"); const glw::GLint decodeInt = GL_DECODE_EXT; const glw::GLfloat decodeFloat = (glw::GLfloat)GL_DECODE_EXT; gl.glTexParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glTexParameteriv(m_target, m_pname, &decodeInt); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); gl.glTexParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glTexParameterfv(m_target, m_pname, &decodeFloat); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } if (isPureIntTester(m_tester)) { const glw::GLint skipDecode = GL_SKIP_DECODE_EXT; const glw::GLint decode = GL_DECODE_EXT; gl.glTexParameterIiv(m_target, m_pname, &skipDecode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glTexParameterIiv(m_target, m_pname, &decode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } if (isPureUintTester(m_tester)) { const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT; const glw::GLuint decode = GL_DECODE_EXT; gl.glTexParameterIuiv(m_target, m_pname, &skipDecode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glTexParameterIuiv(m_target, m_pname, &decode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } } class TextureSwizzleCase : public TextureTest { public: TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureSwizzleCase::TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureSwizzleCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); const int initialValue = (m_pname == GL_TEXTURE_SWIZZLE_R) ? (GL_RED) : (m_pname == GL_TEXTURE_SWIZZLE_G) ? (GL_GREEN) : (m_pname == GL_TEXTURE_SWIZZLE_B) ? (GL_BLUE) : (m_pname == GL_TEXTURE_SWIZZLE_A) ? (GL_ALPHA) : (-1); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum swizzleValues[] = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_ZERO, GL_ONE}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)swizzleValues[ndx]; gl.glTexParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = swizzleValues[ndx]; gl.glTexParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); } verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx) { gl.glTexParameteri(m_target, m_pname, swizzleValues[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx) { gl.glTexParameterf(m_target, m_pname, (GLfloat)swizzleValues[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type); } } } } class TextureWrapCase : public TextureTest { public: TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureWrapCase::TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)wrapValues[ndx]; gl.glTexParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = wrapValues[ndx]; gl.glTexParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); } verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) { gl.glTexParameteri(m_target, m_pname, wrapValues[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) { gl.glTexParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); } } } } class TextureFilterCase : public TextureTest { public: TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureFilterCase::TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); const glw::GLenum initial = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR) : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR) : (0); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, initial, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); std::vector values; values.push_back(GL_NEAREST); values.push_back(GL_LINEAR); if (m_pname == GL_TEXTURE_MIN_FILTER) { values.push_back(GL_NEAREST_MIPMAP_NEAREST); values.push_back(GL_NEAREST_MIPMAP_LINEAR); values.push_back(GL_LINEAR_MIPMAP_NEAREST); values.push_back(GL_LINEAR_MIPMAP_LINEAR); } if (isPureCase) { for (int ndx = 0; ndx < (int)values.size(); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)values[ndx]; gl.glTexParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = values[ndx]; gl.glTexParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); } verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); } } else { for (int ndx = 0; ndx < (int)values.size(); ++ndx) { gl.glTexParameteri(m_target, m_pname, values[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < (int)values.size(); ++ndx) { gl.glTexParameterf(m_target, m_pname, (GLfloat)values[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); } } } } class TextureLODCase : public TextureTest { public: TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureLODCase::TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); const int initialValue = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000) : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000) : (-1); if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const int numIterations = 20; de::Random rnd (0xabcdef); if (isPureCase) { if (isPureIntTester(m_tester)) { for (int ndx = 0; ndx < numIterations; ++ndx) { const GLint ref = rnd.getInt(-1000, 1000); gl.glTexParameterIiv(m_target, m_pname, &ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); } } else { DE_ASSERT(isPureUintTester(m_tester)); for (int ndx = 0; ndx < numIterations; ++ndx) { const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000); gl.glTexParameterIuiv(m_target, m_pname, &ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); } } } else { const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0); for (int ndx = 0; ndx < numIterations; ++ndx) { const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f); gl.glTexParameterf(m_target, m_pname, ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamFloat(result, gl, m_target, m_pname, ref, m_type); } // check unit conversions with int for (int ndx = 0; ndx < numIterations; ++ndx) { const GLint ref = rnd.getInt(minLimit, 1000); gl.glTexParameteri(m_target, m_pname, ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); } } } } class TextureLevelCase : public TextureTest { public: TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureLevelCase::TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureLevelCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); const int initialValue = (m_pname == GL_TEXTURE_BASE_LEVEL) ? (0) : (m_pname == GL_TEXTURE_MAX_LEVEL) ? (1000) : (-1); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type); } if (m_target == GL_TEXTURE_2D_MULTISAMPLE || m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) { // only 0 allowed { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set"); gl.glTexParameteri(m_target, m_pname, 0); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); gl.glTexParameterf(m_target, m_pname, 0.0f); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); } } else { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const int numIterations = 20; de::Random rnd (0xabcdef); if (isPureCase) { for (int ndx = 0; ndx < numIterations; ++ndx) { const GLint ref = rnd.getInt(0, 64000); const GLuint uRef = (glw::GLuint)ref; if (isPureIntTester(m_tester)) { gl.glTexParameterIiv(m_target, m_pname, &ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); gl.glTexParameterIuiv(m_target, m_pname, &uRef); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); } verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type); } } else { for (int ndx = 0; ndx < numIterations; ++ndx) { const GLint ref = rnd.getInt(0, 64000); gl.glTexParameteri(m_target, m_pname, ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type); } // check unit conversions with float const float nonSignificantOffsets[] = {-0.45f, -0.25f, 0, 0.45f}; // offsets O so that for any integers z in Z, o in O roundToClosestInt(z+o)==z const int numConversionIterations = 30; for (int ndx = 0; ndx < numConversionIterations; ++ndx) { const GLint ref = rnd.getInt(1, 64000); for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(nonSignificantOffsets); ++offsetNdx) { gl.glTexParameterf(m_target, m_pname, ((GLfloat)ref) + nonSignificantOffsets[offsetNdx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type); } } } } } class TextureCompareModeCase : public TextureTest { public: TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureCompareModeCase::TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)modes[ndx]; gl.glTexParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = modes[ndx]; gl.glTexParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); } verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) { gl.glTexParameteri(m_target, m_pname, modes[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) { gl.glTexParameterf(m_target, m_pname, (GLfloat)modes[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); } } } } class TextureCompareFuncCase : public TextureTest { public: TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureCompareFuncCase::TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum compareFuncs[] = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)compareFuncs[ndx]; gl.glTexParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = compareFuncs[ndx]; gl.glTexParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); } verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) { gl.glTexParameteri(m_target, m_pname, compareFuncs[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) { gl.glTexParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); } } } } class TextureImmutableLevelsCase : public TextureTest { public: TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureImmutableLevelsCase::TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_LEVELS, type) { } void TextureImmutableLevelsCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); } if (m_target == GL_TEXTURE_2D_MULTISAMPLE || m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) { // no levels const tcu::ScopedLogSection section (m_testCtx.getLog(), "Level", "Level"); GLuint textureID = 0; gl.glGenTextures(1, &textureID); gl.glBindTexture(m_target, textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); if (m_target == GL_TEXTURE_2D_MULTISAMPLE) gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE); else if (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE); else DE_ASSERT(false); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type); gl.glDeleteTextures(1, &textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); } else { for (int level = 1; level <= 7; ++level) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Levels", "Levels = " + de::toString(level)); GLuint textureID = 0; gl.glGenTextures(1, &textureID); gl.glBindTexture(m_target, textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); if (m_target == GL_TEXTURE_2D || m_target == GL_TEXTURE_CUBE_MAP) gl.glTexStorage2D(m_target, level, GL_RGB8, 64, 64); else if (m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D) gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 64); else if (m_target == GL_TEXTURE_CUBE_MAP_ARRAY) gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 6 * 2); else DE_ASSERT(false); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, level, m_type); gl.glDeleteTextures(1, &textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); } } } class TextureImmutableFormatCase : public TextureTest { public: TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureImmutableFormatCase::TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_FORMAT, type) { } void TextureImmutableFormatCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); } { const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Immutable", "Immutable"); GLuint textureID = 0; gl.glGenTextures(1, &textureID); gl.glBindTexture(m_target, textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); switch (m_target) { case GL_TEXTURE_2D: case GL_TEXTURE_CUBE_MAP: { gl.glTexStorage2D(m_target, 1, GL_RGBA8, 32, 32); break; } case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_3D: { gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 8); break; } case GL_TEXTURE_2D_MULTISAMPLE: { gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE); break; } case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: { gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE); break; } case GL_TEXTURE_CUBE_MAP_ARRAY: { gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 6 * 2); break; } default: DE_ASSERT(false); } GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type); gl.glDeleteTextures(1, &textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); } // no mutable if (m_target == GL_TEXTURE_2D_MULTISAMPLE || m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) return; // test mutable { const tcu::ScopedLogSection subsection (m_testCtx.getLog(), "Mutable", "Mutable"); GLuint textureID = 0; gl.glGenTextures(1, &textureID); gl.glBindTexture(m_target, textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture"); switch (m_target) { case GL_TEXTURE_2D: { gl.glTexImage2D(m_target, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); break; } case GL_TEXTURE_CUBE_MAP: { gl.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); break; } case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_3D: { gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); break; } case GL_TEXTURE_CUBE_MAP_ARRAY: { gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 6 * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL); break; } default: DE_ASSERT(false); } GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type); gl.glDeleteTextures(1, &textureID); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures"); } } class TextureWrapClampToBorderCase : public TextureTest { public: TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureWrapClampToBorderCase::TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, tester, type) { } void TextureWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { gl.glTexParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type); gl.glTexParameteri(m_target, m_pname, GL_REPEAT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri"); gl.glTexParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf"); verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type); } class TextureBorderColorCase : public TextureTest { public: TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; TextureBorderColorCase::TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type) : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_BORDER_COLOR, type) { } void TextureBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { // border color is undefined if queried with pure type and was not set to pure value if (m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type); } if (m_type == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128); gl.glTexParameterIiv(m_target, m_pname, color.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv"); verifyStateTextureParamIntegerVec4(result, gl, m_target, m_pname, color, m_type); } else if (m_type == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const tcu::UVec4 color (0x8000000ul, 2, 3, 128); gl.glTexParameterIuiv(m_target, m_pname, color.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv"); verifyStateTextureParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type); } else { DE_ASSERT(m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4); const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const tcu::Vec4 color (0.25f, 1.0f, 0.0f, 0.77f); const tcu::IVec4 icolor (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF); gl.glTexParameterfv(m_target, m_pname, color.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterfv"); verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, color, m_type); gl.glTexParameteriv(m_target, m_pname, icolor.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteriv"); verifyStateTextureParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type); } } class SamplerTest : public tcu::TestCase { public: SamplerTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type); void init (void); IterateResult iterate (void); virtual void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0; protected: const glu::RenderContext& m_renderCtx; const glw::GLenum m_pname; const TesterType m_tester; const QueryType m_type; glw::GLuint m_target; }; SamplerTest::SamplerTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : TestCase (testCtx, name, desc) , m_renderCtx (renderCtx) , m_pname (mapTesterToPname(tester)) , m_tester (tester) , m_type (type) , m_target (0) { } void SamplerTest::init (void) { const de::UniquePtr ctxInfo (glu::ContextInfo::create(m_renderCtx)); RequiredExtensions extensions; // param if (!isCoreTextureParam(m_renderCtx.getType(), m_pname)) extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname)); // query if (!isCoreQuery(m_renderCtx.getType(), m_type)) extensions.add(getQueryExtension(m_renderCtx.getType(), m_type)); // test type if (!isCoreTester(m_renderCtx.getType(), m_tester)) extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester)); extensions.check(*ctxInfo); } SamplerTest::IterateResult SamplerTest::iterate (void) { glu::CallLogWrapper gl (m_renderCtx.getFunctions(), m_testCtx.getLog()); tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); glu::Sampler sampler (m_renderCtx); gl.enableLogging(true); m_target = *sampler; test(gl, result); m_target = 0; result.setTestContextResult(m_testCtx); return STOP; } class SamplerWrapCase : public SamplerTest { public: SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerWrapCase::SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)wrapValues[ndx]; gl.glSamplerParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = wrapValues[ndx]; gl.glSamplerParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); } verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) { gl.glSamplerParameteri(m_target, m_pname, wrapValues[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx) { gl.glSamplerParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type); } } } } class SamplerFilterCase : public SamplerTest { public: SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerFilterCase::SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); const glw::GLenum initial = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR) : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR) : (0); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initial, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); std::vector values; values.push_back(GL_NEAREST); values.push_back(GL_LINEAR); if (m_pname == GL_TEXTURE_MIN_FILTER) { values.push_back(GL_NEAREST_MIPMAP_NEAREST); values.push_back(GL_NEAREST_MIPMAP_LINEAR); values.push_back(GL_LINEAR_MIPMAP_NEAREST); values.push_back(GL_LINEAR_MIPMAP_LINEAR); } if (isPureCase) { for (int ndx = 0; ndx < (int)values.size(); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)values[ndx]; gl.glSamplerParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = values[ndx]; gl.glSamplerParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); } verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); } } else { for (int ndx = 0; ndx < (int)values.size(); ++ndx) { gl.glSamplerParameteri(m_target, m_pname, values[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < (int)values.size(); ++ndx) { gl.glSamplerParameterf(m_target, m_pname, (GLfloat)values[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type); } } } } class SamplerLODCase : public SamplerTest { public: SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerLODCase::SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); const int initialValue = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000) : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000) : (-1); if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initialValue, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const int numIterations = 20; de::Random rnd (0xabcdef); if (isPureCase) { if (isPureIntTester(m_tester)) { for (int ndx = 0; ndx < numIterations; ++ndx) { const GLint ref = rnd.getInt(-1000, 1000); gl.glSamplerParameterIiv(m_target, m_pname, &ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); } } else { DE_ASSERT(isPureUintTester(m_tester)); for (int ndx = 0; ndx < numIterations; ++ndx) { const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000); gl.glSamplerParameterIuiv(m_target, m_pname, &ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); } } } else { const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0); for (int ndx = 0; ndx < numIterations; ++ndx) { const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f); gl.glSamplerParameterf(m_target, m_pname, ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); verifyStateSamplerParamFloat(result, gl, m_target, m_pname, ref, m_type); } // check unit conversions with int for (int ndx = 0; ndx < numIterations; ++ndx) { const GLint ref = rnd.getInt(minLimit, 1000); gl.glSamplerParameteri(m_target, m_pname, ref); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type); } } } } class SamplerCompareModeCase : public SamplerTest { public: SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerCompareModeCase::SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum modes[] = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)modes[ndx]; gl.glSamplerParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = modes[ndx]; gl.glSamplerParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); } verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) { gl.glSamplerParameteri(m_target, m_pname, modes[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx) { gl.glSamplerParameterf(m_target, m_pname, (GLfloat)modes[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type); } } } } class SamplerCompareFuncCase : public SamplerTest { public: SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerCompareFuncCase::SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const GLenum compareFuncs[] = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER}; if (isPureCase) { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) { if (isPureIntTester(m_tester)) { const glw::GLint value = (glw::GLint)compareFuncs[ndx]; gl.glSamplerParameterIiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); } else { DE_ASSERT(isPureUintTester(m_tester)); const glw::GLuint value = compareFuncs[ndx]; gl.glSamplerParameterIuiv(m_target, m_pname, &value); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); } verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); } } else { for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) { gl.glSamplerParameteri(m_target, m_pname, compareFuncs[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); } //check unit conversions with float for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx) { gl.glSamplerParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type); } } } } class SamplerWrapClampToBorderCase : public SamplerTest { public: SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerWrapClampToBorderCase::SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { gl.glSamplerParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type); gl.glSamplerParameteri(m_target, m_pname, GL_REPEAT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri"); gl.glSamplerParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type); } class SamplerSRGBDecodeCase : public SamplerTest { public: SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerSRGBDecodeCase::SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, tester, type) { } void SamplerSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester); if (!isPureCase) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Toggle", "Toggle"); const glw::GLint decodeInt = GL_DECODE_EXT; const glw::GLfloat decodeFloat = (glw::GLfloat)GL_DECODE_EXT; gl.glSamplerParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glSamplerParameteriv(m_target, m_pname, &decodeInt); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); gl.glSamplerParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glSamplerParameterfv(m_target, m_pname, &decodeFloat); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } if (isPureIntTester(m_tester)) { const glw::GLint skipDecode = GL_SKIP_DECODE_EXT; const glw::GLint decode = GL_DECODE_EXT; gl.glSamplerParameterIiv(m_target, m_pname, &skipDecode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glSamplerParameterIiv(m_target, m_pname, &decode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } if (isPureUintTester(m_tester)) { const glw::GLuint skipDecode = GL_SKIP_DECODE_EXT; const glw::GLuint decode = GL_DECODE_EXT; gl.glSamplerParameterIuiv(m_target, m_pname, &skipDecode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type); gl.glSamplerParameterIuiv(m_target, m_pname, &decode); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type); } } class SamplerBorderColorCase : public SamplerTest { public: SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, QueryType type); void test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const; }; SamplerBorderColorCase::SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, QueryType type) : SamplerTest(testCtx, renderCtx, name, desc, TESTER_TEXTURE_BORDER_COLOR, type) { DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4 || m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4); } void SamplerBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const { // border color is undefined if queried with pure type and was not set to pure value if (m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4) { const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type); } if (m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const tcu::IVec4 color (0x7FFFFFFF, -2, 3, -128); gl.glSamplerParameterIiv(m_target, m_pname, color.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv"); verifyStateSamplerParamIntegerVec4(result, gl, m_target, m_pname, color, m_type); } else if (m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4) { const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const tcu::UVec4 color (0x8000000ul, 2, 3, 128); gl.glSamplerParameterIuiv(m_target, m_pname, color.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv"); verifyStateSamplerParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type); } else { DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4); const tcu::ScopedLogSection section (m_testCtx.getLog(), "Set", "Set"); const tcu::Vec4 color (0.25f, 1.0f, 0.0f, 0.77f); const tcu::IVec4 icolor (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF); gl.glSamplerParameterfv(m_target, m_pname, color.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterfv"); verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, color, m_type); gl.glSamplerParameteriv(m_target, m_pname, icolor.getPtr()); GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteriv"); verifyStateSamplerParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type); } } } // anonymous bool isLegalTesterForTarget (glw::GLenum target, TesterType tester) { // no 3d filtering on 2d targets if ((tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER) && target != GL_TEXTURE_3D) return false; // no sampling on multisample if (isMultisampleTarget(target) && isSamplerStateTester(tester)) return false; // no states in buffer if (target == GL_TEXTURE_BUFFER) return false; return true; } bool isMultisampleTarget (glw::GLenum target) { return target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY; } bool isSamplerStateTester (TesterType tester) { return tester == TESTER_TEXTURE_WRAP_S || tester == TESTER_TEXTURE_WRAP_T || tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_MAG_FILTER || tester == TESTER_TEXTURE_MIN_FILTER || tester == TESTER_TEXTURE_MIN_LOD || tester == TESTER_TEXTURE_MAX_LOD || tester == TESTER_TEXTURE_COMPARE_MODE || tester == TESTER_TEXTURE_COMPARE_FUNC || tester == TESTER_TEXTURE_SRGB_DECODE_EXT || tester == TESTER_TEXTURE_BORDER_COLOR || tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER || tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER; } tcu::TestCase* createIsTextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, glw::GLenum target) { return new IsTextureCase(testCtx, renderCtx, name.c_str(), description.c_str(), target); } tcu::TestCase* createTexParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, QueryType queryType, glw::GLenum target, TesterType tester) { if (isMultisampleTarget(target) && isSamplerStateTester(tester)) { DE_FATAL("Multisample textures have no sampler state"); return DE_NULL; } if (target == GL_TEXTURE_BUFFER) { DE_FATAL("Buffer textures have no texture state"); return DE_NULL; } if (target != GL_TEXTURE_3D && mapTesterToPname(tester) == GL_TEXTURE_WRAP_R) { DE_FATAL("Only 3D textures have wrap r filter"); return DE_NULL; } #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT switch (tester) { CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R): CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G): CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B): CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A): return new TextureSwizzleCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S): CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T): CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R): return new TextureWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER): CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER): return new TextureFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD): CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD): return new TextureLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL): CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL): return new TextureLevelCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE): return new TextureCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): return new TextureCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); case TESTER_TEXTURE_IMMUTABLE_LEVELS: return new TextureImmutableLevelsCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType); case TESTER_TEXTURE_IMMUTABLE_FORMAT: return new TextureImmutableFormatCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType); case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: return new TextureWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE): return new DepthStencilModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): return new TextureSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType); case TESTER_TEXTURE_BORDER_COLOR: return new TextureBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType); default: break; } #undef CASE_ALL_SETTERS DE_ASSERT(false); return DE_NULL; } tcu::TestCase* createSamplerParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, StateQueryUtil::QueryType queryType, TesterType tester) { #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT switch (tester) { CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S): CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T): CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R): return new SamplerWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER): CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER): return new SamplerFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD): CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD): return new SamplerLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE): return new SamplerCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC): return new SamplerCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER: case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER: return new SamplerWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT): return new SamplerSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType); case TESTER_TEXTURE_BORDER_COLOR: return new SamplerBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), queryType); default: break; } #undef CASE_ALL_SETTERS DE_ASSERT(false); return DE_NULL; } } // TextureStateQueryTests } // gls } // deqp