13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Texture access function tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fShaderTextureFunctionTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsShaderRenderCase.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsShaderLibrary.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluTexture.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluTextureUtil.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluPixelTransfer.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluStrUtil.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuMatrix.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuMatrixUtil.hpp" 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp" 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp" 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream> 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp" 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum Function 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTURE = 0, //!< texture(), textureOffset() 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREPROJ, //!< textureProj(), textureProjOffset() 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREPROJ3, //!< textureProj(sampler2D, vec3) 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTURELOD, // ... 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREPROJLOD, 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREPROJLOD3, //!< textureProjLod(sampler2D, vec3) 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREGRAD, 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREPROJGRAD, 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXTUREPROJGRAD3, //!< textureProjGrad(sampler2D, vec3) 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_TEXELFETCH, 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FUNCTION_LAST 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool functionHasAutoLod (glu::ShaderType shaderType, Function function) 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return shaderType == glu::SHADERTYPE_FRAGMENT && 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (function == FUNCTION_TEXTURE || 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJ || 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJ3); 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool functionHasProj (Function function) 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return function == FUNCTION_TEXTUREPROJ || 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJ3 || 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJLOD || 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJGRAD || 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJLOD3 || 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJGRAD3; 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool functionHasGrad (Function function) 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return function == FUNCTION_TEXTUREGRAD || function == FUNCTION_TEXTUREPROJGRAD || function == FUNCTION_TEXTUREPROJGRAD3; 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool functionHasLod (Function function) 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return function == FUNCTION_TEXTURELOD || 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJLOD || 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXTUREPROJLOD3 || 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry function == FUNCTION_TEXELFETCH; 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct TextureLookupSpec 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Function function; 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 minCoord; 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 maxCoord; 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Bias 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool useBias; 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Bias or Lod for *Lod* functions 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float minLodBias; 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float maxLodBias; 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // For *Grad* functions 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec3 minDX; 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec3 maxDX; 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec3 minDY; 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec3 maxDY; 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool useOffset; 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::IVec3 offset; 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLookupSpec (void) 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : function (FUNCTION_LAST) 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minCoord (0.0f) 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxCoord (1.0f) 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , useBias (false) 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minLodBias (0.0f) 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxLodBias (0.0f) 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minDX (0.0f) 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxDX (0.0f) 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minDY (0.0f) 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxDY (0.0f) 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , useOffset (false) 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , offset (0) 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLookupSpec (Function function_, 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4& minCoord_, 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4& maxCoord_, 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool useBias_, 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float minLodBias_, 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float maxLodBias_, 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec3& minDX_, 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec3& maxDX_, 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec3& minDY_, 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec3& maxDY_, 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool useOffset_, 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::IVec3& offset_) 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : function (function_) 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minCoord (minCoord_) 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxCoord (maxCoord_) 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , useBias (useBias_) 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minLodBias (minLodBias_) 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxLodBias (maxLodBias_) 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minDX (minDX_) 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxDX (maxDX_) 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , minDY (minDY_) 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , maxDY (maxDY_) 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , useOffset (useOffset_) 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , offset (offset_) 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum TextureType 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TEXTURETYPE_2D, 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TEXTURETYPE_CUBE_MAP, 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TEXTURETYPE_2D_ARRAY, 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TEXTURETYPE_3D, 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TEXTURETYPE_LAST 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct TextureSpec 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureType type; //!< Texture type (2D, cubemap, ...) 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 format; //!< Internal format. 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int width; 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int height; 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int depth; 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int numLevels; 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler sampler; 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureSpec (void) 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : type (TEXTURETYPE_LAST) 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , format (GL_NONE) 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , width (0) 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , height (0) 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , depth (0) 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , numLevels (0) 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureSpec (TextureType type_, 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 format_, 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int width_, 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int height_, 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int depth_, 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int numLevels_, 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Sampler& sampler_) 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : type (type_) 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , format (format_) 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , width (width_) 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , height (height_) 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , depth (depth_) 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , numLevels (numLevels_) 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , sampler (sampler_) 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct TexLookupParams 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float lod; 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::IVec3 offset; 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 scale; 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 bias; 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TexLookupParams (void) 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : lod (0.0f) 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , offset (0) 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , scale (1.0f) 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , bias (0.0f) 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec2; 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec3; 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec4; 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::IVec2; 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::IVec3; 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::IVec4; 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum LodMode 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LODMODE_EXACT = 0, 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LODMODE_MIN_BOUND, 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LODMODE_MAX_BOUND, 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry LODMODE_LAST 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const LodMode DEFAULT_LOD_MODE = LODMODE_EXACT; 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float computeLodFromDerivates (float dudx, float dvdx, float dudy, float dvdy) 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const LodMode mode = DEFAULT_LOD_MODE; 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float p; 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (mode) 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case LODMODE_EXACT: 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p = de::max(deFloatSqrt(dudx*dudx + dvdx*dvdx), deFloatSqrt(dudy*dudy + dvdy*dvdy)); 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case LODMODE_MIN_BOUND: 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case LODMODE_MAX_BOUND: 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float mu = de::max(deFloatAbs(dudx), deFloatAbs(dudy)); 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float mv = de::max(deFloatAbs(dvdx), deFloatAbs(dvdy)); 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p = mode == LODMODE_MIN_BOUND ? de::max(mu, mv) : mu + mv; 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return deFloatLog2(p); 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float computeLodFromDerivates (float dudx, float dvdx, float dwdx, float dudy, float dvdy, float dwdy) 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const LodMode mode = DEFAULT_LOD_MODE; 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float p; 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (mode) 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case LODMODE_EXACT: 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p = de::max(deFloatSqrt(dudx*dudx + dvdx*dvdx + dwdx*dwdx), deFloatSqrt(dudy*dudy + dvdy*dvdy + dwdy*dwdy)); 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case LODMODE_MIN_BOUND: 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case LODMODE_MAX_BOUND: 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float mu = de::max(deFloatAbs(dudx), deFloatAbs(dudy)); 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float mv = de::max(deFloatAbs(dvdx), deFloatAbs(dvdy)); 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float mw = de::max(deFloatAbs(dwdx), deFloatAbs(dwdy)); 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p = mode == LODMODE_MIN_BOUND ? de::max(de::max(mu, mv), mw) : (mu + mv + mw); 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return deFloatLog2(p); 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float computeLodFromGrad2D (const gls::ShaderEvalContext& c) 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float w = (float)c.textures[0].tex2D->getWidth(); 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float h = (float)c.textures[0].tex2D->getHeight(); 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return computeLodFromDerivates(c.in[1].x()*w, c.in[1].y()*h, c.in[2].x()*w, c.in[2].y()*h); 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float computeLodFromGrad2DArray (const gls::ShaderEvalContext& c) 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float w = (float)c.textures[0].tex2DArray->getWidth(); 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float h = (float)c.textures[0].tex2DArray->getHeight(); 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return computeLodFromDerivates(c.in[1].x()*w, c.in[1].y()*h, c.in[2].x()*w, c.in[2].y()*h); 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float computeLodFromGrad3D (const gls::ShaderEvalContext& c) 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float w = (float)c.textures[0].tex3D->getWidth(); 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float h = (float)c.textures[0].tex3D->getHeight(); 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float d = (float)c.textures[0].tex3D->getDepth(); 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return computeLodFromDerivates(c.in[1].x()*w, c.in[1].y()*h, c.in[1].z()*d, c.in[2].x()*w, c.in[2].y()*h, c.in[2].z()*d); 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float computeLodFromGradCube (const gls::ShaderEvalContext& c) 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Major axis is always -Z or +Z 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float m = de::abs(c.in[0].z()); 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float d = (float)c.textures[0].texCube->getSize(); 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = d/(2.0f*m); 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float t = d/(2.0f*m); 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return computeLodFromDerivates(c.in[1].x()*s, c.in[1].y()*t, c.in[2].x()*s, c.in[2].y()*t); 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef void (*TexEvalFunc) (gls::ShaderEvalContext& c, const TexLookupParams& lookupParams); 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 texture2D (const gls::ShaderEvalContext& c, float s, float t, float lod) { return c.textures[0].tex2D->sample(c.textures[0].sampler, s, t, lod); } 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 textureCube (const gls::ShaderEvalContext& c, float s, float t, float r, float lod) { return c.textures[0].texCube->sample(c.textures[0].sampler, s, t, r, lod); } 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 texture2DArray (const gls::ShaderEvalContext& c, float s, float t, float r, float lod) { return c.textures[0].tex2DArray->sample(c.textures[0].sampler, s, t, r, lod); } 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 texture3D (const gls::ShaderEvalContext& c, float s, float t, float r, float lod) { return c.textures[0].tex3D->sample(c.textures[0].sampler, s, t, r, lod); } 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float texture2DShadow (const gls::ShaderEvalContext& c, float ref, float s, float t, float lod) { return c.textures[0].tex2D->sampleCompare(c.textures[0].sampler, ref, s, t, lod); } 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float textureCubeShadow (const gls::ShaderEvalContext& c, float ref, float s, float t, float r, float lod) { return c.textures[0].texCube->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod); } 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float texture2DArrayShadow (const gls::ShaderEvalContext& c, float ref, float s, float t, float r, float lod) { return c.textures[0].tex2DArray->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod); } 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 texture2DOffset (const gls::ShaderEvalContext& c, float s, float t, float lod, IVec2 offset) { return c.textures[0].tex2D->sampleOffset(c.textures[0].sampler, s, t, lod, offset); } 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 texture2DArrayOffset (const gls::ShaderEvalContext& c, float s, float t, float r, float lod, IVec2 offset) { return c.textures[0].tex2DArray->sampleOffset(c.textures[0].sampler, s, t, r, lod, offset); } 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 texture3DOffset (const gls::ShaderEvalContext& c, float s, float t, float r, float lod, IVec3 offset) { return c.textures[0].tex3D->sampleOffset(c.textures[0].sampler, s, t, r, lod, offset); } 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float texture2DShadowOffset (const gls::ShaderEvalContext& c, float ref, float s, float t, float lod, IVec2 offset) { return c.textures[0].tex2D->sampleCompareOffset(c.textures[0].sampler, ref, s, t, lod, offset); } 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float texture2DArrayShadowOffset (const gls::ShaderEvalContext& c, float ref, float s, float t, float r, float lod, IVec2 offset) { return c.textures[0].tex2DArray->sampleCompareOffset(c.textures[0].sampler, ref, s, t, r, lod, offset); } 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Eval functions. 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2D (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod)*p.scale + p.bias; } 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCube (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod)*p.scale + p.bias; } 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArray (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod)*p.scale + p.bias; } 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3D (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod)*p.scale + p.bias; } 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x())*p.scale + p.bias; } 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCubeBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; } 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; } 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; } 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProj3 (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod)*p.scale + p.bias; } 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProj3Bias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; } 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProj (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod)*p.scale + p.bias; } 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x())*p.scale + p.bias; } 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProj (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod)*p.scale + p.bias; } 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod+c.in[1].x())*p.scale + p.bias; } 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DLod (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x(), c.in[0].y(), c.in[1].x())*p.scale + p.bias; } 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCubeLod (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x())*p.scale + p.bias; } 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayLod (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x())*p.scale + p.bias; } 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DLod (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x())*p.scale + p.bias; } 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjLod3 (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), c.in[1].x())*p.scale + p.bias; } 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjLod (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x())*p.scale + p.bias; } 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjLod (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), c.in[1].x())*p.scale + p.bias; } 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Offset variants 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; } 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; } 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset)*p.scale + p.bias; } 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x(), p.offset)*p.scale + p.bias; } 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DLodOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayLodOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DLodOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x(), p.offset)*p.scale + p.bias; } 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProj3Offset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; } 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProj3OffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; } 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod, p.offset)*p.scale + p.bias; } 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod+c.in[1].x(), p.offset)*p.scale + p.bias; } 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjLod3Offset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjLodOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; } 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjLodOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), c.in[1].x(), p.offset)*p.scale + p.bias; } 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Shadow variants 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadow (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod); } 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x()); } 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCubeShadow (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod); } 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCubeShadowBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x()); } 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayShadow (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod); } 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowLod (gls::ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x()); } 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowLodOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0,1)); } 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProj (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod); } 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x()); } 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjLod (gls::ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x()); } 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjLodOffset(gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x(), p.offset.swizzle(0,1)); } 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0,1)); } 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.swizzle(0,1)); } 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod, p.offset.swizzle(0,1)); } 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjOffsetBias (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x(), p.offset.swizzle(0,1)); } 4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Gradient variarts 4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DGrad (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c))*p.scale + p.bias; } 4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCubeGrad (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c))*p.scale + p.bias; } 4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayGrad (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c))*p.scale + p.bias; } 4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DGrad (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c))*p.scale + p.bias; } 4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowGrad (gls::ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c)); } 4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTextureCubeShadowGrad (gls::ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c)); } 4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayShadowGrad (gls::ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = texture2DArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c)); } 4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c), p.offset.swizzle(0,1))*p.scale + p.bias; } 4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c), p.offset.swizzle(0,1))*p.scale + p.bias; } 4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c), p.offset)*p.scale + p.bias; } 4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c), p.offset.swizzle(0,1)); } 4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DArrayShadowGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DArrayShadowOffset(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c), p.offset.swizzle(0,1)); } 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjGrad (gls::ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c)); } 4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DShadowProjGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c), p.offset.swizzle(0,1)); } 4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjGrad3 (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), computeLodFromGrad2D(c))*p.scale + p.bias; } 4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjGrad (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c))*p.scale + p.bias; } 4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjGrad (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), computeLodFromGrad3D(c))*p.scale + p.bias; } 4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjGrad3Offset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), computeLodFromGrad2D(c), p.offset.swizzle(0,1))*p.scale + p.bias; } 4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture2DProjGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c), p.offset.swizzle(0,1))*p.scale + p.bias; } 4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexture3DProjGradOffset (gls::ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), computeLodFromGrad3D(c), p.offset)*p.scale + p.bias; } 4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Texel fetch variants 4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexelFetch2D (gls::ShaderEvalContext& c, const TexLookupParams& p) 4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int x = deChopFloatToInt32(c.in[0].x())+p.offset.x(); 4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int y = deChopFloatToInt32(c.in[0].y())+p.offset.y(); 4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int lod = deChopFloatToInt32(c.in[1].x()); 4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color = c.textures[0].tex2D->getLevel(lod).getPixel(x, y)*p.scale + p.bias; 4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexelFetch2DArray (gls::ShaderEvalContext& c, const TexLookupParams& p) 4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int x = deChopFloatToInt32(c.in[0].x())+p.offset.x(); 4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int y = deChopFloatToInt32(c.in[0].y())+p.offset.y(); 4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int l = deChopFloatToInt32(c.in[0].z()); 4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int lod = deChopFloatToInt32(c.in[1].x()); 4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color = c.textures[0].tex2DArray->getLevel(lod).getPixel(x, y, l)*p.scale + p.bias; 4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void evalTexelFetch3D (gls::ShaderEvalContext& c, const TexLookupParams& p) 4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int x = deChopFloatToInt32(c.in[0].x())+p.offset.x(); 4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int y = deChopFloatToInt32(c.in[0].y())+p.offset.y(); 4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int z = deChopFloatToInt32(c.in[0].z())+p.offset.z(); 4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int lod = deChopFloatToInt32(c.in[1].x()); 4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry c.color = c.textures[0].tex3D->getLevel(lod).getPixel(x, y, z)*p.scale + p.bias; 4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TexLookupEvaluator : public gls::ShaderEvaluator 4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TexLookupEvaluator (TexEvalFunc evalFunc, const TexLookupParams& lookupParams) : m_evalFunc(evalFunc), m_lookupParams(lookupParams) {} 4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void evaluate (gls::ShaderEvalContext& ctx) { m_evalFunc(ctx, m_lookupParams); } 4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TexEvalFunc m_evalFunc; 5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const TexLookupParams& m_lookupParams; 5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderTextureFunctionCase : public gls::ShaderRenderCase 5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ShaderTextureFunctionCase (Context& context, const char* name, const char* desc, const TextureLookupSpec& lookup, const TextureSpec& texture, TexEvalFunc evalFunc, bool isVertexCase); 5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~ShaderTextureFunctionCase (void); 5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void init (void); 5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void deinit (void); 5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected: 5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setupUniforms (int programID, const tcu::Vec4& constCoords); 5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void initTexture (void); 5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void initShaderSources (void); 5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLookupSpec m_lookupSpec; 5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureSpec m_textureSpec; 5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TexLookupParams m_lookupParams; 5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TexLookupEvaluator m_evaluator; 5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::Texture2D* m_texture2D; 5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::TextureCube* m_textureCube; 5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::Texture2DArray* m_texture2DArray; 5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::Texture3D* m_texture3D; 5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5323c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderTextureFunctionCase::ShaderTextureFunctionCase (Context& context, const char* name, const char* desc, const TextureLookupSpec& lookup, const TextureSpec& texture, TexEvalFunc evalFunc, bool isVertexCase) 5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : gls::ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_evaluator) 5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_lookupSpec (lookup) 5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_textureSpec (texture) 5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_evaluator (evalFunc, m_lookupParams) 5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texture2D (DE_NULL) 5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_textureCube (DE_NULL) 5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texture2DArray (DE_NULL) 5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_texture3D (DE_NULL) 5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5443c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderTextureFunctionCase::~ShaderTextureFunctionCase (void) 5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_texture2D; 5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_textureCube; 5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_texture2DArray; 5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_texture3D; 5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderTextureFunctionCase::init (void) 5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Base coord scale & bias 5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 s = m_lookupSpec.maxCoord-m_lookupSpec.minCoord; 5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 b = m_lookupSpec.minCoord; 5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float baseCoordTrans[] = 5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry s.x(), 0.0f, 0.f, b.x(), 5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.f, s.y(), 0.f, b.y(), 5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry s.z()/2.f, -s.z()/2.f, 0.f, s.z()/2.f + b.z(), 5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry -s.w()/2.f, s.w()/2.f, 0.f, s.w()/2.f + b.w() 5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_userAttribTransforms.push_back(tcu::Mat4(baseCoordTrans)); 5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool hasLodBias = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias; 5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isGrad = functionHasGrad(m_lookupSpec.function); 5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!isGrad || !hasLodBias); 5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (hasLodBias) 5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = m_lookupSpec.maxLodBias-m_lookupSpec.minLodBias; 5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float b = m_lookupSpec.minLodBias; 5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float lodCoordTrans[] = 5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry s/2.0f, s/2.0f, 0.f, b, 5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 0.0f, 0.0f, 5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 0.0f, 0.0f, 5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 0.0f, 0.0f 5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_userAttribTransforms.push_back(tcu::Mat4(lodCoordTrans)); 5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (isGrad) 5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec3 sx = m_lookupSpec.maxDX-m_lookupSpec.minDX; 5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec3 sy = m_lookupSpec.maxDY-m_lookupSpec.minDY; 5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float gradDxTrans[] = 5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sx.x()/2.0f, sx.x()/2.0f, 0.f, m_lookupSpec.minDX.x(), 5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sx.y()/2.0f, sx.y()/2.0f, 0.0f, m_lookupSpec.minDX.y(), 5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry sx.z()/2.0f, sx.z()/2.0f, 0.0f, m_lookupSpec.minDX.z(), 5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 0.0f, 0.0f 5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float gradDyTrans[] = 6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry -sy.x()/2.0f, -sy.x()/2.0f, 0.f, m_lookupSpec.maxDY.x(), 6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry -sy.y()/2.0f, -sy.y()/2.0f, 0.0f, m_lookupSpec.maxDY.y(), 6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry -sy.z()/2.0f, -sy.z()/2.0f, 0.0f, m_lookupSpec.maxDY.z(), 6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 0.0f, 0.0f 6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_userAttribTransforms.push_back(tcu::Mat4(gradDxTrans)); 6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_userAttribTransforms.push_back(tcu::Mat4(gradDyTrans)); 6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry initShaderSources(); 6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry initTexture(); 6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gls::ShaderRenderCase::init(); 6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderTextureFunctionCase::initTexture (void) 6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const IVec4 texCubeSwz[] = 6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4(0,0,1,1), 6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4(1,1,0,0), 6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4(0,1,0,1), 6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4(1,0,1,0), 6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4(0,1,1,0), 6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4(1,0,0,1) 6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(texCubeSwz) == tcu::CUBEFACE_LAST); 6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_textureSpec.format); 6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt); 6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::IVec2 viewportSize = getViewportSize(); 6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isProj = functionHasProj(m_lookupSpec.function); 6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isAutoLod = functionHasAutoLod(m_isVertexCase ? glu::SHADERTYPE_VERTEX : glu::SHADERTYPE_FRAGMENT, 6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupSpec.function); // LOD can vary significantly 6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float proj = isProj ? 1.0f/m_lookupSpec.minCoord[m_lookupSpec.function == FUNCTION_TEXTUREPROJ3 ? 2 : 3] : 1.0f; 6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_textureSpec.type) 6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D: 6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float levelStep = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1); 6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cBias = fmtInfo.valueMin; 6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int baseCellSize = de::min(m_textureSpec.width/4, m_textureSpec.height/4); 6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2D = new glu::Texture2D(m_renderCtx, m_textureSpec.format, m_textureSpec.width, m_textureSpec.height); 6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int level = 0; level < m_textureSpec.numLevels; level++) 6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fA = level*levelStep; 6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fB = 1.0f-fA; 6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorA = cBias + cScale*Vec4(fA, fB, fA, fB); 6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorB = cBias + cScale*Vec4(fB, fA, fB, fA); 6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2D->getRefTexture().allocLevel(level); 6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::fillWithGrid(m_texture2D->getRefTexture().getLevel(level), de::max(1, baseCellSize>>level), colorA, colorB); 6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2D->upload(); 6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Compute LOD. 6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dudx = (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*m_textureSpec.width / (float)viewportSize[0]; 6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dvdy = (m_lookupSpec.maxCoord[1]-m_lookupSpec.minCoord[1])*proj*m_textureSpec.height / (float)viewportSize[1]; 6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.lod = computeLodFromDerivates(dudx, 0.0f, 0.0f, dvdy); 6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Append to texture list. 6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textures.push_back(gls::TextureBinding(m_texture2D, m_textureSpec.sampler)); 6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_CUBE_MAP: 6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float levelStep = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1); 6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cBias = fmtInfo.valueMin; 6752e751e3e77060f699c560104e82379d3ce54f67aPyry Haulos Vec4 cCorner = cBias + cScale*0.5f; 6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int baseCellSize = de::min(m_textureSpec.width/4, m_textureSpec.height/4); 6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(m_textureSpec.width == m_textureSpec.height); 6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textureCube = new glu::TextureCube(m_renderCtx, m_textureSpec.format, m_textureSpec.width); 6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int level = 0; level < m_textureSpec.numLevels; level++) 6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fA = level*levelStep; 6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fB = 1.0f-fA; 6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2 f (fA, fB); 6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const IVec4& swzA = texCubeSwz[face]; 6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IVec4 swzB = 1-swzA; 6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorA = cBias + cScale*f.swizzle(swzA[0], swzA[1], swzA[2], swzA[3]); 6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorB = cBias + cScale*f.swizzle(swzB[0], swzB[1], swzB[2], swzB[3]); 6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textureCube->getRefTexture().allocLevel((tcu::CubeFace)face, level); 6948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry { 6968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const tcu::PixelBufferAccess access = m_textureCube->getRefTexture().getLevelFace(level, (tcu::CubeFace)face); 6978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry const int lastPix = access.getWidth()-1; 6988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 6998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry tcu::fillWithGrid(access, de::max(1, baseCellSize>>level), colorA, colorB); 7008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry 7018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry // Ensure all corners have identical colors in order to avoid dealing with ambiguous corner texel filtering 7022e751e3e77060f699c560104e82379d3ce54f67aPyry Haulos access.setPixel(cCorner, 0, 0); 7032e751e3e77060f699c560104e82379d3ce54f67aPyry Haulos access.setPixel(cCorner, 0, lastPix); 7042e751e3e77060f699c560104e82379d3ce54f67aPyry Haulos access.setPixel(cCorner, lastPix, 0); 7052e751e3e77060f699c560104e82379d3ce54f67aPyry Haulos access.setPixel(cCorner, lastPix, lastPix); 7068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry } 7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textureCube->upload(); 7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Compute LOD \note Assumes that only single side is accessed and R is constant major axis. 7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::abs(m_lookupSpec.minCoord[2] - m_lookupSpec.maxCoord[2]) < 0.005); 7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::abs(m_lookupSpec.minCoord[0]) < de::abs(m_lookupSpec.minCoord[2]) && de::abs(m_lookupSpec.maxCoord[0]) < de::abs(m_lookupSpec.minCoord[2])); 7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::abs(m_lookupSpec.minCoord[1]) < de::abs(m_lookupSpec.minCoord[2]) && de::abs(m_lookupSpec.maxCoord[1]) < de::abs(m_lookupSpec.minCoord[2])); 7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::CubeFaceFloatCoords c00 = tcu::getCubeFaceCoords(Vec3(m_lookupSpec.minCoord[0]*proj, m_lookupSpec.minCoord[1]*proj, m_lookupSpec.minCoord[2]*proj)); 7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::CubeFaceFloatCoords c10 = tcu::getCubeFaceCoords(Vec3(m_lookupSpec.maxCoord[0]*proj, m_lookupSpec.minCoord[1]*proj, m_lookupSpec.minCoord[2]*proj)); 7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::CubeFaceFloatCoords c01 = tcu::getCubeFaceCoords(Vec3(m_lookupSpec.minCoord[0]*proj, m_lookupSpec.maxCoord[1]*proj, m_lookupSpec.minCoord[2]*proj)); 7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dudx = (c10.s - c00.s)*m_textureSpec.width / (float)viewportSize[0]; 7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dvdy = (c01.t - c00.t)*m_textureSpec.height / (float)viewportSize[1]; 7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.lod = computeLodFromDerivates(dudx, 0.0f, 0.0f, dvdy); 7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textures.push_back(gls::TextureBinding(m_textureCube, m_textureSpec.sampler)); 7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D_ARRAY: 7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float layerStep = 1.0f / (float)m_textureSpec.depth; 7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float levelStep = isAutoLod ? 0.0f : 1.0f / (float)(de::max(1, m_textureSpec.numLevels-1)*m_textureSpec.depth); 7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cBias = fmtInfo.valueMin; 7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int baseCellSize = de::min(m_textureSpec.width/4, m_textureSpec.height/4); 7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2DArray = new glu::Texture2DArray(m_renderCtx, m_textureSpec.format, m_textureSpec.width, m_textureSpec.height, m_textureSpec.depth); 7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int level = 0; level < m_textureSpec.numLevels; level++) 7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2DArray->getRefTexture().allocLevel(level); 7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::PixelBufferAccess levelAccess = m_texture2DArray->getRefTexture().getLevel(level); 7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int layer = 0; layer < levelAccess.getDepth(); layer++) 7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fA = layer*layerStep + level*levelStep; 7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fB = 1.0f-fA; 7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorA = cBias + cScale*Vec4(fA, fB, fA, fB); 7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorB = cBias + cScale*Vec4(fB, fA, fB, fA); 7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::fillWithGrid(tcu::getSubregion(levelAccess, 0, 0, layer, levelAccess.getWidth(), levelAccess.getHeight(), 1), de::max(1, baseCellSize>>level), colorA, colorB); 7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2DArray->upload(); 7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Compute LOD. 7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dudx = (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*m_textureSpec.width / (float)viewportSize[0]; 7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dvdy = (m_lookupSpec.maxCoord[1]-m_lookupSpec.minCoord[1])*proj*m_textureSpec.height / (float)viewportSize[1]; 7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.lod = computeLodFromDerivates(dudx, 0.0f, 0.0f, dvdy); 7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Append to texture list. 7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textures.push_back(gls::TextureBinding(m_texture2DArray, m_textureSpec.sampler)); 7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_3D: 7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float levelStep = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1); 7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 cBias = fmtInfo.valueMin; 7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int baseCellSize = de::min(de::min(m_textureSpec.width/2, m_textureSpec.height/2), m_textureSpec.depth/2); 7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture3D = new glu::Texture3D(m_renderCtx, m_textureSpec.format, m_textureSpec.width, m_textureSpec.height, m_textureSpec.depth); 7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int level = 0; level < m_textureSpec.numLevels; level++) 7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fA = level*levelStep; 7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float fB = 1.0f-fA; 7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorA = cBias + cScale*Vec4(fA, fB, fA, fB); 7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec4 colorB = cBias + cScale*Vec4(fB, fA, fB, fA); 7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture3D->getRefTexture().allocLevel(level); 7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::fillWithGrid(m_texture3D->getRefTexture().getLevel(level), de::max(1, baseCellSize>>level), colorA, colorB); 7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture3D->upload(); 7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Compute LOD. 7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dudx = (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*m_textureSpec.width / (float)viewportSize[0]; 7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dvdy = (m_lookupSpec.maxCoord[1]-m_lookupSpec.minCoord[1])*proj*m_textureSpec.height / (float)viewportSize[1]; 7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dwdx = (m_lookupSpec.maxCoord[2]-m_lookupSpec.minCoord[2])*0.5f*proj*m_textureSpec.depth / (float)viewportSize[0]; 7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float dwdy = (m_lookupSpec.maxCoord[2]-m_lookupSpec.minCoord[2])*0.5f*proj*m_textureSpec.depth / (float)viewportSize[1]; 7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.lod = computeLodFromDerivates(dudx, 0.0f, dwdx, 0.0f, dvdy, dwdy); 7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Append to texture list. 7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textures.push_back(gls::TextureBinding(m_texture3D, m_textureSpec.sampler)); 7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Set lookup scale & bias 8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.scale = fmtInfo.lookupScale; 8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.bias = fmtInfo.lookupBias; 8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_lookupParams.offset = m_lookupSpec.offset; 8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderTextureFunctionCase::initShaderSources (void) 8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Function function = m_lookupSpec.function; 8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isVtxCase = m_isVertexCase; 8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isProj = functionHasProj(function); 8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isGrad = functionHasGrad(function); 8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isShadow = m_textureSpec.sampler.compare != tcu::Sampler::COMPAREMODE_NONE; 8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool is2DProj4 = !isShadow && m_textureSpec.type == TEXTURETYPE_2D && (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJGRAD); 8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isIntCoord = function == FUNCTION_TEXELFETCH; 8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool hasLodBias = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias; 8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int texCoordComps = m_textureSpec.type == TEXTURETYPE_2D ? 2 : 3; 8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int extraCoordComps = (isProj ? (is2DProj4 ? 2 : 1) : 0) + (isShadow ? 1 : 0); 8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::DataType coordType = glu::getDataTypeFloatVec(texCoordComps+extraCoordComps); 8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::Precision coordPrec = glu::PRECISION_HIGHP; 8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* coordTypeName = glu::getDataTypeName(coordType); 8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* coordPrecName = glu::getPrecisionName(coordPrec); 8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_textureSpec.format); 8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::DataType samplerType = glu::TYPE_LAST; 8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::DataType gradType = (m_textureSpec.type == TEXTURETYPE_CUBE_MAP || m_textureSpec.type == TEXTURETYPE_3D) ? glu::TYPE_FLOAT_VEC3 : glu::TYPE_FLOAT_VEC2; 8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* gradTypeName = glu::getDataTypeName(gradType); 8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* baseFuncName = DE_NULL; 8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!isGrad || !hasLodBias); 8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_textureSpec.type) 8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D: samplerType = isShadow ? glu::TYPE_SAMPLER_2D_SHADOW : glu::getSampler2DType(texFmt); break; 8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_CUBE_MAP: samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_SHADOW : glu::getSamplerCubeType(texFmt); break; 8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D_ARRAY: samplerType = isShadow ? glu::TYPE_SAMPLER_2D_ARRAY_SHADOW : glu::getSampler2DArrayType(texFmt); break; 8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_3D: DE_ASSERT(!isShadow); samplerType = glu::getSampler3DType(texFmt); break; 8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_lookupSpec.function) 8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTURE: baseFuncName = "texture"; break; 8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREPROJ: baseFuncName = "textureProj"; break; 8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREPROJ3: baseFuncName = "textureProj"; break; 8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTURELOD: baseFuncName = "textureLod"; break; 8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREPROJLOD: baseFuncName = "textureProjLod"; break; 8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREPROJLOD3: baseFuncName = "textureProjLod"; break; 8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREGRAD: baseFuncName = "textureGrad"; break; 8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREPROJGRAD: baseFuncName = "textureProjGrad"; break; 8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXTUREPROJGRAD3: baseFuncName = "textureProjGrad"; break; 8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case FUNCTION_TEXELFETCH: baseFuncName = "texelFetch"; break; 8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream vert; 8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream frag; 8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream& op = isVtxCase ? vert : frag; 8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "#version 300 es\n" 8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "in highp vec4 a_position;\n" 8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "in " << coordPrecName << " " << coordTypeName << " a_in0;\n"; 8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isGrad) 8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "in " << coordPrecName << " " << gradTypeName << " a_in1;\n"; 8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "in " << coordPrecName << " " << gradTypeName << " a_in2;\n"; 8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (hasLodBias) 8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "in " << coordPrecName << " float a_in1;\n"; 8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "#version 300 es\n" 8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "layout(location = 0) out mediump vec4 o_color;\n"; 8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVtxCase) 8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out mediump vec4 v_color;\n"; 8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in mediump vec4 v_color;\n"; 8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out " << coordPrecName << " " << coordTypeName << " v_texCoord;\n"; 8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in " << coordPrecName << " " << coordTypeName << " v_texCoord;\n"; 8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isGrad) 8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out " << coordPrecName << " " << gradTypeName << " v_gradX;\n"; 8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out " << coordPrecName << " " << gradTypeName << " v_gradY;\n"; 8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in " << coordPrecName << " " << gradTypeName << " v_gradX;\n"; 8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in " << coordPrecName << " " << gradTypeName << " v_gradY;\n"; 8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (hasLodBias) 8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out " << coordPrecName << " float v_lodBias;\n"; 8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in " << coordPrecName << " float v_lodBias;\n"; 8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Uniforms 9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << "uniform highp " << glu::getDataTypeName(samplerType) << " u_sampler;\n" 9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform highp vec4 u_scale;\n" 9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "uniform highp vec4 u_bias;\n"; 9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\nvoid main()\n{\n" 9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = a_position;\n"; 9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "\nvoid main()\n{\n"; 9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVtxCase) 9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\tv_color = "; 9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "\to_color = "; 9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Op. 9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* texCoord = isVtxCase ? "a_in0" : "v_texCoord"; 9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* gradX = isVtxCase ? "a_in1" : "v_gradX"; 9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* gradY = isVtxCase ? "a_in2" : "v_gradY"; 9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* lodBias = isVtxCase ? "a_in1" : "v_lodBias"; 9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << "vec4(" << baseFuncName; 9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_lookupSpec.useOffset) 9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << "Offset"; 9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << "(u_sampler, "; 9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isIntCoord) 9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << "ivec" << (texCoordComps+extraCoordComps) << "("; 9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << texCoord; 9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isIntCoord) 9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ")"; 9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isGrad) 9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", " << gradX << ", " << gradY; 9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (functionHasLod(function)) 9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isIntCoord) 9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", int(" << lodBias << ")"; 9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", " << lodBias; 9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_lookupSpec.useOffset) 9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int offsetComps = m_textureSpec.type == TEXTURETYPE_3D ? 3 : 2; 9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", ivec" << offsetComps << "("; 9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < offsetComps; ndx++) 9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (ndx != 0) 9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", "; 9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << m_lookupSpec.offset[ndx]; 9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ")"; 9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_lookupSpec.useBias) 9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", " << lodBias; 9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ")"; 9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isShadow) 9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ", 0.0, 0.0, 1.0)"; 9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ")*u_scale + u_bias"; 9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry op << ";\n"; 9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isVtxCase) 9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "\to_color = v_color;\n"; 9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\tv_texCoord = a_in0;\n"; 9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isGrad) 9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\tv_gradX = a_in1;\n"; 9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\tv_gradY = a_in2;\n"; 9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (hasLodBias) 9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "\tv_lodBias = a_in1;\n"; 9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "}\n"; 9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "}\n"; 9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_vertShaderSource = vert.str(); 9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_fragShaderSource = frag.str(); 9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderTextureFunctionCase::deinit (void) 9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gls::ShaderRenderCase::deinit(); 9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_texture2D; 9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_textureCube; 10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_texture2DArray; 10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_texture3D; 10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2D = DE_NULL; 10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_textureCube = DE_NULL; 10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture2DArray = DE_NULL; 10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_texture3D = DE_NULL; 10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderTextureFunctionCase::setupUniforms (int programID, const tcu::Vec4&) 10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::Functions& gl = m_renderCtx.getFunctions(); 10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i(gl.getUniformLocation(programID, "u_sampler"), 0); 10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(programID, "u_scale"), 1, m_lookupParams.scale.getPtr()); 10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform4fv(gl.getUniformLocation(programID, "u_bias"), 1, m_lookupParams.bias.getPtr()); 10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureSizeCase : public TestCase 10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureSizeCase (Context& context, const char* name, const char* desc, const char* samplerType, const TextureSpec& texture, bool isVertexCase); 10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~TextureSizeCase (void); 10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void deinit (void); 10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IterateResult iterate (void); 10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry struct TestSize 10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::IVec3 textureSize; 10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int lod; 10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int lodBase; 10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::IVec3 expectedSize; 10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool initShader (void); 10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void freeShader (void); 10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool testTextureSize (const TestSize&); 10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::string genVertexShader (void) const; 10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::string genFragmentShader (void) const; 10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glw::GLenum getGLTextureTarget (void) const; 10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* m_samplerTypeStr; 10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const TextureSpec m_textureSpec; 10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool m_isVertexCase; 10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool m_has3DSize; 10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_program; 10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int m_iterationCounter; 10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10503c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureSizeCase::TextureSizeCase (Context& context, const char* name, const char* desc, const char* samplerType, const TextureSpec& texture, bool isVertexCase) 10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCase (context, name, desc) 10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_samplerTypeStr (samplerType) 10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_textureSpec (texture) 10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_isVertexCase (isVertexCase) 10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_has3DSize (texture.type == TEXTURETYPE_3D || texture.type == TEXTURETYPE_2D_ARRAY) 10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_program (DE_NULL) 10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_iterationCounter(0) 10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10613c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureSizeCase::~TextureSizeCase (void) 10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deinit(); 10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureSizeCase::deinit (void) 10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry freeShader(); 10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10713c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult TextureSizeCase::iterate (void) 10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int currentIteration = m_iterationCounter++; 10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const TestSize testSizes[] = 10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(1, 2, 1), 1, 0, tcu::IVec3(1, 1, 1) }, 10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(1, 2, 1), 0, 0, tcu::IVec3(1, 2, 1) }, 10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(1, 3, 2), 0, 0, tcu::IVec3(1, 3, 2) }, 10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(1, 3, 2), 1, 0, tcu::IVec3(1, 1, 1) }, 10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 0, 0, tcu::IVec3(100, 31, 18) }, 10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 1, 0, tcu::IVec3(50, 15, 9) }, 10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 2, 0, tcu::IVec3(25, 7, 4) }, 10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 3, 0, tcu::IVec3(12, 3, 2) }, 10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 4, 0, tcu::IVec3(6, 1, 1) }, 10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 5, 0, tcu::IVec3(3, 1, 1) }, 10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 6, 0, tcu::IVec3(1, 1, 1) }, 10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 0, 0, tcu::IVec3(100, 128, 32) }, 10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 1, 0, tcu::IVec3(50, 64, 16) }, 10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 2, 0, tcu::IVec3(25, 32, 8) }, 10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 3, 0, tcu::IVec3(12, 16, 4) }, 10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 4, 0, tcu::IVec3(6, 8, 2) }, 10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 5, 0, tcu::IVec3(3, 4, 1) }, 10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 6, 0, tcu::IVec3(1, 2, 1) }, 10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 128, 32), 7, 0, tcu::IVec3(1, 1, 1) }, 10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // pow 2 11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 0, 0, tcu::IVec3(128, 64, 32) }, 11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 1, 0, tcu::IVec3(64, 32, 16) }, 11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 2, 0, tcu::IVec3(32, 16, 8) }, 11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 3, 0, tcu::IVec3(16, 8, 4) }, 11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 4, 0, tcu::IVec3(8, 4, 2) }, 11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 5, 0, tcu::IVec3(4, 2, 1) }, 11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 6, 0, tcu::IVec3(2, 1, 1) }, 11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 7, 0, tcu::IVec3(1, 1, 1) }, 11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // w == h 11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(1, 1, 1), 0, 0, tcu::IVec3(1, 1, 1) }, 11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(64, 64, 64), 0, 0, tcu::IVec3(64, 64, 64) }, 11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(64, 64, 64), 1, 0, tcu::IVec3(32, 32, 32) }, 11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(64, 64, 64), 2, 0, tcu::IVec3(16, 16, 16) }, 11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(64, 64, 64), 3, 0, tcu::IVec3(8, 8, 8) }, 11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(64, 64, 64), 4, 0, tcu::IVec3(4, 4, 4) }, 11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // with lod base 11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(100, 31, 18), 3, 1, tcu::IVec3(6, 1, 1) }, 11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(128, 64, 32), 3, 1, tcu::IVec3(8, 4, 2) }, 11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { tcu::IVec3(64, 64, 64), 1, 1, tcu::IVec3(16, 16, 16) }, 11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int lastIterationIndex = DE_LENGTH_OF_ARRAY(testSizes) + 1; 11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (currentIteration == 0) 11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return initShader() ? CONTINUE : STOP; 11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (currentIteration == lastIterationIndex) 11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry freeShader(); 11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!testTextureSize(testSizes[currentIteration - 1])) 11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_testCtx.getTestResult() != QP_TEST_RESULT_FAIL) 11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got unexpected texture size"); 11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return CONTINUE; 11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool TextureSizeCase::initShader (void) 11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const std::string vertSrc = genVertexShader(); 11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const std::string fragSrc = genFragmentShader(); 11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(m_program == DE_NULL); 11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertSrc, fragSrc)); 11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << *m_program; 11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_program->isOk()) 11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader failed"); 11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return false; 11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return true; 11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureSizeCase::freeShader (void) 11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_program; 11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = DE_NULL; 11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool TextureSizeCase::testTextureSize (const TestSize& testSize) 11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry using tcu::TestLog; 11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::Vec4 triangle[3] = // covers entire viewport 11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4(-1, -1, 0, 1), 11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4( 4, -1, 0, 1), 11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4(-1, 4, 0, 1), 11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::GLint positionLoc = gl.getAttribLocation (m_program->getProgram(), "a_position"); 11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::GLint samplerLoc = gl.getUniformLocation (m_program->getProgram(), "u_sampler"); 11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::GLint sizeLoc = gl.getUniformLocation (m_program->getProgram(), "u_texSize"); 11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::GLint lodLoc = gl.getUniformLocation (m_program->getProgram(), "u_lod"); 11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::GLenum textureTarget = getGLTextureTarget (); 11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isSquare = testSize.textureSize.x() == testSize.textureSize.y(); 11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool is2DLodValid = (testSize.textureSize.x() >> (testSize.lod + testSize.lodBase)) != 0 || (testSize.textureSize.y() >> (testSize.lod + testSize.lodBase)) != 0; 11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool success = true; 11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glw::GLenum errorValue; 11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Skip incompatible cases 11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_textureSpec.type == TEXTURETYPE_CUBE_MAP && !isSquare) 11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return true; 11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_textureSpec.type == TEXTURETYPE_2D && !is2DLodValid) 11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return true; 11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_textureSpec.type == TEXTURETYPE_2D_ARRAY && !is2DLodValid) 11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return true; 11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // setup rendering 12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.useProgram (m_program->getProgram()); 12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1i (samplerLoc, 0); 12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.clearColor (0.5f, 0.5f, 0.5f, 1.0f); 12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.viewport (0, 0, 1, 1); 12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.vertexAttribPointer (positionLoc, 4, GL_FLOAT, GL_FALSE, 0, triangle); 12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.enableVertexAttribArray (positionLoc); 12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // setup texture 12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int maxLevel = testSize.lod + testSize.lodBase; 12113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int levels = maxLevel + 1; 12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glw::GLuint texId = 0; 12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // gen texture 12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.genTextures(1, &texId); 12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindTexture(textureTarget, texId); 12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.texParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.texParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.texParameteri(textureTarget, GL_TEXTURE_BASE_LEVEL, testSize.lodBase); 12203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // set up texture 12223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_textureSpec.type) 12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_3D: 12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Testing image size " << testSize.textureSize.x() << "x" << testSize.textureSize.y() << "x" << testSize.textureSize.z() << TestLog::EndMessage; 12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Lod: " << testSize.lod << ", base level: " << testSize.lodBase << TestLog::EndMessage; 12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Expecting: " << testSize.expectedSize.x() << "x" << testSize.expectedSize.y() << "x" << testSize.expectedSize.z() << TestLog::EndMessage; 12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform3iv(sizeLoc, 1, testSize.expectedSize.m_data); 12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1iv(lodLoc, 1, &testSize.lod); 12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.texStorage3D(textureTarget, levels, m_textureSpec.format, testSize.textureSize.x(), testSize.textureSize.y(), testSize.textureSize.z()); 12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D: 12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_CUBE_MAP: 12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Testing image size " << testSize.textureSize.x() << "x" << testSize.textureSize.y() << TestLog::EndMessage; 12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Lod: " << testSize.lod << ", base level: " << testSize.lodBase << TestLog::EndMessage; 12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Expecting: " << testSize.expectedSize.x() << "x" << testSize.expectedSize.y() << TestLog::EndMessage; 12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform2iv(sizeLoc, 1, testSize.expectedSize.m_data); 12463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1iv(lodLoc, 1, &testSize.lod); 12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.texStorage2D(textureTarget, levels, m_textureSpec.format, testSize.textureSize.x(), testSize.textureSize.y()); 12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D_ARRAY: 12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::IVec3 expectedSize(testSize.expectedSize.x(), testSize.expectedSize.y(), testSize.textureSize.z()); 12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Testing image size " << testSize.textureSize.x() << "x" << testSize.textureSize.y() << " with " << testSize.textureSize.z() << " layer(s)" << TestLog::EndMessage; 12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Lod: " << testSize.lod << ", base level: " << testSize.lodBase << TestLog::EndMessage; 12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Expecting: " << testSize.expectedSize.x() << "x" << testSize.expectedSize.y() << " and " << testSize.textureSize.z() << " layer(s)" << TestLog::EndMessage; 12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform3iv(sizeLoc, 1, expectedSize.m_data); 12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.uniform1iv(lodLoc, 1, &testSize.lod); 12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.texStorage3D(textureTarget, levels, m_textureSpec.format, testSize.textureSize.x(), testSize.textureSize.y(), testSize.textureSize.z()); 12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry errorValue = gl.getError(); 12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (errorValue == GL_OUT_OF_MEMORY) 12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw glu::OutOfMemoryError("Failed to allocate texture, got GL_OUT_OF_MEMORY.", "TexStorageXD", __FILE__, __LINE__); 12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (errorValue != GL_NO_ERROR) 12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // error is a failure too 12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << tcu::TestLog::Message << "Failed, got " << glu::getErrorStr(errorValue) << "." << tcu::TestLog::EndMessage; 12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry success = false; 12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // test 12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float colorTolerance = 0.1f; 12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TextureLevel sample (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1, 1); 12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Vec4 outputColor; 12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.clear (GL_COLOR_BUFFER_BIT); 12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.drawArrays (GL_TRIANGLES, 0, 3); 12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.finish (); 12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels (m_context.getRenderContext(), 0, 0, sample.getAccess()); 12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry outputColor = sample.getAccess().getPixel(0, 0); 12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (outputColor.x() >= 1.0f - colorTolerance && 13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry outputColor.y() >= 1.0f - colorTolerance && 13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry outputColor.z() >= 1.0f - colorTolerance) 13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // success 13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Passed" << TestLog::EndMessage; 13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // failure 13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << "Failed" << TestLog::EndMessage; 13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry success = false; 13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // empty line to format log nicely 13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().getLog() << TestLog::Message << TestLog::EndMessage; 13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // free 13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindTexture (textureTarget, 0); 13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.deleteTextures (1, &texId); 13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.useProgram(0); 13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return success; 13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::string TextureSizeCase::genVertexShader() const 13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream vert; 13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "#version 300 es\n" 13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "in highp vec4 a_position;\n"; 13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_isVertexCase) 13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "out mediump vec4 v_color;\n"; 13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "uniform highp " << m_samplerTypeStr << " u_sampler;\n"; 13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "uniform highp ivec" << (m_has3DSize ? 3 : 2) << " u_texSize;\n"; 13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "uniform highp int u_lod;\n"; 13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << "void main()\n{\n"; 13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_isVertexCase) 13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << " v_color = (textureSize(u_sampler, u_lod) == u_texSize ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 1.0));\n"; 13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vert << " gl_Position = a_position;\n" 13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}\n"; 13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return vert.str(); 13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::string TextureSizeCase::genFragmentShader() const 13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::ostringstream frag; 13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "#version 300 es\n" 13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "layout(location = 0) out mediump vec4 o_color;\n"; 13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_isVertexCase) 13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "in mediump vec4 v_color;\n"; 13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_isVertexCase) 13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "uniform highp " << m_samplerTypeStr << " u_sampler;\n"; 13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "uniform highp ivec" << (m_has3DSize ? 3 : 2) << " u_texSize;\n"; 13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "uniform highp int u_lod;\n"; 13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "void main()\n{\n"; 13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_isVertexCase) 13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << " o_color = (textureSize(u_sampler, u_lod) == u_texSize ? vec4(1.0, 1.0, 1.0, 1.0) : vec4(0.0, 0.0, 0.0, 1.0));\n"; 13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << " o_color = v_color;\n"; 13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry frag << "}\n"; 13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return frag.str(); 13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglw::GLenum TextureSizeCase::getGLTextureTarget() const 13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_textureSpec.type) 13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D: return GL_TEXTURE_2D; break; 13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_CUBE_MAP: return GL_TEXTURE_CUBE_MAP; break; 13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_2D_ARRAY: return GL_TEXTURE_2D_ARRAY; break; 13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case TEXTURETYPE_3D: return GL_TEXTURE_3D; break; 13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: DE_ASSERT(DE_FALSE); break; 13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return 0; 13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderTextureFunctionTests::ShaderTextureFunctionTests (Context& context) 13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "texture_functions", "Texture Access Function Tests") 13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14013c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderTextureFunctionTests::~ShaderTextureFunctionTests (void) 14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum CaseFlags 14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VERTEX = (1<<0), 14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry FRAGMENT = (1<<1), 14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BOTH = VERTEX|FRAGMENT 14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct TexFuncCaseSpec 14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name; 14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLookupSpec lookupSpec; 14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureSpec texSpec; 14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TexEvalFunc evalFunc; 14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 flags; 14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD, USEOFFSET, OFFSET, TEXSPEC, EVALFUNC, FLAGS) \ 14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { #NAME, TextureLookupSpec(FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD, tcu::Vec3(0.0f), tcu::Vec3(0.0f), tcu::Vec3(0.0f), tcu::Vec3(0.0f), USEOFFSET, OFFSET), TEXSPEC, EVALFUNC, FLAGS } 14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define GRAD_CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, MINDX, MAXDX, MINDY, MAXDY, USEOFFSET, OFFSET, TEXSPEC, EVALFUNC, FLAGS) \ 14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { #NAME, TextureLookupSpec(FUNC, MINCOORD, MAXCOORD, false, 0.0f, 0.0f, MINDX, MAXDX, MINDY, MAXDY, USEOFFSET, OFFSET), TEXSPEC, EVALFUNC, FLAGS } 14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void createCaseGroup (TestCaseGroup* parent, const char* groupName, const char* groupDesc, const TexFuncCaseSpec* cases, int numCases) 14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* group = new tcu::TestCaseGroup(parent->getTestContext(), groupName, groupDesc); 14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry parent->addChild(group); 14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < numCases; ndx++) 14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::string name = cases[ndx].name; 14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (cases[ndx].flags & VERTEX) 14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new ShaderTextureFunctionCase(parent->getContext(), (name + "_vertex").c_str(), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, true)); 14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (cases[ndx].flags & FRAGMENT) 14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new ShaderTextureFunctionCase(parent->getContext(), (name + "_fragment").c_str(), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, false)); 14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderTextureFunctionTests::init (void) 14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Samplers 14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerNearestNoMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::NEAREST, tcu::Sampler::NEAREST, 14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerLinearNoMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::LINEAR, tcu::Sampler::LINEAR, 14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerNearestMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST, 14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerLinearMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::LINEAR_MIPMAP_NEAREST, tcu::Sampler::LINEAR, 14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerShadowNoMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::NEAREST, tcu::Sampler::NEAREST, 14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_LESS, 14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerShadowMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST, 14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_LESS, 14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const tcu::Sampler samplerTexelFetch (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST, 14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f /* LOD threshold */, false /* non-normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Default textures. 14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Type Format W H D L Sampler 14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DFixed (TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 1, samplerLinearNoMipmap); 14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DFloat (TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 1, samplerLinearNoMipmap); 14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DInt (TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 1, samplerNearestNoMipmap); 14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DUint (TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 1, samplerNearestNoMipmap); 14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DMipmapFixed (TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 9, samplerLinearMipmap); 14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DMipmapFloat (TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 9, samplerLinearMipmap); 14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DMipmapInt (TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 9, samplerNearestMipmap); 14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DMipmapUint (TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 9, samplerNearestMipmap); 14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DShadow (TEXTURETYPE_2D, GL_DEPTH_COMPONENT16, 256, 256, 1, 9, samplerShadowNoMipmap); 14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DMipmapShadow (TEXTURETYPE_2D, GL_DEPTH_COMPONENT16, 256, 256, 1, 9, samplerShadowMipmap); 14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DTexelFetchFixed (TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 9, samplerTexelFetch); 14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DTexelFetchFloat (TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 9, samplerTexelFetch); 14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DTexelFetchInt (TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 9, samplerTexelFetch); 14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DTexelFetchUint (TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 9, samplerTexelFetch); 14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeFixed (TEXTURETYPE_CUBE_MAP, GL_RGBA8, 256, 256, 1, 1, samplerLinearNoMipmap); 14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeFloat (TEXTURETYPE_CUBE_MAP, GL_RGBA16F, 256, 256, 1, 1, samplerLinearNoMipmap); 14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeInt (TEXTURETYPE_CUBE_MAP, GL_RGBA8I, 256, 256, 1, 1, samplerNearestNoMipmap); 14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeUint (TEXTURETYPE_CUBE_MAP, GL_RGBA8UI, 256, 256, 1, 1, samplerNearestNoMipmap); 14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeMipmapFixed (TEXTURETYPE_CUBE_MAP, GL_RGBA8, 256, 256, 1, 9, samplerLinearMipmap); 14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeMipmapFloat (TEXTURETYPE_CUBE_MAP, GL_RGBA16F, 128, 128, 1, 8, samplerLinearMipmap); 15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeMipmapInt (TEXTURETYPE_CUBE_MAP, GL_RGBA8I, 256, 256, 1, 9, samplerNearestMipmap); 15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeMipmapUint (TEXTURETYPE_CUBE_MAP, GL_RGBA8UI, 256, 256, 1, 9, samplerNearestMipmap); 15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeShadow (TEXTURETYPE_CUBE_MAP, GL_DEPTH_COMPONENT16, 256, 256, 1, 1, samplerShadowNoMipmap); 15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec texCubeMipmapShadow (TEXTURETYPE_CUBE_MAP, GL_DEPTH_COMPONENT16, 256, 256, 1, 9, samplerShadowMipmap); 15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayFixed (TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 1, samplerLinearNoMipmap); 15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayFloat (TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 1, samplerLinearNoMipmap); 15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayInt (TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 1, samplerNearestNoMipmap); 15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayUint (TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 1, samplerNearestNoMipmap); 15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayMipmapFixed (TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 8, samplerLinearMipmap); 15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayMipmapFloat (TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 8, samplerLinearMipmap); 15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayMipmapInt (TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 8, samplerNearestMipmap); 15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayMipmapUint (TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 8, samplerNearestMipmap); 15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayShadow (TEXTURETYPE_2D_ARRAY, GL_DEPTH_COMPONENT16, 128, 128, 4, 1, samplerShadowNoMipmap); 15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayMipmapShadow (TEXTURETYPE_2D_ARRAY, GL_DEPTH_COMPONENT16, 128, 128, 4, 8, samplerShadowMipmap); 15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayTexelFetchFixed (TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 8, samplerTexelFetch); 15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayTexelFetchFloat (TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 8, samplerTexelFetch); 15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayTexelFetchInt (TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 8, samplerTexelFetch); 15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex2DArrayTexelFetchUint (TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 8, samplerTexelFetch); 15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DFixed (TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 1, samplerLinearNoMipmap); 15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DFloat (TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 1, samplerLinearNoMipmap); 15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DInt (TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 1, samplerNearestNoMipmap); 15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DUint (TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 1, samplerNearestNoMipmap); 15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DMipmapFixed (TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 7, samplerLinearMipmap); 15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DMipmapFloat (TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 7, samplerLinearMipmap); 15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DMipmapInt (TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 7, samplerNearestMipmap); 15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DMipmapUint (TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 7, samplerNearestMipmap); 15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DTexelFetchFixed (TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 7, samplerTexelFetch); 15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DTexelFetchFloat (TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 7, samplerTexelFetch); 15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DTexelFetchInt (TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 7, samplerTexelFetch); 15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TextureSpec tex3DTexelFetchUint (TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 7, samplerTexelFetch); 15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // texture() cases 15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureCases[] = 15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFixed, evalTexture2D, VERTEX), 15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2D, FRAGMENT), 15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFloat, evalTexture2D, VERTEX), 15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2D, FRAGMENT), 15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DInt, evalTexture2D, VERTEX), 15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2D, FRAGMENT), 15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DUint, evalTexture2D, VERTEX), 15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2D, FRAGMENT), 15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_bias_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DBias, FRAGMENT), 15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_bias_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DBias, FRAGMENT), 15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DBias, FRAGMENT), 15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DBias, FRAGMENT), 15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_fixed, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeFixed, evalTextureCube, VERTEX), 15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_fixed, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapFixed, evalTextureCube, FRAGMENT), 15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_float, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeFloat, evalTextureCube, VERTEX), 15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_float, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapFloat, evalTextureCube, FRAGMENT), 15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeInt, evalTextureCube, VERTEX), 15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapInt, evalTextureCube, FRAGMENT), 15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeUint, evalTextureCube, VERTEX), 15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usamplercube, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapUint, evalTextureCube, FRAGMENT), 15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapFixed, evalTextureCubeBias, FRAGMENT), 15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_bias_float, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapFloat, evalTextureCubeBias, FRAGMENT), 15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isamplercube_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapInt, evalTextureCubeBias, FRAGMENT), 15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usamplercube_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapUint, evalTextureCubeBias, FRAGMENT), 15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayFixed, evalTexture2DArray, VERTEX), 15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapFixed, evalTexture2DArray, FRAGMENT), 15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayFloat, evalTexture2DArray, VERTEX), 15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapFloat, evalTexture2DArray, FRAGMENT), 15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayInt, evalTexture2DArray, VERTEX), 15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArray, FRAGMENT), 15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayUint, evalTexture2DArray, VERTEX), 15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArray, FRAGMENT), 15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapFixed, evalTexture2DArrayBias, FRAGMENT), 15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapFloat, evalTexture2DArrayBias, FRAGMENT), 15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArrayBias, FRAGMENT), 15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArrayBias, FRAGMENT), 15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DFixed, evalTexture3D, VERTEX), 15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3D, FRAGMENT), 15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DFloat, evalTexture3D, VERTEX), 15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3D, FRAGMENT), 15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DInt, evalTexture3D, VERTEX), 15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3D, FRAGMENT), 15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DUint, evalTexture3D, VERTEX), 15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3D, FRAGMENT), 15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DBias, FRAGMENT), 15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DBias, FRAGMENT), 15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DBias, FRAGMENT), 15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DBias, FRAGMENT), 15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DShadow, evalTexture2DShadow, VERTEX), 15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadow, FRAGMENT), 15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowBias, FRAGMENT), 16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercubeshadow, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 1.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeShadow, evalTextureCubeShadow, VERTEX), 16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercubeshadow, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 1.0f), false, 0.0f, 0.0f, false, IVec3(0), texCubeMipmapShadow, evalTextureCubeShadow, FRAGMENT), 16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercubeshadow_bias, FUNCTION_TEXTURE, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 1.0f), true, -2.0f, 2.0f, false, IVec3(0), texCubeMipmapShadow, evalTextureCubeShadowBias, FRAGMENT), 16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayShadow, evalTexture2DArrayShadow, VERTEX), 16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayMipmapShadow, evalTexture2DArrayShadow, FRAGMENT) 16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Not in spec. 16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// CASE_SPEC(sampler2darrayshadow_bias, (FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), true, -2.0f, 2.0f, Vec2(0.0f), Vec2(0.0f), false, IVec3(0)), tex2DArrayMipmapShadow, evalTexture2DArrayShadowBias, FRAGMENT) 16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texture", "texture() Tests", textureCases, DE_LENGTH_OF_ARRAY(textureCases)); 16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureOffset() cases 16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note _bias variants are not using mipmap thanks to wide allowed range for LOD computation 16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureOffsetCases[] = 16163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 16173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 16183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DOffset, VERTEX), 16193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFixed, evalTexture2DOffset, FRAGMENT), 16203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFloat, evalTexture2DOffset, VERTEX), 16213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DOffset, FRAGMENT), 16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DOffset, VERTEX), 16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapInt, evalTexture2DOffset, FRAGMENT), 16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DUint, evalTexture2DOffset, VERTEX), 16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DOffset, FRAGMENT), 16263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_bias_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DOffsetBias, FRAGMENT), 16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_bias_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DFloat, evalTexture2DOffsetBias, FRAGMENT), 16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DOffsetBias, FRAGMENT), 16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DUint, evalTexture2DOffsetBias, FRAGMENT), 16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayFixed, evalTexture2DArrayOffset, VERTEX), 16333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapFixed, evalTexture2DArrayOffset, FRAGMENT), 16343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayFloat, evalTexture2DArrayOffset, VERTEX), 16353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapFloat, evalTexture2DArrayOffset, FRAGMENT), 16363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayInt, evalTexture2DArrayOffset, VERTEX), 16373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapInt, evalTexture2DArrayOffset, FRAGMENT), 16383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayUint, evalTexture2DArrayOffset, VERTEX), 16393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapUint, evalTexture2DArrayOffset, FRAGMENT), 16403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DArrayFixed, evalTexture2DArrayOffsetBias, FRAGMENT), 16423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DArrayFloat, evalTexture2DArrayOffsetBias, FRAGMENT), 16433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DArrayInt, evalTexture2DArrayOffsetBias, FRAGMENT), 16443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DArrayUint, evalTexture2DArrayOffsetBias, FRAGMENT), 16453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DOffset, VERTEX), 16473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapFixed, evalTexture3DOffset, FRAGMENT), 16483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DFloat, evalTexture3DOffset, VERTEX), 16493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DMipmapFloat, evalTexture3DOffset, FRAGMENT), 16503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DInt, evalTexture3DOffset, VERTEX), 16513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DOffset, FRAGMENT), 16523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DOffset, VERTEX), 16533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DOffset, FRAGMENT), 16543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 1.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DOffsetBias, FRAGMENT), 16563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 1.0f, true, IVec3(7, 3, -8), tex3DFloat, evalTexture3DOffsetBias, FRAGMENT), 16573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 2.0f, true, IVec3(3, -8, 7), tex3DInt, evalTexture3DOffsetBias, FRAGMENT), 16583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d_bias, FUNCTION_TEXTURE, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DOffsetBias, FRAGMENT), 16593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowOffset, VERTEX), 16613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapShadow, evalTexture2DShadowOffset, FRAGMENT), 16623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTURE, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowOffsetBias, FRAGMENT) 16633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 16643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureoffset", "textureOffset() Tests", textureOffsetCases, DE_LENGTH_OF_ARRAY(textureOffsetCases)); 16653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureProj() cases 16673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Currently uses constant divider! 16683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureProjCases[] = 16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFixed, evalTexture2DProj3, VERTEX), 16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DProj3, FRAGMENT), 16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFloat, evalTexture2DProj3, VERTEX), 16743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DProj3, FRAGMENT), 16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DInt, evalTexture2DProj3, VERTEX), 16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProj3, FRAGMENT), 16773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DUint, evalTexture2DProj3, VERTEX), 16783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProj3, FRAGMENT), 16793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_bias_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DProj3Bias, FRAGMENT), 16813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_bias_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DProj3Bias, FRAGMENT), 16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProj3Bias, FRAGMENT), 16833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProj3Bias, FRAGMENT), 16843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFixed, evalTexture2DProj, VERTEX), 16863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DProj, FRAGMENT), 16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DFloat, evalTexture2DProj, VERTEX), 16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DProj, FRAGMENT), 16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DInt, evalTexture2DProj, VERTEX), 16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProj, FRAGMENT), 16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DUint, evalTexture2DProj, VERTEX), 16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProj, FRAGMENT), 16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DProjBias, FRAGMENT), 16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_bias_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DProjBias, FRAGMENT), 16963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProjBias, FRAGMENT), 16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProjBias, FRAGMENT), 16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DFixed, evalTexture3DProj, VERTEX), 17003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DProj, FRAGMENT), 17013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DFloat, evalTexture3DProj, VERTEX), 17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DProj, FRAGMENT), 17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DInt, evalTexture3DProj, VERTEX), 17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DProj, FRAGMENT), 17053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DUint, evalTexture3DProj, VERTEX), 17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DProj, FRAGMENT), 17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DProjBias, FRAGMENT), 17093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 1.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DProjBias, FRAGMENT), 17103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DProjBias, FRAGMENT), 17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DProjBias, FRAGMENT), 17123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DShadow, evalTexture2DShadowProj, VERTEX), 17143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, 0.0f, 0.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowProj, FRAGMENT), 17153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTUREPROJ, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), true, -2.0f, 2.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowProjBias, FRAGMENT) 17163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 17173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureproj", "textureProj() Tests", textureProjCases, DE_LENGTH_OF_ARRAY(textureProjCases)); 17183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureProjOffset() cases 17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Currently uses constant divider! 17213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureProjOffsetCases[] = 17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DProj3Offset, VERTEX), 17253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFixed, evalTexture2DProj3Offset, FRAGMENT), 17263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFloat, evalTexture2DProj3Offset, VERTEX), 17273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DProj3Offset, FRAGMENT), 17283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DProj3Offset, VERTEX), 17293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapInt, evalTexture2DProj3Offset, FRAGMENT), 17303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DUint, evalTexture2DProj3Offset, VERTEX), 17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProj3Offset, FRAGMENT), 17323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_bias_fixed, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DProj3OffsetBias, FRAGMENT), 17343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_bias_float, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DFloat, evalTexture2DProj3OffsetBias, FRAGMENT), 17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DProj3OffsetBias, FRAGMENT), 17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3_bias, FUNCTION_TEXTUREPROJ3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DUint, evalTexture2DProj3OffsetBias, FRAGMENT), 17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DProjOffset, VERTEX), 17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFixed, evalTexture2DProjOffset, FRAGMENT), 17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DFloat, evalTexture2DProjOffset, VERTEX), 17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DProjOffset, FRAGMENT), 17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DProjOffset, VERTEX), 17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapInt, evalTexture2DProjOffset, FRAGMENT), 17443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DUint, evalTexture2DProjOffset, VERTEX), 17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProjOffset, FRAGMENT), 17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DFixed, evalTexture2DProjOffsetBias, FRAGMENT), 17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_bias_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DFloat, evalTexture2DProjOffsetBias, FRAGMENT), 17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DInt, evalTexture2DProjOffsetBias, FRAGMENT), 17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4_bias, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), true, -2.0f, 2.0f, true, IVec3(7, -8, 0), tex2DUint, evalTexture2DProjOffsetBias, FRAGMENT), 17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DProjOffset, VERTEX), 17533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapFixed, evalTexture3DProjOffset, FRAGMENT), 17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DFloat, evalTexture3DProjOffset, VERTEX), 17553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DMipmapFloat, evalTexture3DProjOffset, FRAGMENT), 17563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DInt, evalTexture3DProjOffset, VERTEX), 17573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DProjOffset, FRAGMENT), 17583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DProjOffset, VERTEX), 17593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DProjOffset, FRAGMENT), 17603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_fixed, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DProjOffsetBias, FRAGMENT), 17623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_bias_float, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(7, 3, -8), tex3DFloat, evalTexture3DProjOffsetBias, FRAGMENT), 17633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(3, -8, 7), tex3DInt, evalTexture3DProjOffsetBias, FRAGMENT), 17643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d_bias, FUNCTION_TEXTUREPROJ, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DProjOffsetBias, FRAGMENT), 17653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowProjOffset, VERTEX), 17673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJ, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, -8, 0), tex2DMipmapShadow, evalTexture2DShadowProjOffset, FRAGMENT), 17683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow_bias, FUNCTION_TEXTUREPROJ, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), true, -2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DShadow, evalTexture2DShadowProjOffsetBias, FRAGMENT) 17693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 17703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureprojoffset", "textureOffsetProj() Tests", textureProjOffsetCases, DE_LENGTH_OF_ARRAY(textureProjOffsetCases)); 17713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureLod() cases 17733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureLodCases[] = 17743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 17753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 17763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DLod, BOTH), 17773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DLod, BOTH), 17783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DLod, BOTH), 17793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DLod, BOTH), 17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_fixed, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapFixed, evalTextureCubeLod, BOTH), 17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(samplercube_float, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapFloat, evalTextureCubeLod, BOTH), 17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isamplercube, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapInt, evalTextureCubeLod, BOTH), 17843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usamplercube, FUNCTION_TEXTURELOD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), texCubeMipmapUint, evalTextureCubeLod, BOTH), 17853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapFixed, evalTexture2DArrayLod, BOTH), 17873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapFloat, evalTexture2DArrayLod, BOTH), 17883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArrayLod, BOTH), 17893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArrayLod, BOTH), 17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DLod, BOTH), 17923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DLod, BOTH), 17933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DLod, BOTH), 17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DLod, BOTH), 17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowLod, BOTH) 17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texturelod", "textureLod() Tests", textureLodCases, DE_LENGTH_OF_ARRAY(textureLodCases)); 17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureLodOffset() cases 18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureLodOffsetCases[] = 18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DLodOffset, BOTH), 18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DLodOffset, BOTH), 18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DLodOffset, BOTH), 18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DLodOffset, BOTH), 18083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, true, IVec3(-8, 7, 0), tex2DArrayMipmapFixed, evalTexture2DArrayLodOffset, BOTH), 18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapFloat, evalTexture2DArrayLodOffset, BOTH), 18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, true, IVec3(-8, 7, 0), tex2DArrayMipmapInt, evalTexture2DArrayLodOffset, BOTH), 18123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXTURELOD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), false, -1.0f, 8.0f, true, IVec3(7, -8, 0), tex2DArrayMipmapUint, evalTexture2DArrayLodOffset, BOTH), 18133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapFixed, evalTexture3DLodOffset, BOTH), 18153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, true, IVec3(7, 3, -8), tex3DMipmapFloat, evalTexture3DLodOffset, BOTH), 18163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DLodOffset, BOTH), 18173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTURELOD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapUint, evalTexture3DLodOffset, BOTH), 18183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTURELOD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapShadow, evalTexture2DShadowLodOffset, BOTH) 18203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 18213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texturelodoffset", "textureLodOffset() Tests", textureLodOffsetCases, DE_LENGTH_OF_ARRAY(textureLodOffsetCases)); 18223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureProjLod() cases 18243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureProjLodCases[] = 18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 18273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DProjLod3, BOTH), 18283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DProjLod3, BOTH), 18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProjLod3, BOTH), 18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProjLod3, BOTH), 18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFixed, evalTexture2DProjLod, BOTH), 18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapFloat, evalTexture2DProjLod, BOTH), 18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapInt, evalTexture2DProjLod, BOTH), 18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapUint, evalTexture2DProjLod, BOTH), 18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFixed, evalTexture3DProjLod, BOTH), 18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapFloat, evalTexture3DProjLod, BOTH), 18393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapInt, evalTexture3DProjLod, BOTH), 18403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, false, IVec3(0), tex3DMipmapUint, evalTexture3DProjLod, BOTH), 18413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJLOD, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, -1.0f, 9.0f, false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowProjLod, BOTH) 18433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 18443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureprojlod", "textureProjLod() Tests", textureProjLodCases, DE_LENGTH_OF_ARRAY(textureProjLodCases)); 18453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureProjLodOffset() cases 18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureProjLodOffsetCases[] = 18483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DProjLod3Offset, BOTH), 18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DProjLod3Offset, BOTH), 18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DProjLod3Offset, BOTH), 18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJLOD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProjLod3Offset, BOTH), 18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DProjLodOffset, BOTH), 18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DProjLodOffset, BOTH), 18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DProjLodOffset, BOTH), 18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJLOD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), false, -1.0f, 9.0f, true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProjLodOffset, BOTH), 18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapFixed, evalTexture3DProjLodOffset, BOTH), 18613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(7, 3, -8), tex3DMipmapFloat, evalTexture3DProjLodOffset, BOTH), 18623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DProjLodOffset, BOTH), 18633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJLOD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), false, -1.0f, 7.0f, true, IVec3(-8, 7, 3), tex3DMipmapUint, evalTexture3DProjLodOffset, BOTH), 18643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJLOD, Vec4( 0.2f, 0.6f, 0.0f, 1.5f), Vec4(-2.25f, -3.45f, 1.5f, 1.5f), false, -1.0f, 9.0f, true, IVec3(-8, 7, 0), tex2DMipmapShadow, evalTexture2DShadowProjLodOffset, BOTH) 18663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 18673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureprojlodoffset", "textureProjLodOffset() Tests", textureProjLodOffsetCases, DE_LENGTH_OF_ARRAY(textureProjLodOffsetCases)); 18683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureGrad() cases 18703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Only one of dudx, dudy, dvdx, dvdy is non-zero since spec allows approximating p from derivates by various methods. 18713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureGradCases[] = 18723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 18733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 18743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFixed, evalTexture2DGrad, BOTH), 18753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_float, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFloat, evalTexture2DGrad, BOTH), 18763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapInt, evalTexture2DGrad, BOTH), 18773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DMipmapUint, evalTexture2DGrad, BOTH), 18783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(samplercube_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapFixed, evalTextureCubeGrad, BOTH), 18803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(samplercube_float, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapFloat, evalTextureCubeGrad, BOTH), 18813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isamplercube, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapInt, evalTextureCubeGrad, BOTH), 18823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usamplercube, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, -1.01f, 0.0f), Vec4( 1.0f, 1.0f, -1.01f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), texCubeMipmapUint, evalTextureCubeGrad, BOTH), 18833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapFixed, evalTexture2DArrayGrad, BOTH), 18853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darray_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapFloat, evalTexture2DArrayGrad, BOTH), 18863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapInt, evalTexture2DArrayGrad, BOTH), 18873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DArrayMipmapUint, evalTexture2DArrayGrad, BOTH), 18883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFixed, evalTexture3DGrad, BOTH), 18903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat, evalTexture3DGrad, VERTEX), 18913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.2f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat, evalTexture3DGrad, FRAGMENT), 18923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapInt, evalTexture3DGrad, BOTH), 18933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), tex3DMipmapUint, evalTexture3DGrad, VERTEX), 18943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, -0.2f), false, IVec3(0), tex3DMipmapUint, evalTexture3DGrad, FRAGMENT), 18953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 18963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowGrad, BOTH), 18973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(samplercubeshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.0f, -1.0f, 1.01f, 0.0f), Vec4( 1.0f, 1.0f, 1.01f, 1.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), texCubeMipmapShadow, evalTextureCubeShadowGrad, BOTH), 18983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DArrayMipmapShadow, evalTexture2DArrayShadowGrad, VERTEX), 18993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), false, IVec3(0), tex2DArrayMipmapShadow, evalTexture2DArrayShadowGrad, FRAGMENT) 19003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 19013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texturegrad", "textureGrad() Tests", textureGradCases, DE_LENGTH_OF_ARRAY(textureGradCases)); 19023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureGradOffset() cases 19043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureGradOffsetCases[] = 19053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 19063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 19073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DGradOffset, BOTH), 19083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_float, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DGradOffset, BOTH), 19093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DGradOffset, BOTH), 19103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2d, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DGradOffset, BOTH), 19113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DArrayMipmapFixed, evalTexture2DArrayGradOffset, BOTH), 19133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darray_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DArrayMipmapFloat, evalTexture2DArrayGradOffset, BOTH), 19143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DArrayMipmapInt, evalTexture2DArrayGradOffset, BOTH), 19153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2darray, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DArrayMipmapUint, evalTexture2DArrayGradOffset, BOTH), 19163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapFixed, evalTexture3DGradOffset, BOTH), 19183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapFloat, evalTexture3DGradOffset, VERTEX), 19193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.2f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(3, -8, 7), tex3DMipmapFloat, evalTexture3DGradOffset, FRAGMENT), 19203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapInt, evalTexture3DGradOffset, BOTH), 19213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DGradOffset, VERTEX), 19223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -1.4f, 0.1f, 0.0f), Vec4( 1.5f, 2.3f, 2.3f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, -0.2f), true, IVec3(3, -8, 7), tex3DMipmapUint, evalTexture3DGradOffset, FRAGMENT), 19233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapShadow, evalTexture2DShadowGradOffset, VERTEX), 19253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREGRAD, Vec4(-0.2f, -0.4f, 0.0f, 0.0f), Vec4( 1.5f, 2.3f, 1.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapShadow, evalTexture2DShadowGradOffset, FRAGMENT), 19263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DArrayMipmapShadow, evalTexture2DArrayShadowGradOffset, VERTEX), 19273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2darrayshadow, FUNCTION_TEXTUREGRAD, Vec4(-1.2f, -0.4f, -0.5f, 0.0f), Vec4( 1.5f, 2.3f, 3.5f, 1.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DArrayMipmapShadow, evalTexture2DArrayShadowGradOffset, FRAGMENT) 19283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 19293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texturegradoffset", "textureGradOffset() Tests", textureGradOffsetCases, DE_LENGTH_OF_ARRAY(textureGradOffsetCases)); 19303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureProjGrad() cases 19323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureProjGradCases[] = 19333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 19343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 19353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFixed, evalTexture2DProjGrad3, BOTH), 19363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFloat, evalTexture2DProjGrad3, BOTH), 19373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapInt, evalTexture2DProjGrad3, BOTH), 19383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DMipmapUint, evalTexture2DProjGrad3, BOTH), 19393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFixed, evalTexture2DProjGrad, BOTH), 19413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapFloat, evalTexture2DProjGrad, BOTH), 19423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapInt, evalTexture2DProjGrad, BOTH), 19433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), tex2DMipmapUint, evalTexture2DProjGrad, BOTH), 19443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFixed, evalTexture3DProjGrad, BOTH), 19463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat, evalTexture3DProjGrad, VERTEX), 19473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.2f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapFloat, evalTexture3DProjGrad, FRAGMENT), 19483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), false, IVec3(0), tex3DMipmapInt, evalTexture3DProjGrad, BOTH), 19493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), false, IVec3(0), tex3DMipmapUint, evalTexture3DProjGrad, VERTEX), 19503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, -0.2f), false, IVec3(0), tex3DMipmapUint, evalTexture3DProjGrad, FRAGMENT), 19513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4( 0.2f, 0.6f, 0.0f, -1.5f), Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowProjGrad, VERTEX), 19533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4( 0.2f, 0.6f, 0.0f, -1.5f), Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), false, IVec3(0), tex2DMipmapShadow, evalTexture2DShadowProjGrad, FRAGMENT) 19543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 19553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureprojgrad", "textureProjGrad() Tests", textureProjGradCases, DE_LENGTH_OF_ARRAY(textureProjGradCases)); 19563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureProjGradOffset() cases 19583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec textureProjGradOffsetCases[] = 19593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 19603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 19613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec3_fixed, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DProjGrad3Offset, BOTH), 19623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec3_float, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DProjGrad3Offset, BOTH), 19633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DProjGrad3Offset, BOTH), 19643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2d_vec3, FUNCTION_TEXTUREPROJGRAD3, Vec4(-0.3f, -0.6f, 1.5f, 0.0f), Vec4(2.25f, 3.45f, 1.5f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProjGrad3Offset, BOTH), 19653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec4_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapFixed, evalTexture2DProjGradOffset, BOTH), 19673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2d_vec4_float, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapFloat, evalTexture2DProjGradOffset, BOTH), 19683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapInt, evalTexture2DProjGradOffset, BOTH), 19693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler2d_vec4, FUNCTION_TEXTUREPROJGRAD, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 0.0f, 1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapUint, evalTexture2DProjGradOffset, BOTH), 19703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapFixed, evalTexture3DProjGradOffset, BOTH), 19723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapFloat, evalTexture3DProjGradOffset, VERTEX), 19733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.2f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(3, -8, 7), tex3DMipmapFloat, evalTexture3DProjGradOffset, FRAGMENT), 19743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3(-0.2f, 0.0f, 0.0f), true, IVec3(-8, 7, 3), tex3DMipmapInt, evalTexture3DProjGradOffset, BOTH), 19753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.2f, 0.0f), true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DProjGradOffset, VERTEX), 19763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJGRAD, Vec4(0.9f, 1.05f, -0.08f, -0.75f), Vec4(-1.13f, -1.7f, -1.7f, -0.75f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, -0.2f), true, IVec3(3, -8, 7), tex3DMipmapUint, evalTexture3DProjGradOffset, FRAGMENT), 19773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4( 0.2f, 0.6f, 0.0f, -1.5f), Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.2f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), true, IVec3(-8, 7, 0), tex2DMipmapShadow, evalTexture2DShadowProjGradOffset, VERTEX), 19793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GRAD_CASE_SPEC(sampler2dshadow, FUNCTION_TEXTUREPROJGRAD, Vec4( 0.2f, 0.6f, 0.0f, -1.5f), Vec4(-2.25f, -3.45f, -1.5f, -1.5f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, 0.0f, 0.0f), Vec3( 0.0f, -0.2f, 0.0f), true, IVec3(7, -8, 0), tex2DMipmapShadow, evalTexture2DShadowProjGradOffset, FRAGMENT) 19803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 19813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "textureprojgradoffset", "textureProjGradOffset() Tests", textureProjGradOffsetCases, DE_LENGTH_OF_ARRAY(textureProjGradOffsetCases)); 19823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // texelFetch() cases 19843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Level is constant across quad 19853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec texelFetchCases[] = 19863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 19873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 19883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(255.9f, 255.9f, 0.0f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DTexelFetchFixed, evalTexelFetch2D, BOTH), 19893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(127.9f, 127.9f, 0.0f, 0.0f), false, 1.0f, 1.0f, false, IVec3(0), tex2DTexelFetchFloat, evalTexelFetch2D, BOTH), 19903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4( 63.9f, 63.9f, 0.0f, 0.0f), false, 2.0f, 2.0f, false, IVec3(0), tex2DTexelFetchInt, evalTexelFetch2D, BOTH), 19913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4( 15.9f, 15.9f, 0.0f, 0.0f), false, 4.0f, 4.0f, false, IVec3(0), tex2DTexelFetchUint, evalTexelFetch2D, BOTH), 19923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(127.9f, 127.9f, 3.9f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex2DArrayTexelFetchFixed, evalTexelFetch2DArray, BOTH), 19943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4( 63.9f, 63.9f, 3.9f, 0.0f), false, 1.0f, 1.0f, false, IVec3(0), tex2DArrayTexelFetchFloat, evalTexelFetch2DArray, BOTH), 19953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4( 31.9f, 31.9f, 3.9f, 0.0f), false, 2.0f, 2.0f, false, IVec3(0), tex2DArrayTexelFetchInt, evalTexelFetch2DArray, BOTH), 19963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4( 15.9f, 15.9f, 3.9f, 0.0f), false, 3.0f, 3.0f, false, IVec3(0), tex2DArrayTexelFetchUint, evalTexelFetch2DArray, BOTH), 19973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 19983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(63.9f, 31.9f, 31.9f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DTexelFetchFixed, evalTexelFetch3D, BOTH), 19993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(31.9f, 15.9f, 15.9f, 0.0f), false, 1.0f, 1.0f, false, IVec3(0), tex3DTexelFetchFloat, evalTexelFetch3D, BOTH), 20003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(15.9f, 7.9f, 7.9f, 0.0f), false, 2.0f, 2.0f, false, IVec3(0), tex3DTexelFetchInt, evalTexelFetch3D, BOTH), 20013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXELFETCH, Vec4(0.0f, 0.0f, 0.0f, 0.0f), Vec4(63.9f, 31.9f, 31.9f, 0.0f), false, 0.0f, 0.0f, false, IVec3(0), tex3DTexelFetchUint, evalTexelFetch3D, BOTH) 20023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 20033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texelfetch", "texelFetch() Tests", texelFetchCases, DE_LENGTH_OF_ARRAY(texelFetchCases)); 20043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // texelFetchOffset() cases 20063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const TexFuncCaseSpec texelFetchOffsetCases[] = 20073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 20083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 20093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_fixed, FUNCTION_TEXELFETCH, Vec4( 8.0f, -7.0f, 0.0f, 0.0f), Vec4(263.9f, 248.9f, 0.0f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DTexelFetchFixed, evalTexelFetch2D, BOTH), 20103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2d_float, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4(120.9f, 135.9f, 0.0f, 0.0f), false, 1.0f, 1.0f, true, IVec3(7, -8, 0), tex2DTexelFetchFloat, evalTexelFetch2D, BOTH), 20113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2d, FUNCTION_TEXELFETCH, Vec4( 8.0f, -7.0f, 0.0f, 0.0f), Vec4( 71.9f, 56.9f, 0.0f, 0.0f), false, 2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DTexelFetchInt, evalTexelFetch2D, BOTH), 20123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2d, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4( 8.9f, 23.9f, 0.0f, 0.0f), false, 4.0f, 4.0f, true, IVec3(7, -8, 0), tex2DTexelFetchUint, evalTexelFetch2D, BOTH), 20133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_fixed, FUNCTION_TEXELFETCH, Vec4( 8.0f, -7.0f, 0.0f, 0.0f), Vec4(135.9f, 120.9f, 3.9f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 0), tex2DArrayTexelFetchFixed, evalTexelFetch2DArray, BOTH), 20153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler2darray_float, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4( 56.9f, 71.9f, 3.9f, 0.0f), false, 1.0f, 1.0f, true, IVec3(7, -8, 0), tex2DArrayTexelFetchFloat, evalTexelFetch2DArray, BOTH), 20163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler2darray, FUNCTION_TEXELFETCH, Vec4( 8.0f, -7.0f, 0.0f, 0.0f), Vec4( 39.9f, 24.9f, 3.9f, 0.0f), false, 2.0f, 2.0f, true, IVec3(-8, 7, 0), tex2DArrayTexelFetchInt, evalTexelFetch2DArray, BOTH), 20173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler2darray, FUNCTION_TEXELFETCH, Vec4(-7.0f, 8.0f, 0.0f, 0.0f), Vec4( 8.9f, 23.9f, 3.9f, 0.0f), false, 3.0f, 3.0f, true, IVec3(7, -8, 0), tex2DArrayTexelFetchUint, evalTexelFetch2DArray, BOTH), 20183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_fixed, FUNCTION_TEXELFETCH, Vec4( 8.0f, -7.0f, -3.0f, 0.0f),Vec4(71.9f, 24.9f, 28.9f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DTexelFetchFixed, evalTexelFetch3D, BOTH), 20203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(sampler3d_float, FUNCTION_TEXELFETCH, Vec4(-7.0f, -3.0f, 8.0f, 0.0f),Vec4(24.9f, 12.9f, 23.9f, 0.0f), false, 1.0f, 1.0f, true, IVec3(7, 3, -8), tex3DTexelFetchFloat, evalTexelFetch3D, BOTH), 20213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(isampler3d, FUNCTION_TEXELFETCH, Vec4(-3.0f, 8.0f, -7.0f, 0.0f),Vec4(12.9f, 15.9f, 0.9f, 0.0f), false, 2.0f, 2.0f, true, IVec3(3, -8, 7), tex3DTexelFetchInt, evalTexelFetch3D, BOTH), 20223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CASE_SPEC(usampler3d, FUNCTION_TEXELFETCH, Vec4( 8.0f, -7.0f, -3.0f, 0.0f),Vec4(71.9f, 24.9f, 28.9f, 0.0f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DTexelFetchUint, evalTexelFetch3D, BOTH) 20233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 20243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry createCaseGroup(this, "texelfetchoffset", "texelFetchOffset() Tests", texelFetchOffsetCases, DE_LENGTH_OF_ARRAY(texelFetchOffsetCases)); 20253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // textureSize() cases 20273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 20283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry struct TextureSizeCaseSpec 20293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 20303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name; 20313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* samplerName; 20323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureSpec textureSpec; 20333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } textureSizeCases[] = 20343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 20353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler2d_fixed", "sampler2D", tex2DFixed }, 20363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler2d_float", "sampler2D", tex2DFloat }, 20373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "isampler2d", "isampler2D", tex2DInt }, 20383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "usampler2d", "usampler2D", tex2DUint }, 20393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler2dshadow", "sampler2DShadow", tex2DShadow }, 20403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler3d_fixed", "sampler3D", tex3DFixed }, 20413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler3d_float", "sampler3D", tex3DFloat }, 20423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "isampler3d", "isampler3D", tex3DInt }, 20433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "usampler3d", "usampler3D", tex3DUint }, 20443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "samplercube_fixed", "samplerCube", texCubeFixed }, 20453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "samplercube_float", "samplerCube", texCubeFloat }, 20463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "isamplercube", "isamplerCube", texCubeInt }, 20473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "usamplercube", "usamplerCube", texCubeUint }, 20483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "samplercubeshadow", "samplerCubeShadow", texCubeShadow }, 20493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler2darray_fixed", "sampler2DArray", tex2DArrayFixed }, 20503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler2darray_float", "sampler2DArray", tex2DArrayFloat }, 20513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "isampler2darray", "isampler2DArray", tex2DArrayInt }, 20523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "usampler2darray", "usampler2DArray", tex2DArrayUint }, 20533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { "sampler2darrayshadow", "sampler2DArrayShadow", tex2DArrayShadow }, 20543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 20553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* group = new tcu::TestCaseGroup(m_testCtx, "texturesize", "textureSize() Tests"); 20573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(group); 20583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureSizeCases); ++ndx) 20603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 20613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new TextureSizeCase(m_context, (std::string(textureSizeCases[ndx].name) + "_vertex").c_str(), "", textureSizeCases[ndx].samplerName, textureSizeCases[ndx].textureSpec, true)); 20623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry group->addChild(new TextureSizeCase(m_context, (std::string(textureSizeCases[ndx].name) + "_fragment").c_str(), "", textureSizeCases[ndx].samplerName, textureSizeCases[ndx].textureSpec, false)); 20633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 20643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 20653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Negative cases. 20673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 20683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gls::ShaderLibrary library(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo()); 20693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::vector<tcu::TestNode*> negativeCases = library.loadShaderFile("shaders/invalid_texture_functions.test"); 20703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* group = new tcu::TestCaseGroup(m_testCtx, "invalid", "Invalid texture function usage", negativeCases); 20723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(group); 20733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 20743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 20753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 20763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 20773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3 20783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 2079