| /*------------------------------------------------------------------------- |
| * 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<const char*> 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<const char*> 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_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 |
| |
| 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(); |
| } |
| |
| } // 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<glu::ContextInfo> 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<glu::ContextInfo> 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<GLenum> 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<glu::ContextInfo> 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<GLenum> 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 |
| |