18852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry/*------------------------------------------------------------------------- 28852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module 38852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * ------------------------------------------------- 48852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 58852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Copyright 2014 The Android Open Source Project 68852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 78852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 88852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * you may not use this file except in compliance with the License. 98852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * You may obtain a copy of the License at 108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * See the License for the specific language governing permissions and 178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * limitations under the License. 188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * 198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*! 208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * \file 218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry * \brief Texture filtering tests. 228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry *//*--------------------------------------------------------------------*/ 238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "es31fTextureFilteringTests.hpp" 258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glsTextureTestUtil.hpp" 278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluPixelTransfer.hpp" 298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluTexture.hpp" 308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluTextureUtil.hpp" 318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuCommandLine.hpp" 338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTextureUtil.hpp" 348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuImageCompare.hpp" 358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuTexLookupVerifier.hpp" 368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuVectorUtil.hpp" 378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deStringUtil.hpp" 398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deString.h" 408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwFunctions.hpp" 428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwEnums.hpp" 438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace deqp 458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace gles31 478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace Functional 498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::vector; 528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::string; 538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::TestLog; 548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace gls::TextureTestUtil; 558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic const char* getFaceDesc (const tcu::CubeFace face) 578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry switch (face) 598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::CUBEFACE_NEGATIVE_X: return "-X"; 618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::CUBEFACE_POSITIVE_X: return "+X"; 628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::CUBEFACE_NEGATIVE_Y: return "-Y"; 638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::CUBEFACE_POSITIVE_Y: return "+Y"; 648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::CUBEFACE_NEGATIVE_Z: return "-Z"; 658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry case tcu::CUBEFACE_POSITIVE_Z: return "+Z"; 668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry default: 678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(false); 688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return DE_NULL; 698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystatic void logCubeArrayTexCoords(TestLog& log, vector<float>& texCoord) 738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const size_t numVerts = texCoord.size() / 4; 758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry DE_ASSERT(texCoord.size() % 4 == 0); 778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (size_t vertNdx = 0; vertNdx < numVerts; vertNdx++) 798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const size_t coordNdx = vertNdx * 4; 818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float u = texCoord[coordNdx + 0]; 838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float v = texCoord[coordNdx + 1]; 848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float w = texCoord[coordNdx + 2]; 858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const float q = texCoord[coordNdx + 3]; 868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message 888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << vertNdx << ": (" 898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << u << ", " 908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << v << ", " 918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << w << ", " 928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << q << ")" 938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry << TestLog::EndMessage; 948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// Cube map array filtering 988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass TextureCubeArrayFilteringCase : public TestCase 1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic: 1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TextureCubeArrayFilteringCase (Context& context, 1038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 minFilter, 1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 magFilter, 1078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 wrapS, 1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 wrapT, 1098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 internalFormat, 1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int size, 1118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int depth, 1128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry bool onlySampleFaceInterior = false); 1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ~TextureCubeArrayFilteringCase (void); 1158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry void init (void); 1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry void deinit (void); 1188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry IterateResult iterate (void); 1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprivate: 1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TextureCubeArrayFilteringCase (const TextureCubeArrayFilteringCase&); 1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TextureCubeArrayFilteringCase& operator= (const TextureCubeArrayFilteringCase&); 1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_minFilter; 1258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_magFilter; 1268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_wrapS; 1278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_wrapT; 1288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 m_internalFormat; 1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int m_size; 1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int m_depth; 1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool m_onlySampleFaceInterior; //!< If true, we avoid sampling anywhere near a face's edges. 1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry struct FilterCase 1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::TextureCubeArray* texture; 1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec2 bottomLeft; 1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec2 topRight; 1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Vec2 layerRange; 1418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FilterCase (void) 1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : texture(DE_NULL) 1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry FilterCase (const glu::TextureCubeArray* tex_, const tcu::Vec2& bottomLeft_, const tcu::Vec2& topRight_, const tcu::Vec2& layerRange_) 1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : texture (tex_) 1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , bottomLeft (bottomLeft_) 1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , topRight (topRight_) 1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , layerRange (layerRange_) 1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::TextureCubeArray* m_gradientTex; 1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::TextureCubeArray* m_gridTex; 1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TextureRenderer m_renderer; 1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry std::vector<FilterCase> m_cases; 1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int m_caseNdx; 1638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}; 1648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureCubeArrayFilteringCase::TextureCubeArrayFilteringCase (Context& context, 1668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name, 1678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* desc, 1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 minFilter, 1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 magFilter, 1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 wrapS, 1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 wrapT, 1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 internalFormat, 1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int size, 1748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int depth, 1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry bool onlySampleFaceInterior) 1768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : TestCase (context, name, desc) 1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_minFilter (minFilter) 1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_magFilter (magFilter) 1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_wrapS (wrapS) 1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_wrapT (wrapT) 1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_internalFormat (internalFormat) 1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_size (size) 1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_depth (depth) 1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_onlySampleFaceInterior (onlySampleFaceInterior) 1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_gradientTex (DE_NULL) 1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_gridTex (DE_NULL) 1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_renderer (m_context.getRenderContext(), context.getTestContext(), glu::GLSL_VERSION_310_ES, glu::PRECISION_HIGHP) 1888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry , m_caseNdx (0) 1898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureCubeArrayFilteringCase::~TextureCubeArrayFilteringCase (void) 1938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TextureCubeArrayFilteringCase::deinit(); 1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid TextureCubeArrayFilteringCase::init (void) 1988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array")) 2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry throw tcu::NotSupportedError("GL_EXT_texture_cube_map_array not supported"); 2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry try 2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_internalFormat); 2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt); 2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 cBias = fmtInfo.valueMin; 2088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int numLevels = deLog2Floor32(m_size) + 1; 2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int numLayers = m_depth / 6; 2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Create textures. 2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gradientTex = new glu::TextureCubeArray(m_context.getRenderContext(), m_internalFormat, m_size, m_depth); 2138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gridTex = new glu::TextureCubeArray(m_context.getRenderContext(), m_internalFormat, m_size, m_depth); 2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 levelSwz[] = 2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::IVec4(0,1,2,3), 2188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::IVec4(2,1,3,0), 2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::IVec4(3,0,1,2), 2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::IVec4(1,3,2,0), 2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Fill first gradient texture (gradient direction varies between layers). 2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int levelNdx = 0; levelNdx < numLevels; levelNdx++) 2258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gradientTex->getRefTexture().allocLevel(levelNdx); 2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::PixelBufferAccess levelBuf = m_gradientTex->getRefTexture().getLevel(levelNdx); 2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int layerFaceNdx = 0; layerFaceNdx < m_depth; layerFaceNdx++) 2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 swz = levelSwz[layerFaceNdx % DE_LENGTH_OF_ARRAY(levelSwz)]; 2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 gMin = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f).swizzle(swz[0],swz[1],swz[2],swz[3])*cScale + cBias; 2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::Vec4 gMax = tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f).swizzle(swz[0],swz[1],swz[2],swz[3])*cScale + cBias; 2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::fillWithComponentGradients(tcu::getSubregion(levelBuf, 0, 0, layerFaceNdx, levelBuf.getWidth(), levelBuf.getHeight(), 1), gMin, gMax); 2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Fill second with grid texture (each layer has unique colors). 2418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int levelNdx = 0; levelNdx < numLevels; levelNdx++) 2428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gridTex->getRefTexture().allocLevel(levelNdx); 2448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::PixelBufferAccess levelBuf = m_gridTex->getRefTexture().getLevel(levelNdx); 2468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int layerFaceNdx = 0; layerFaceNdx < m_depth; layerFaceNdx++) 2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 step = 0x00ffffff / (numLevels*m_depth - 1); 2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 rgb = step * (levelNdx + layerFaceNdx*numLevels); 2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 colorA = 0xff000000 | rgb; 2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 colorB = 0xff000000 | ~rgb; 2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::fillWithGrid(tcu::getSubregion(levelBuf, 0, 0, layerFaceNdx, levelBuf.getWidth(), levelBuf.getHeight(), 1), 2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4, tcu::RGBA(colorA).toVec()*cScale + cBias, tcu::RGBA(colorB).toVec()*cScale + cBias); 2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Upload. 2608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gradientTex->upload(); 2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gridTex->upload(); 2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Test cases 2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::TextureCubeArray* const tex0 = m_gradientTex; 2668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::TextureCubeArray* const tex1 = m_gridTex; 2678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (m_onlySampleFaceInterior) 2698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex0, tcu::Vec2(-0.8f, -0.8f), tcu::Vec2(0.8f, 0.8f), tcu::Vec2(-0.5f, float(numLayers)+0.5f))); // minification 2718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex0, tcu::Vec2(0.5f, 0.65f), tcu::Vec2(0.8f, 0.8f), tcu::Vec2(-0.5f, float(numLayers)+0.5f))); // magnification 2728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex1, tcu::Vec2(-0.8f, -0.8f), tcu::Vec2(0.8f, 0.8f), tcu::Vec2(float(numLayers)+0.5f, -0.5f))); // minification 2738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex1, tcu::Vec2(0.2f, 0.2f), tcu::Vec2(0.6f, 0.5f), tcu::Vec2(float(numLayers)+0.5f, -0.5f))); // magnification 2748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else 2768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 2778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isSingleSample = (m_context.getRenderTarget().getNumSamples() == 0); 2788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // minification - w/ tweak to avoid hitting triangle edges with a face switchpoint in multisample configs 2808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (isSingleSample) 2818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex0, tcu::Vec2(-1.25f, -1.2f), tcu::Vec2(1.2f, 1.25f), tcu::Vec2(-0.5f, float(numLayers)+0.5f))); 2828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else 2838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex0, tcu::Vec2(-1.19f, -1.3f), tcu::Vec2(1.1f, 1.35f), tcu::Vec2(-0.5f, float(numLayers)+0.5f))); 2848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex0, tcu::Vec2(0.8f, 0.8f), tcu::Vec2(1.25f, 1.20f), tcu::Vec2(-0.5f, float(numLayers)+0.5f))); // magnification 2868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex1, tcu::Vec2(-1.19f, -1.3f), tcu::Vec2(1.1f, 1.35f), tcu::Vec2(float(numLayers)+0.5f, -0.5f))); // minification 2878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex1, tcu::Vec2(-1.2f, -1.1f), tcu::Vec2(-0.8f, -0.8f), tcu::Vec2(float(numLayers)+0.5f, -0.5f))); // magnification 2888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Layer rounding - only in single-sample configs as multisample configs may produce smooth transition at the middle. 2908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (isSingleSample && (numLayers > 1)) 2918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.push_back(FilterCase(tex0, tcu::Vec2(-2.0f, -1.5f ), tcu::Vec2(-0.1f, 0.9f), tcu::Vec2(1.50001f, 1.49999f))); 2928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 2958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_caseNdx = 0; 2968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 2978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 2988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry catch (...) 2998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 3008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Clean up to save memory. 3018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TextureCubeArrayFilteringCase::deinit(); 3028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry throw; 3038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 3048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 3058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid TextureCubeArrayFilteringCase::deinit (void) 3078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 3088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry delete m_gradientTex; 3098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry delete m_gridTex; 3108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gradientTex = DE_NULL; 3128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_gridTex = DE_NULL; 3138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_renderer.clear(); 3158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_cases.clear(); 3168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 3178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureCubeArrayFilteringCase::IterateResult TextureCubeArrayFilteringCase::iterate (void) 3198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 3208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry TestLog& log = m_testCtx.getLog(); 3218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glu::RenderContext& renderCtx = m_context.getRenderContext(); 3228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const glw::Functions& gl = renderCtx.getFunctions(); 3238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int viewportSize = 28; 3248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 randomSeed = deStringHash(getName()) ^ deInt32Hash(m_caseNdx) ^ m_testCtx.getCommandLine().getBaseSeed(); 3258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const RandomViewport viewport (m_context.getRenderTarget(), viewportSize, viewportSize, randomSeed); 3268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const FilterCase& curCase = m_cases[m_caseNdx]; 3278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureFormat texFmt = curCase.texture->getRefTexture().getFormat(); 3288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt); 3298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::ScopedLogSection section (m_testCtx.getLog(), string("Test") + de::toString(m_caseNdx), string("Test ") + de::toString(m_caseNdx)); 3308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry ReferenceParams refParams (TEXTURETYPE_CUBE_ARRAY); 3318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (viewport.width < viewportSize || viewport.height < viewportSize) 3338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry throw tcu::NotSupportedError("Render target too small", "", __FILE__, __LINE__); 3348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Params for reference computation. 3368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry refParams.sampler = glu::mapGLSampler(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, m_minFilter, m_magFilter); 3378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry refParams.sampler.seamlessCubeMap = true; 3388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry refParams.samplerType = getSamplerType(texFmt); 3398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry refParams.colorBias = fmtInfo.lookupBias; 3408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry refParams.colorScale = fmtInfo.lookupScale; 3418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry refParams.lodMode = LODMODE_EXACT; 3428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.bindTexture (GL_TEXTURE_CUBE_MAP_ARRAY, curCase.texture->getGLTexture()); 3448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, m_minFilter); 3458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, m_magFilter); 3468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, m_wrapS); 3478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.texParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, m_wrapT); 3488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); 3508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "Coordinates: " << curCase.bottomLeft << " -> " << curCase.topRight << TestLog::EndMessage; 3528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; faceNdx++) 3548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 3558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::CubeFace face = tcu::CubeFace(faceNdx); 3568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::Surface result (viewport.width, viewport.height); 3578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry vector<float> texCoord; 3588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry computeQuadTexCoordCubeArray(texCoord, face, curCase.bottomLeft, curCase.topRight, curCase.layerRange); 3608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Face " << getFaceDesc(face) << TestLog::EndMessage; 3628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry log << TestLog::Message << "Texture coordinates:" << TestLog::EndMessage; 3648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry logCubeArrayTexCoords(log, texCoord); 3668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_renderer.renderQuad(0, &texCoord[0], refParams); 3688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Draw"); 3698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry glu::readPixels(renderCtx, viewport.x, viewport.y, result.getAccess()); 3718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Read pixels"); 3728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 3748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isNearestOnly = m_minFilter == GL_NEAREST && m_magFilter == GL_NEAREST; 3758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::PixelFormat pixelFormat = renderCtx.getRenderTarget().getPixelFormat(); 3768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 coordBits = tcu::IVec4(10); 3778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::IVec4 colorBits = max(getBitsVec(pixelFormat) - (isNearestOnly ? 1 : 2), tcu::IVec4(0)); // 1 inaccurate bit if nearest only, 2 otherwise 3788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::LodPrecision lodPrecision; 3798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::LookupPrecision lookupPrecision; 3808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lodPrecision.derivateBits = 10; 3828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lodPrecision.lodBits = 5; 3838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lookupPrecision.colorThreshold = tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale; 3848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lookupPrecision.coordBits = coordBits.toWidth<3>(); 3858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lookupPrecision.uvwBits = tcu::IVec3(6); 3868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lookupPrecision.colorMask = getCompareMask(pixelFormat); 3878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isHighQuality = verifyTextureResult(m_testCtx, result.getAccess(), curCase.texture->getRefTexture(), 3898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry &texCoord[0], refParams, lookupPrecision, coordBits, lodPrecision, pixelFormat); 3908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (!isHighQuality) 3928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 3938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Evaluate against lower precision requirements. 3948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lodPrecision.lodBits = 4; 3958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry lookupPrecision.uvwBits = tcu::IVec3(4); 3968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "Warning: Verification against high precision requirements failed, trying with lower requirements." << TestLog::EndMessage; 3988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 3998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isOk = verifyTextureResult(m_testCtx, result.getAccess(), curCase.texture->getRefTexture(), 4008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry &texCoord[0], refParams, lookupPrecision, coordBits, lodPrecision, pixelFormat); 4018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry if (!isOk) 4038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << TestLog::EndMessage; 4058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image verification failed"); 4068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry else if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) 4088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, "Low-quality filtering result"); 4098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 4128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry m_caseNdx += 1; 4148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry return m_caseNdx < (int)m_cases.size() ? CONTINUE : STOP; 4158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureFilteringTests::TextureFilteringTests (Context& context) 4188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry : TestCaseGroup(context, "filtering", "Texture Filtering Tests") 4198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryTextureFilteringTests::~TextureFilteringTests (void) 4238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 4258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid TextureFilteringTests::init (void) 4278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{ 4288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static const struct 4298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name; 4318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 mode; 4328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } wrapModes[] = 4338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "clamp", GL_CLAMP_TO_EDGE }, 4358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "repeat", GL_REPEAT }, 4368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "mirror", GL_MIRRORED_REPEAT } 4378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 4388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static const struct 4408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name; 4428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 mode; 4438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } minFilterModes[] = 4448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "nearest", GL_NEAREST }, 4468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "linear", GL_LINEAR }, 4478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "nearest_mipmap_nearest", GL_NEAREST_MIPMAP_NEAREST }, 4488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "linear_mipmap_nearest", GL_LINEAR_MIPMAP_NEAREST }, 4498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "nearest_mipmap_linear", GL_NEAREST_MIPMAP_LINEAR }, 4508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "linear_mipmap_linear", GL_LINEAR_MIPMAP_LINEAR } 4518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 4528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static const struct 4548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name; 4568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 mode; 4578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } magFilterModes[] = 4588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "nearest", GL_NEAREST }, 4608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "linear", GL_LINEAR } 4618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 4628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static const struct 4648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int size; 4668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry int depth; 4678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } sizesCubeArray[] = 4688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 8, 6 }, 4708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 64, 12 }, 4718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 128, 12 }, 4728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 7, 12 }, 4738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 63, 18 } 4748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 4758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry static const struct 4778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* name; 4798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry deUint32 format; 4808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } filterableFormatsByType[] = 4818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgba16f", GL_RGBA16F }, 4838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "r11f_g11f_b10f", GL_R11F_G11F_B10F }, 4848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgb9_e5", GL_RGB9_E5 }, 4858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgba8", GL_RGBA8 }, 4868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgba8_snorm", GL_RGBA8_SNORM }, 4878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgb565", GL_RGB565 }, 4888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgba4", GL_RGBA4 }, 4898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgb5_a1", GL_RGB5_A1 }, 4908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "srgb8_alpha8", GL_SRGB8_ALPHA8 }, 4918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { "rgb10_a2", GL_RGB10_A2 } 4928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry }; 4938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Cube map array texture filtering. 4958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 4968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TestCaseGroup* const groupCubeArray = new tcu::TestCaseGroup(m_testCtx, "cube_array", "Cube Map Array Texture Filtering"); 4978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry addChild(groupCubeArray); 4988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 4998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Formats. 5008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TestCaseGroup* const formatsGroup = new tcu::TestCaseGroup(m_testCtx, "formats", "Cube Map Array Texture Formats"); 5028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry groupCubeArray->addChild(formatsGroup); 5038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(filterableFormatsByType); fmtNdx++) 5058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++) 5078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 minFilter = minFilterModes[filterNdx].mode; 5098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* filterName = minFilterModes[filterNdx].name; 5108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 format = filterableFormatsByType[fmtNdx].format; 5118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* formatName = filterableFormatsByType[fmtNdx].name; 5128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isMipmap = minFilter != GL_NEAREST && minFilter != GL_LINEAR; 5138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 magFilter = isMipmap ? GL_LINEAR : minFilter; 5148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const string name = string(formatName) + "_" + filterName; 5158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 wrapS = GL_REPEAT; 5168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 wrapT = GL_REPEAT; 5178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int size = 64; 5188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int depth = 12; 5198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry formatsGroup->addChild(new TextureCubeArrayFilteringCase(m_context, 5218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry name.c_str(), "", 5228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry minFilter, magFilter, 5238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry wrapS, wrapT, 5248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry format, 5258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry size, depth)); 5268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Sizes. 5318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TestCaseGroup* const sizesGroup = new tcu::TestCaseGroup(m_testCtx, "sizes", "Texture Sizes"); 5338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry groupCubeArray->addChild(sizesGroup); 5348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizesCubeArray); sizeNdx++) 5368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++) 5388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 minFilter = minFilterModes[filterNdx].mode; 5408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const char* filterName = minFilterModes[filterNdx].name; 5418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 format = GL_RGBA8; 5428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isMipmap = minFilter != GL_NEAREST && minFilter != GL_LINEAR; 5438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 magFilter = isMipmap ? GL_LINEAR : minFilter; 5448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 wrapS = GL_REPEAT; 5458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 wrapT = GL_REPEAT; 5468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int size = sizesCubeArray[sizeNdx].size; 5478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int depth = sizesCubeArray[sizeNdx].depth; 5488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const string name = de::toString(size) + "x" + de::toString(size) + "x" + de::toString(depth) + "_" + filterName; 5498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry sizesGroup->addChild(new TextureCubeArrayFilteringCase(m_context, 5518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry name.c_str(), "", 5528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry minFilter, magFilter, 5538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry wrapS, wrapT, 5548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry format, 5558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry size, depth)); 5568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Wrap modes. 5618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TestCaseGroup* const combinationsGroup = new tcu::TestCaseGroup(m_testCtx, "combinations", "Filter and wrap mode combinations"); 5638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry groupCubeArray->addChild(combinationsGroup); 5648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int minFilterNdx = 0; minFilterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); minFilterNdx++) 5668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int magFilterNdx = 0; magFilterNdx < DE_LENGTH_OF_ARRAY(magFilterModes); magFilterNdx++) 5688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int wrapSNdx = 0; wrapSNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapSNdx++) 5708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int wrapTNdx = 0; wrapTNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapTNdx++) 5728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 minFilter = minFilterModes[minFilterNdx].mode; 5748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 magFilter = magFilterModes[magFilterNdx].mode; 5758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 format = GL_RGBA8; 5768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 wrapS = wrapModes[wrapSNdx].mode; 5778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 wrapT = wrapModes[wrapTNdx].mode; 5788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int size = 63; 5798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int depth = 12; 5808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const string name = string(minFilterModes[minFilterNdx].name) + "_" + magFilterModes[magFilterNdx].name + "_" + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name; 5818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry combinationsGroup->addChild(new TextureCubeArrayFilteringCase(m_context, 5838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry name.c_str(), "", 5848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry minFilter, magFilter, 5858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry wrapS, wrapT, 5868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry format, 5878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry size, depth)); 5888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 5938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Cases with no visible cube edges. 5958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 5968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::TestCaseGroup* const onlyFaceInteriorGroup = new tcu::TestCaseGroup(m_testCtx, "no_edges_visible", "Don't sample anywhere near a face's edges"); 5978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry groupCubeArray->addChild(onlyFaceInteriorGroup); 5988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 5998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry for (int isLinearI = 0; isLinearI <= 1; isLinearI++) 6008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const bool isLinear = isLinearI != 0; 6028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const deUint32 filter = isLinear ? GL_LINEAR : GL_NEAREST; 6038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry onlyFaceInteriorGroup->addChild(new TextureCubeArrayFilteringCase(m_context, 6058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry isLinear ? "linear" : "nearest", "", 6068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry filter, filter, 6078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_REPEAT, GL_REPEAT, 6088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry GL_RGBA8, 6098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 63, 12, 6108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry true)); 6118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 6148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} 6158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // Functional 6178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // gles31 6188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // deqp 619