/*------------------------------------------------------------------------- * 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) == 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(); } } // namespace 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 } } // namespace 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_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 } } // namespace es32 namespace gl45 { static bool isCoreTextureTarget(glw::GLenum target) { return es31::isCoreTextureTarget(target); } static RequiredExtensions getTextureTargetExtension(glw::GLenum target) { DE_UNREF(target); return RequiredExtensions(); } static bool isCoreTextureParam(glw::GLenum pname) { return es31::isCoreTextureParam(pname); } static RequiredExtensions getTextureParamExtension(glw::GLenum pname) { DE_UNREF(pname); return RequiredExtensions(); } static bool isCoreQuery(QueryType query) { return es31::isCoreQuery(query); } static RequiredExtensions getQueryExtension(QueryType query) { DE_UNREF(query); return RequiredExtensions(); } static bool isCoreTester(TesterType tester) { return es31::isCoreTester(tester); } static RequiredExtensions getTesterExtension(TesterType tester) { DE_UNREF(tester); return RequiredExtensions(); } } // namespace gl45 static bool isCoreTextureTarget(const glu::ContextType &contextType, glw::GLenum target) { if (contextSupports(contextType, glu::ApiType::core(4, 5))) return gl45::isCoreTextureTarget(target); else 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::core(4, 5))) return gl45::isCoreTextureParam(pname); else 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::core(4, 5))) return gl45::isCoreQuery(query); else 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::core(4, 5))) return gl45::isCoreTester(tester); else 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::core(4, 5))) return gl45::getTextureTargetExtension(target); else if (contextSupports(contextType, glu::ApiType::es(3, 2))) return es32::getTextureTargetExtension(target); else 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::core(4, 5))) return gl45::getTextureParamExtension(pname); else 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::core(4, 5))) return gl45::getQueryExtension(query); else 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::core(4, 5))) return gl45::getTesterExtension(tester); else 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); 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); } } } // namespace 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; } } // namespace TextureStateQueryTests } // namespace gls } // namespace deqp