108a3fca4026822a0f753c737b38553231926d8deAkos Dirner/*------------------------------------------------------------------------ 208a3fca4026822a0f753c737b38553231926d8deAkos Dirner * Vulkan Conformance Tests 308a3fca4026822a0f753c737b38553231926d8deAkos Dirner * ------------------------ 408a3fca4026822a0f753c737b38553231926d8deAkos Dirner * 508a3fca4026822a0f753c737b38553231926d8deAkos Dirner * Copyright (c) 2016 The Khronos Group Inc. 608a3fca4026822a0f753c737b38553231926d8deAkos Dirner * Copyright (c) 2016 Samsung Electronics Co., Ltd. 708a3fca4026822a0f753c737b38553231926d8deAkos Dirner * Copyright (c) 2016 The Android Open Source Project 808a3fca4026822a0f753c737b38553231926d8deAkos Dirner * 90e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 100e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * you may not use this file except in compliance with the License. 110e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * You may obtain a copy of the License at 1208a3fca4026822a0f753c737b38553231926d8deAkos Dirner * 130e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1408a3fca4026822a0f753c737b38553231926d8deAkos Dirner * 150e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * Unless required by applicable law or agreed to in writing, software 160e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 170e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 180e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * See the License for the specific language governing permissions and 190e9abe9552e4590b4df5d4f0775ed43d583144b4Pyry Haulos * limitations under the License. 2008a3fca4026822a0f753c737b38553231926d8deAkos Dirner * 2108a3fca4026822a0f753c737b38553231926d8deAkos Dirner *//*! 2208a3fca4026822a0f753c737b38553231926d8deAkos Dirner * \file 238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner * \brief Texture access and query function tests. 2408a3fca4026822a0f753c737b38553231926d8deAkos Dirner *//*--------------------------------------------------------------------*/ 2508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 2608a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "vktShaderRenderTextureFunctionTests.hpp" 2708a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "vktShaderRender.hpp" 2808a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "gluTextureUtil.hpp" 2908a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "tcuTexture.hpp" 3008a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "tcuTextureUtil.hpp" 3108a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "tcuTestLog.hpp" 3208a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "glwEnums.hpp" 3308a3fca4026822a0f753c737b38553231926d8deAkos Dirner#include "deMath.h" 348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner#include "vkImageUtil.hpp" 353fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham#include "vkQueryUtil.hpp" 3608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 3708a3fca4026822a0f753c737b38553231926d8deAkos Dirnernamespace vkt 3808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 3908a3fca4026822a0f753c737b38553231926d8deAkos Dirnernamespace sr 4008a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 4108a3fca4026822a0f753c737b38553231926d8deAkos Dirnernamespace 4208a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 4308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 4408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerusing tcu::Vec2; 4508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerusing tcu::Vec3; 4608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerusing tcu::Vec4; 4708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerusing tcu::IVec2; 4808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerusing tcu::IVec3; 4908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerusing tcu::IVec4; 5008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerusing std::vector; 528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 5308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerenum Function 5408a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 5508a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTURE = 0, //!< texture(), textureOffset() 5608a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREPROJ, //!< textureProj(), textureProjOffset() 5708a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREPROJ3, //!< textureProj(sampler2D, vec3) 5808a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTURELOD, // ... 5908a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREPROJLOD, 6008a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREPROJLOD3, //!< textureProjLod(sampler2D, vec3) 6108a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREGRAD, 6208a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREPROJGRAD, 6308a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXTUREPROJGRAD3, //!< textureProjGrad(sampler2D, vec3) 6408a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_TEXELFETCH, 6508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 6608a3fca4026822a0f753c737b38553231926d8deAkos Dirner FUNCTION_LAST 6708a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 6808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 6908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline bool functionHasAutoLod (glu::ShaderType shaderType, Function function) 7008a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 7108a3fca4026822a0f753c737b38553231926d8deAkos Dirner return shaderType == glu::SHADERTYPE_FRAGMENT && 7208a3fca4026822a0f753c737b38553231926d8deAkos Dirner (function == FUNCTION_TEXTURE || 7308a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJ || 7408a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJ3); 7508a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 7608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 7708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline bool functionHasProj (Function function) 7808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 7908a3fca4026822a0f753c737b38553231926d8deAkos Dirner return function == FUNCTION_TEXTUREPROJ || 8008a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJ3 || 8108a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJLOD || 8208a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJGRAD || 8308a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJLOD3 || 8408a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJGRAD3; 8508a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 8608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 8708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline bool functionHasGrad (Function function) 8808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 8908a3fca4026822a0f753c737b38553231926d8deAkos Dirner return function == FUNCTION_TEXTUREGRAD || function == FUNCTION_TEXTUREPROJGRAD || function == FUNCTION_TEXTUREPROJGRAD3; 9008a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 9108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 9208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline bool functionHasLod (Function function) 9308a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 9408a3fca4026822a0f753c737b38553231926d8deAkos Dirner return function == FUNCTION_TEXTURELOD || 9508a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJLOD || 9608a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXTUREPROJLOD3 || 9708a3fca4026822a0f753c737b38553231926d8deAkos Dirner function == FUNCTION_TEXELFETCH; 9808a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 9908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 10008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstruct TextureLookupSpec 10108a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 10208a3fca4026822a0f753c737b38553231926d8deAkos Dirner Function function; 10308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 10408a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec4 minCoord; 10508a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec4 maxCoord; 10608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 10708a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Bias 10808a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool useBias; 10908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11008a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Bias or Lod for *Lod* functions 11108a3fca4026822a0f753c737b38553231926d8deAkos Dirner float minLodBias; 11208a3fca4026822a0f753c737b38553231926d8deAkos Dirner float maxLodBias; 11308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // For *Grad* functions 11508a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec3 minDX; 11608a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec3 maxDX; 11708a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec3 minDY; 11808a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec3 maxDY; 11908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12008a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool useOffset; 12108a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::IVec3 offset; 12208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12308a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureLookupSpec (void) 12408a3fca4026822a0f753c737b38553231926d8deAkos Dirner : function (FUNCTION_LAST) 12508a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minCoord (0.0f) 12608a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxCoord (1.0f) 12708a3fca4026822a0f753c737b38553231926d8deAkos Dirner , useBias (false) 12808a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minLodBias (0.0f) 12908a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxLodBias (0.0f) 13008a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minDX (0.0f) 13108a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxDX (0.0f) 13208a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minDY (0.0f) 13308a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxDY (0.0f) 13408a3fca4026822a0f753c737b38553231926d8deAkos Dirner , useOffset (false) 13508a3fca4026822a0f753c737b38553231926d8deAkos Dirner , offset (0) 13608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 13708a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 13808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 13908a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureLookupSpec (Function function_, 14008a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Vec4& minCoord_, 14108a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Vec4& maxCoord_, 14208a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool useBias_, 14308a3fca4026822a0f753c737b38553231926d8deAkos Dirner float minLodBias_, 14408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float maxLodBias_, 14508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Vec3& minDX_, 14608a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Vec3& maxDX_, 14708a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Vec3& minDY_, 14808a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Vec3& maxDY_, 14908a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool useOffset_, 15008a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::IVec3& offset_) 15108a3fca4026822a0f753c737b38553231926d8deAkos Dirner : function (function_) 15208a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minCoord (minCoord_) 15308a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxCoord (maxCoord_) 15408a3fca4026822a0f753c737b38553231926d8deAkos Dirner , useBias (useBias_) 15508a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minLodBias (minLodBias_) 15608a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxLodBias (maxLodBias_) 15708a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minDX (minDX_) 15808a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxDX (maxDX_) 15908a3fca4026822a0f753c737b38553231926d8deAkos Dirner , minDY (minDY_) 16008a3fca4026822a0f753c737b38553231926d8deAkos Dirner , maxDY (maxDY_) 16108a3fca4026822a0f753c737b38553231926d8deAkos Dirner , useOffset (useOffset_) 16208a3fca4026822a0f753c737b38553231926d8deAkos Dirner , offset (offset_) 16308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 16408a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 16508a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 16608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 16708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerenum TextureType 16808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 1698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TEXTURETYPE_1D = 0, 17008a3fca4026822a0f753c737b38553231926d8deAkos Dirner TEXTURETYPE_2D, 1718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TEXTURETYPE_3D, 17208a3fca4026822a0f753c737b38553231926d8deAkos Dirner TEXTURETYPE_CUBE_MAP, 1738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TEXTURETYPE_1D_ARRAY, 17408a3fca4026822a0f753c737b38553231926d8deAkos Dirner TEXTURETYPE_2D_ARRAY, 1758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TEXTURETYPE_CUBE_ARRAY, 17608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 17708a3fca4026822a0f753c737b38553231926d8deAkos Dirner TEXTURETYPE_LAST 17808a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 17908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 18008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstruct TextureSpec 18108a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 18208a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureType type; //!< Texture type (2D, cubemap, ...) 18308a3fca4026822a0f753c737b38553231926d8deAkos Dirner deUint32 format; //!< Internal format. 18408a3fca4026822a0f753c737b38553231926d8deAkos Dirner int width; 18508a3fca4026822a0f753c737b38553231926d8deAkos Dirner int height; 18608a3fca4026822a0f753c737b38553231926d8deAkos Dirner int depth; 18708a3fca4026822a0f753c737b38553231926d8deAkos Dirner int numLevels; 18808a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler sampler; 18908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 19008a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureSpec (void) 19108a3fca4026822a0f753c737b38553231926d8deAkos Dirner : type (TEXTURETYPE_LAST) 19208a3fca4026822a0f753c737b38553231926d8deAkos Dirner , format (GL_NONE) 19308a3fca4026822a0f753c737b38553231926d8deAkos Dirner , width (0) 19408a3fca4026822a0f753c737b38553231926d8deAkos Dirner , height (0) 19508a3fca4026822a0f753c737b38553231926d8deAkos Dirner , depth (0) 19608a3fca4026822a0f753c737b38553231926d8deAkos Dirner , numLevels (0) 19708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 19808a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 19908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 20008a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureSpec (TextureType type_, 20108a3fca4026822a0f753c737b38553231926d8deAkos Dirner deUint32 format_, 20208a3fca4026822a0f753c737b38553231926d8deAkos Dirner int width_, 20308a3fca4026822a0f753c737b38553231926d8deAkos Dirner int height_, 20408a3fca4026822a0f753c737b38553231926d8deAkos Dirner int depth_, 20508a3fca4026822a0f753c737b38553231926d8deAkos Dirner int numLevels_, 20608a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::Sampler& sampler_) 20708a3fca4026822a0f753c737b38553231926d8deAkos Dirner : type (type_) 20808a3fca4026822a0f753c737b38553231926d8deAkos Dirner , format (format_) 20908a3fca4026822a0f753c737b38553231926d8deAkos Dirner , width (width_) 21008a3fca4026822a0f753c737b38553231926d8deAkos Dirner , height (height_) 21108a3fca4026822a0f753c737b38553231926d8deAkos Dirner , depth (depth_) 21208a3fca4026822a0f753c737b38553231926d8deAkos Dirner , numLevels (numLevels_) 21308a3fca4026822a0f753c737b38553231926d8deAkos Dirner , sampler (sampler_) 21408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 21508a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 21608a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 21708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 21808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstruct TexLookupParams 21908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 22008a3fca4026822a0f753c737b38553231926d8deAkos Dirner float lod; 22108a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::IVec3 offset; 22208a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec4 scale; 22308a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Vec4 bias; 22408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 22508a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexLookupParams (void) 22608a3fca4026822a0f753c737b38553231926d8deAkos Dirner : lod (0.0f) 22708a3fca4026822a0f753c737b38553231926d8deAkos Dirner , offset (0) 22808a3fca4026822a0f753c737b38553231926d8deAkos Dirner , scale (1.0f) 22908a3fca4026822a0f753c737b38553231926d8deAkos Dirner , bias (0.0f) 23008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 23108a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 23208a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 23308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23408a3fca4026822a0f753c737b38553231926d8deAkos Dirner// \note LodMode and computeLodFromDerivates functions are copied from glsTextureTestUtil 2358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnernamespace TextureTestUtil 2368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 23708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerenum LodMode 23908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 24008a3fca4026822a0f753c737b38553231926d8deAkos Dirner LODMODE_EXACT = 0, //!< Ideal lod computation. 24108a3fca4026822a0f753c737b38553231926d8deAkos Dirner LODMODE_MIN_BOUND, //!< Use estimation range minimum bound. 24208a3fca4026822a0f753c737b38553231926d8deAkos Dirner LODMODE_MAX_BOUND, //!< Use estimation range maximum bound. 24308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 24408a3fca4026822a0f753c737b38553231926d8deAkos Dirner LODMODE_LAST 24508a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 24608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 2478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner// 1D lookup LOD computation. 2488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 2498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerfloat computeLodFromDerivates (LodMode mode, float dudx, float dudy) 2508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 2518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner float p = 0.0f; 2528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (mode) 2538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 2548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // \note [mika] Min and max bounds equal to exact with 1D textures 2558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case LODMODE_EXACT: 2568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case LODMODE_MIN_BOUND: 2578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case LODMODE_MAX_BOUND: 2588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner p = de::max(deFloatAbs(dudx), deFloatAbs(dudy)); 2598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 2608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 2618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 2628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(DE_FALSE); 2638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 2648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 2658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return deFloatLog2(p); 2668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 2678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 26808a3fca4026822a0f753c737b38553231926d8deAkos Dirner// 2D lookup LOD computation. 26908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 27008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerfloat computeLodFromDerivates (LodMode mode, float dudx, float dvdx, float dudy, float dvdy) 27108a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 27208a3fca4026822a0f753c737b38553231926d8deAkos Dirner float p = 0.0f; 27308a3fca4026822a0f753c737b38553231926d8deAkos Dirner switch (mode) 27408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 27508a3fca4026822a0f753c737b38553231926d8deAkos Dirner case LODMODE_EXACT: 27608a3fca4026822a0f753c737b38553231926d8deAkos Dirner p = de::max(deFloatSqrt(dudx*dudx + dvdx*dvdx), deFloatSqrt(dudy*dudy + dvdy*dvdy)); 27708a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 27808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 27908a3fca4026822a0f753c737b38553231926d8deAkos Dirner case LODMODE_MIN_BOUND: 28008a3fca4026822a0f753c737b38553231926d8deAkos Dirner case LODMODE_MAX_BOUND: 28108a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 28208a3fca4026822a0f753c737b38553231926d8deAkos Dirner float mu = de::max(deFloatAbs(dudx), deFloatAbs(dudy)); 28308a3fca4026822a0f753c737b38553231926d8deAkos Dirner float mv = de::max(deFloatAbs(dvdx), deFloatAbs(dvdy)); 28408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 28508a3fca4026822a0f753c737b38553231926d8deAkos Dirner p = mode == LODMODE_MIN_BOUND ? de::max(mu, mv) : mu + mv; 28608a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 28708a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 28808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 28908a3fca4026822a0f753c737b38553231926d8deAkos Dirner default: 29008a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(DE_FALSE); 29108a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 29208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 29308a3fca4026822a0f753c737b38553231926d8deAkos Dirner return deFloatLog2(p); 29408a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 29508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 29608a3fca4026822a0f753c737b38553231926d8deAkos Dirner// 3D lookup LOD computation. 29708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 29808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerfloat computeLodFromDerivates (LodMode mode, float dudx, float dvdx, float dwdx, float dudy, float dvdy, float dwdy) 29908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 30008a3fca4026822a0f753c737b38553231926d8deAkos Dirner float p = 0.0f; 30108a3fca4026822a0f753c737b38553231926d8deAkos Dirner switch (mode) 30208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 30308a3fca4026822a0f753c737b38553231926d8deAkos Dirner case LODMODE_EXACT: 30408a3fca4026822a0f753c737b38553231926d8deAkos Dirner p = de::max(deFloatSqrt(dudx*dudx + dvdx*dvdx + dwdx*dwdx), deFloatSqrt(dudy*dudy + dvdy*dvdy + dwdy*dwdy)); 30508a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 30608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 30708a3fca4026822a0f753c737b38553231926d8deAkos Dirner case LODMODE_MIN_BOUND: 30808a3fca4026822a0f753c737b38553231926d8deAkos Dirner case LODMODE_MAX_BOUND: 30908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 31008a3fca4026822a0f753c737b38553231926d8deAkos Dirner float mu = de::max(deFloatAbs(dudx), deFloatAbs(dudy)); 31108a3fca4026822a0f753c737b38553231926d8deAkos Dirner float mv = de::max(deFloatAbs(dvdx), deFloatAbs(dvdy)); 31208a3fca4026822a0f753c737b38553231926d8deAkos Dirner float mw = de::max(deFloatAbs(dwdx), deFloatAbs(dwdy)); 31308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 31408a3fca4026822a0f753c737b38553231926d8deAkos Dirner p = mode == LODMODE_MIN_BOUND ? de::max(de::max(mu, mv), mw) : (mu + mv + mw); 31508a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 31608a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 31708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 31808a3fca4026822a0f753c737b38553231926d8deAkos Dirner default: 31908a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(DE_FALSE); 32008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 32108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 32208a3fca4026822a0f753c737b38553231926d8deAkos Dirner return deFloatLog2(p); 32308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 32408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 3258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} // TextureTestUtil 3268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 3278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerusing namespace TextureTestUtil; 3288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 32908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic const LodMode DEFAULT_LOD_MODE = LODMODE_EXACT; 33008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 33108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float computeLodFromGrad2D (const ShaderEvalContext& c) 33208a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 33308a3fca4026822a0f753c737b38553231926d8deAkos Dirner float w = (float)c.textures[0].tex2D->getWidth(); 33408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float h = (float)c.textures[0].tex2D->getHeight(); 33508a3fca4026822a0f753c737b38553231926d8deAkos Dirner return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*w, c.in[1].y()*h, c.in[2].x()*w, c.in[2].y()*h); 33608a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 33708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 33808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float computeLodFromGrad2DArray (const ShaderEvalContext& c) 33908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 34008a3fca4026822a0f753c737b38553231926d8deAkos Dirner float w = (float)c.textures[0].tex2DArray->getWidth(); 34108a3fca4026822a0f753c737b38553231926d8deAkos Dirner float h = (float)c.textures[0].tex2DArray->getHeight(); 34208a3fca4026822a0f753c737b38553231926d8deAkos Dirner return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*w, c.in[1].y()*h, c.in[2].x()*w, c.in[2].y()*h); 34308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 34408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 34508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float computeLodFromGrad3D (const ShaderEvalContext& c) 34608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 34708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float w = (float)c.textures[0].tex3D->getWidth(); 34808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float h = (float)c.textures[0].tex3D->getHeight(); 34908a3fca4026822a0f753c737b38553231926d8deAkos Dirner float d = (float)c.textures[0].tex3D->getDepth(); 35008a3fca4026822a0f753c737b38553231926d8deAkos Dirner return computeLodFromDerivates(DEFAULT_LOD_MODE, 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); 35108a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 35208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 35308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float computeLodFromGradCube (const ShaderEvalContext& c) 35408a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 35508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \note Major axis is always -Z or +Z 35608a3fca4026822a0f753c737b38553231926d8deAkos Dirner float m = de::abs(c.in[0].z()); 35708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float d = (float)c.textures[0].texCube->getSize(); 35808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float s = d/(2.0f*m); 35908a3fca4026822a0f753c737b38553231926d8deAkos Dirner float t = d/(2.0f*m); 36008a3fca4026822a0f753c737b38553231926d8deAkos Dirner return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*s, c.in[1].y()*t, c.in[2].x()*s, c.in[2].y()*t); 36108a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 36208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 36308a3fca4026822a0f753c737b38553231926d8deAkos Dirnertypedef void (*TexEvalFunc) (ShaderEvalContext& c, const TexLookupParams& lookupParams); 36408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 36508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 texture2D (const ShaderEvalContext& c, float s, float t, float lod) { return c.textures[0].tex2D->sample(c.textures[0].sampler, s, t, lod); } 36608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 textureCube (const ShaderEvalContext& c, float s, float t, float r, float lod) { return c.textures[0].texCube->sample(c.textures[0].sampler, s, t, r, lod); } 36708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 texture2DArray (const ShaderEvalContext& c, float s, float t, float r, float lod) { return c.textures[0].tex2DArray->sample(c.textures[0].sampler, s, t, r, lod); } 36808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 texture3D (const ShaderEvalContext& c, float s, float t, float r, float lod) { return c.textures[0].tex3D->sample(c.textures[0].sampler, s, t, r, lod); } 36908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 37008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float texture2DShadow (const ShaderEvalContext& c, float ref, float s, float t, float lod) { return c.textures[0].tex2D->sampleCompare(c.textures[0].sampler, ref, s, t, lod); } 37108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float textureCubeShadow (const 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); } 37208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float texture2DArrayShadow (const 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); } 37308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 37408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 texture2DOffset (const ShaderEvalContext& c, float s, float t, float lod, IVec2 offset) { return c.textures[0].tex2D->sampleOffset(c.textures[0].sampler, s, t, lod, offset); } 37508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 texture2DArrayOffset (const 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); } 37608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline Vec4 texture3DOffset (const 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); } 37708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 37808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float texture2DShadowOffset (const 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); } 37908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerinline float texture2DArrayShadowOffset (const 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); } 38008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 38108a3fca4026822a0f753c737b38553231926d8deAkos Dirner// Eval functions. 38208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2D (ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod)*p.scale + p.bias; } 38308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCube (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; } 38408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArray (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; } 38508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3D (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; } 38608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 38708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DBias (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; } 38808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCubeBias (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; } 38908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayBias (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; } 39008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DBias (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; } 39108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 39208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProj3 (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; } 39308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProj3Bias (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; } 39408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProj (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; } 39508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjBias (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; } 39608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProj (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; } 39708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjBias (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; } 39808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 39908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DLod (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; } 40008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCubeLod (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; } 40108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayLod (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; } 40208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DLod (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; } 40308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 40408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjLod3 (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; } 40508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjLod (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; } 40608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjLod (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; } 40708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 40808a3fca4026822a0f753c737b38553231926d8deAkos Dirner// Offset variants 40908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 41008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DOffset (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; } 41108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayOffset (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; } 41208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DOffset (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; } 41308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 41408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DOffsetBias (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; } 41508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayOffsetBias (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; } 41608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DOffsetBias (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; } 41708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 41808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DLodOffset (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; } 41908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayLodOffset (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; } 42008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DLodOffset (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; } 42108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 42208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProj3Offset (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; } 42308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProj3OffsetBias (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; } 42408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjOffset (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; } 42508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjOffsetBias (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; } 42608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjOffset (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; } 42708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjOffsetBias (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; } 42808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 42908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjLod3Offset (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; } 43008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjLodOffset (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; } 43108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjLodOffset (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; } 43208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 43308a3fca4026822a0f753c737b38553231926d8deAkos Dirner// Shadow variants 43408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 43508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadow (ShaderEvalContext& c, const TexLookupParams& p) { c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod); } 43608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowBias (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()); } 43708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 43808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCubeShadow (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); } 43908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCubeShadowBias (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()); } 44008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 44108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayShadow (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); } 44208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 44308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowLod (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()); } 44408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowLodOffset (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)); } 44508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 44608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProj (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); } 44708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjBias (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()); } 44808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 44908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjLod (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()); } 45008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjLodOffset(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)); } 45108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 45208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowOffset (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)); } 45308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowOffsetBias (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)); } 45408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 45508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjOffset (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)); } 45608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjOffsetBias (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)); } 45708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 45808a3fca4026822a0f753c737b38553231926d8deAkos Dirner// Gradient variarts 45908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 46008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DGrad (ShaderEvalContext& c, const TexLookupParams& p) { c.color = texture2D(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c))*p.scale + p.bias; } 46108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCubeGrad (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; } 46208a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayGrad (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; } 46308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DGrad (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; } 46408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 46508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowGrad (ShaderEvalContext& c, const TexLookupParams&) { c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c)); } 46608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTextureCubeShadowGrad (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)); } 46708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayShadowGrad (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)); } 46808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 46908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DGradOffset (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; } 47008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayGradOffset (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; } 47108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DGradOffset (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; } 47208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 47308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowGradOffset (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)); } 47408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DArrayShadowGradOffset (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)); } 47508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 47608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjGrad (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)); } 47708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DShadowProjGradOffset (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)); } 47808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 47908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjGrad3 (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; } 48008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjGrad (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; } 48108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjGrad (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; } 48208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 48308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjGrad3Offset (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; } 48408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture2DProjGradOffset (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; } 48508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexture3DProjGradOffset (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; } 48608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 48708a3fca4026822a0f753c737b38553231926d8deAkos Dirner// Texel fetch variants 48808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 48908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexelFetch2D (ShaderEvalContext& c, const TexLookupParams& p) 49008a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 49108a3fca4026822a0f753c737b38553231926d8deAkos Dirner int x = deChopFloatToInt32(c.in[0].x())+p.offset.x(); 49208a3fca4026822a0f753c737b38553231926d8deAkos Dirner int y = deChopFloatToInt32(c.in[0].y())+p.offset.y(); 49308a3fca4026822a0f753c737b38553231926d8deAkos Dirner int lod = deChopFloatToInt32(c.in[1].x()); 49408a3fca4026822a0f753c737b38553231926d8deAkos Dirner c.color = c.textures[0].tex2D->getLevel(lod).getPixel(x, y)*p.scale + p.bias; 49508a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 49608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 49708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexelFetch2DArray (ShaderEvalContext& c, const TexLookupParams& p) 49808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 49908a3fca4026822a0f753c737b38553231926d8deAkos Dirner int x = deChopFloatToInt32(c.in[0].x())+p.offset.x(); 50008a3fca4026822a0f753c737b38553231926d8deAkos Dirner int y = deChopFloatToInt32(c.in[0].y())+p.offset.y(); 50108a3fca4026822a0f753c737b38553231926d8deAkos Dirner int l = deChopFloatToInt32(c.in[0].z()); 50208a3fca4026822a0f753c737b38553231926d8deAkos Dirner int lod = deChopFloatToInt32(c.in[1].x()); 50308a3fca4026822a0f753c737b38553231926d8deAkos Dirner c.color = c.textures[0].tex2DArray->getLevel(lod).getPixel(x, y, l)*p.scale + p.bias; 50408a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 50508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 50608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void evalTexelFetch3D (ShaderEvalContext& c, const TexLookupParams& p) 50708a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 50808a3fca4026822a0f753c737b38553231926d8deAkos Dirner int x = deChopFloatToInt32(c.in[0].x())+p.offset.x(); 50908a3fca4026822a0f753c737b38553231926d8deAkos Dirner int y = deChopFloatToInt32(c.in[0].y())+p.offset.y(); 51008a3fca4026822a0f753c737b38553231926d8deAkos Dirner int z = deChopFloatToInt32(c.in[0].z())+p.offset.z(); 51108a3fca4026822a0f753c737b38553231926d8deAkos Dirner int lod = deChopFloatToInt32(c.in[1].x()); 51208a3fca4026822a0f753c737b38553231926d8deAkos Dirner c.color = c.textures[0].tex3D->getLevel(lod).getPixel(x, y, z)*p.scale + p.bias; 51308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 51408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 51508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerclass TexLookupEvaluator : public ShaderEvaluator 51608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 51708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerpublic: 51808a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexLookupEvaluator (TexEvalFunc evalFunc, const TexLookupParams& lookupParams) : m_evalFunc(evalFunc), m_lookupParams(lookupParams) {} 51908a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual ~TexLookupEvaluator (void) {} 52008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 52108a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual void evaluate (ShaderEvalContext& ctx) const { m_evalFunc(ctx, m_lookupParams); } 52208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 52308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerprivate: 52408a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexEvalFunc m_evalFunc; 52508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TexLookupParams& m_lookupParams; 52608a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 52708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 52808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerclass ShaderTextureFunctionInstance : public ShaderRenderCaseInstance 52908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 53008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerpublic: 53108a3fca4026822a0f753c737b38553231926d8deAkos Dirner ShaderTextureFunctionInstance (Context& context, 53208a3fca4026822a0f753c737b38553231926d8deAkos Dirner const bool isVertexCase, 53308a3fca4026822a0f753c737b38553231926d8deAkos Dirner const ShaderEvaluator& evaluator, 53408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const UniformSetup& uniformSetup, 53508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureLookupSpec& lookupSpec, 53608a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& textureSpec, 5373fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TexLookupParams& lookupParams, 5383fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const ImageBackingMode imageBackingMode = IMAGE_BACKING_MODE_REGULAR); 53908a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual ~ShaderTextureFunctionInstance (void); 54008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 54108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerprotected: 54208a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual void setupUniforms (const tcu::Vec4&); 54308a3fca4026822a0f753c737b38553231926d8deAkos Dirner void initTexture (void); 54408a3fca4026822a0f753c737b38553231926d8deAkos Dirnerprivate: 54508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureLookupSpec& m_lookupSpec; 54608a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& m_textureSpec; 54708a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TexLookupParams& m_lookupParams; 54808a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 54908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 55008a3fca4026822a0f753c737b38553231926d8deAkos DirnerShaderTextureFunctionInstance::ShaderTextureFunctionInstance (Context& context, 55108a3fca4026822a0f753c737b38553231926d8deAkos Dirner const bool isVertexCase, 55208a3fca4026822a0f753c737b38553231926d8deAkos Dirner const ShaderEvaluator& evaluator, 55308a3fca4026822a0f753c737b38553231926d8deAkos Dirner const UniformSetup& uniformSetup, 55408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureLookupSpec& lookupSpec, 55508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& textureSpec, 5563fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TexLookupParams& lookupParams, 5573fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const ImageBackingMode imageBackingMode) 5583fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham : ShaderRenderCaseInstance (context, isVertexCase, evaluator, uniformSetup, DE_NULL, imageBackingMode) 55908a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_lookupSpec (lookupSpec) 56008a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_textureSpec (textureSpec) 56108a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_lookupParams (lookupParams) 56208a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 56308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 56408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Base coord scale & bias 56508a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 s = m_lookupSpec.maxCoord-m_lookupSpec.minCoord; 56608a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 b = m_lookupSpec.minCoord; 56708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 56808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float baseCoordTrans[] = 56908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 57008a3fca4026822a0f753c737b38553231926d8deAkos Dirner s.x(), 0.0f, 0.f, b.x(), 57108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.f, s.y(), 0.f, b.y(), 57208a3fca4026822a0f753c737b38553231926d8deAkos Dirner s.z()/2.f, -s.z()/2.f, 0.f, s.z()/2.f + b.z(), 57308a3fca4026822a0f753c737b38553231926d8deAkos Dirner -s.w()/2.f, s.w()/2.f, 0.f, s.w()/2.f + b.w() 57408a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 57508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 57608a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_userAttribTransforms.push_back(tcu::Mat4(baseCoordTrans)); 57708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 57808a3fca4026822a0f753c737b38553231926d8deAkos Dirner useAttribute(4u, A_IN0); 57908a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 58008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 58108a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool hasLodBias = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias; 58208a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isGrad = functionHasGrad(m_lookupSpec.function); 58308a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(!isGrad || !hasLodBias); 58408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 58508a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (hasLodBias) 58608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 58708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float s = m_lookupSpec.maxLodBias-m_lookupSpec.minLodBias; 58808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float b = m_lookupSpec.minLodBias; 58908a3fca4026822a0f753c737b38553231926d8deAkos Dirner float lodCoordTrans[] = 59008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 59108a3fca4026822a0f753c737b38553231926d8deAkos Dirner s/2.0f, s/2.0f, 0.f, b, 59208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f, 0.0f, 0.0f, 0.0f, 59308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f, 0.0f, 0.0f, 0.0f, 59408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f, 0.0f, 0.0f, 0.0f 59508a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 59608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 59708a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_userAttribTransforms.push_back(tcu::Mat4(lodCoordTrans)); 59808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 59908a3fca4026822a0f753c737b38553231926d8deAkos Dirner useAttribute(5u, A_IN1); 60008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 60108a3fca4026822a0f753c737b38553231926d8deAkos Dirner else if (isGrad) 60208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 60308a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec3 sx = m_lookupSpec.maxDX-m_lookupSpec.minDX; 60408a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec3 sy = m_lookupSpec.maxDY-m_lookupSpec.minDY; 60508a3fca4026822a0f753c737b38553231926d8deAkos Dirner float gradDxTrans[] = 60608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 60708a3fca4026822a0f753c737b38553231926d8deAkos Dirner sx.x()/2.0f, sx.x()/2.0f, 0.f, m_lookupSpec.minDX.x(), 60808a3fca4026822a0f753c737b38553231926d8deAkos Dirner sx.y()/2.0f, sx.y()/2.0f, 0.0f, m_lookupSpec.minDX.y(), 60908a3fca4026822a0f753c737b38553231926d8deAkos Dirner sx.z()/2.0f, sx.z()/2.0f, 0.0f, m_lookupSpec.minDX.z(), 61008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f, 0.0f, 0.0f, 0.0f 61108a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 61208a3fca4026822a0f753c737b38553231926d8deAkos Dirner float gradDyTrans[] = 61308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 61408a3fca4026822a0f753c737b38553231926d8deAkos Dirner -sy.x()/2.0f, -sy.x()/2.0f, 0.f, m_lookupSpec.maxDY.x(), 61508a3fca4026822a0f753c737b38553231926d8deAkos Dirner -sy.y()/2.0f, -sy.y()/2.0f, 0.0f, m_lookupSpec.maxDY.y(), 61608a3fca4026822a0f753c737b38553231926d8deAkos Dirner -sy.z()/2.0f, -sy.z()/2.0f, 0.0f, m_lookupSpec.maxDY.z(), 61708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f, 0.0f, 0.0f, 0.0f 61808a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 61908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 62008a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_userAttribTransforms.push_back(tcu::Mat4(gradDxTrans)); 62108a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_userAttribTransforms.push_back(tcu::Mat4(gradDyTrans)); 62208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 62308a3fca4026822a0f753c737b38553231926d8deAkos Dirner useAttribute(5u, A_IN1); 62408a3fca4026822a0f753c737b38553231926d8deAkos Dirner useAttribute(6u, A_IN2); 62508a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 62608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 62708a3fca4026822a0f753c737b38553231926d8deAkos Dirner initTexture(); 62808a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 62908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 63008a3fca4026822a0f753c737b38553231926d8deAkos DirnerShaderTextureFunctionInstance::~ShaderTextureFunctionInstance (void) 63108a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 63208a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 63308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 63408a3fca4026822a0f753c737b38553231926d8deAkos Dirnervoid ShaderTextureFunctionInstance::setupUniforms (const tcu::Vec4&) 63508a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 63608a3fca4026822a0f753c737b38553231926d8deAkos Dirner useSampler(0u, 0u); 63708a3fca4026822a0f753c737b38553231926d8deAkos Dirner addUniform(1u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(tcu::Vec4), m_lookupParams.scale.getPtr()); 63808a3fca4026822a0f753c737b38553231926d8deAkos Dirner addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(tcu::Vec4), m_lookupParams.bias.getPtr()); 63908a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 64008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 64108a3fca4026822a0f753c737b38553231926d8deAkos Dirnervoid ShaderTextureFunctionInstance::initTexture (void) 64208a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 64308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const IVec4 texCubeSwz[] = 64408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 64508a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4(0,0,1,1), 64608a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4(1,1,0,0), 64708a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4(0,1,0,1), 64808a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4(1,0,1,0), 64908a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4(0,1,1,0), 65008a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4(1,0,0,1) 65108a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 65208a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(texCubeSwz) == tcu::CUBEFACE_LAST); 65308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 65408a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_textureSpec.format); 65508a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt); 65608a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::UVec2 viewportSize = getViewportSize(); 65708a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isProj = functionHasProj(m_lookupSpec.function); 65808a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isAutoLod = functionHasAutoLod(m_isVertexCase ? glu::SHADERTYPE_VERTEX : glu::SHADERTYPE_FRAGMENT, 65908a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_lookupSpec.function); // LOD can vary significantly 66008a3fca4026822a0f753c737b38553231926d8deAkos Dirner float proj = isProj ? 1.0f/m_lookupSpec.minCoord[m_lookupSpec.function == FUNCTION_TEXTUREPROJ3 ? 2 : 3] : 1.0f; 66108a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexLookupParams lookupParams; 66208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 66308a3fca4026822a0f753c737b38553231926d8deAkos Dirner switch (m_textureSpec.type) 66408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 66508a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_2D: 66608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 66708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float levelStep = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1); 66808a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 66908a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cBias = fmtInfo.valueMin; 67008a3fca4026822a0f753c737b38553231926d8deAkos Dirner int baseCellSize = de::min(m_textureSpec.width/4, m_textureSpec.height/4); 67108a3fca4026822a0f753c737b38553231926d8deAkos Dirner de::MovePtr<tcu::Texture2D> texture2D; 67208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 67308a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture2D = de::MovePtr<tcu::Texture2D>(new tcu::Texture2D(texFmt, m_textureSpec.width, m_textureSpec.height)); 67408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 67508a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int level = 0; level < m_textureSpec.numLevels; level++) 67608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 67708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fA = float(level)*levelStep; 67808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fB = 1.0f-fA; 67908a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorA = cBias + cScale*Vec4(fA, fB, fA, fB); 68008a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorB = cBias + cScale*Vec4(fB, fA, fB, fA); 68108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 68208a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture2D->allocLevel(level); 68308a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::fillWithGrid(texture2D->getLevel(level), de::max(1, baseCellSize>>level), colorA, colorB); 68408a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 68508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 68608a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Compute LOD. 68708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dudx = (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*(float)m_textureSpec.width / (float)viewportSize[0]; 68808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dvdy = (m_lookupSpec.maxCoord[1]-m_lookupSpec.minCoord[1])*proj*(float)m_textureSpec.height / (float)viewportSize[1]; 68908a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy); 69008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 69108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Append to texture list. 69208a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_textures.push_back(TextureBindingSp(new TextureBinding(texture2D.release(), m_textureSpec.sampler))); 69308a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 69408a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 69508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 69608a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_CUBE_MAP: 69708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 69808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float levelStep = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1); 69908a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 70008a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cBias = fmtInfo.valueMin; 70108a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cCorner = cBias + cScale*0.5f; 70208a3fca4026822a0f753c737b38553231926d8deAkos Dirner int baseCellSize = de::min(m_textureSpec.width/4, m_textureSpec.height/4); 70308a3fca4026822a0f753c737b38553231926d8deAkos Dirner de::MovePtr<tcu::TextureCube> textureCube; 70408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 70508a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(m_textureSpec.width == m_textureSpec.height); 70608a3fca4026822a0f753c737b38553231926d8deAkos Dirner textureCube = de::MovePtr<tcu::TextureCube>(new tcu::TextureCube(texFmt, m_textureSpec.width)); 70708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 70808a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int level = 0; level < m_textureSpec.numLevels; level++) 70908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 71008a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fA = float(level)*levelStep; 71108a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fB = 1.0f-fA; 71208a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec2 f (fA, fB); 71308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 71408a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 71508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 71608a3fca4026822a0f753c737b38553231926d8deAkos Dirner const IVec4& swzA = texCubeSwz[face]; 71708a3fca4026822a0f753c737b38553231926d8deAkos Dirner IVec4 swzB = 1-swzA; 71808a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorA = cBias + cScale*f.swizzle(swzA[0], swzA[1], swzA[2], swzA[3]); 71908a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorB = cBias + cScale*f.swizzle(swzB[0], swzB[1], swzB[2], swzB[3]); 72008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 72108a3fca4026822a0f753c737b38553231926d8deAkos Dirner textureCube->allocLevel((tcu::CubeFace)face, level); 72208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 72308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 72408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const tcu::PixelBufferAccess access = textureCube->getLevelFace(level, (tcu::CubeFace)face); 72508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const int lastPix = access.getWidth()-1; 72608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 72708a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::fillWithGrid(access, de::max(1, baseCellSize>>level), colorA, colorB); 72808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 72908a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Ensure all corners have identical colors in order to avoid dealing with ambiguous corner texel filtering 73008a3fca4026822a0f753c737b38553231926d8deAkos Dirner access.setPixel(cCorner, 0, 0); 73108a3fca4026822a0f753c737b38553231926d8deAkos Dirner access.setPixel(cCorner, 0, lastPix); 73208a3fca4026822a0f753c737b38553231926d8deAkos Dirner access.setPixel(cCorner, lastPix, 0); 73308a3fca4026822a0f753c737b38553231926d8deAkos Dirner access.setPixel(cCorner, lastPix, lastPix); 73408a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 73508a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 73608a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 73708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 73808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Compute LOD \note Assumes that only single side is accessed and R is constant major axis. 73908a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(de::abs(m_lookupSpec.minCoord[2] - m_lookupSpec.maxCoord[2]) < 0.005); 74008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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])); 74108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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])); 74208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 74308a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::CubeFaceFloatCoords c00 = tcu::getCubeFaceCoords(Vec3(m_lookupSpec.minCoord[0]*proj, m_lookupSpec.minCoord[1]*proj, m_lookupSpec.minCoord[2]*proj)); 74408a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::CubeFaceFloatCoords c10 = tcu::getCubeFaceCoords(Vec3(m_lookupSpec.maxCoord[0]*proj, m_lookupSpec.minCoord[1]*proj, m_lookupSpec.minCoord[2]*proj)); 74508a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::CubeFaceFloatCoords c01 = tcu::getCubeFaceCoords(Vec3(m_lookupSpec.minCoord[0]*proj, m_lookupSpec.maxCoord[1]*proj, m_lookupSpec.minCoord[2]*proj)); 74608a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dudx = (c10.s - c00.s)*(float)m_textureSpec.width / (float)viewportSize[0]; 74708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dvdy = (c01.t - c00.t)*(float)m_textureSpec.height / (float)viewportSize[1]; 74808a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy); 74908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 75008a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Append to texture list. 75108a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_textures.push_back(TextureBindingSp(new TextureBinding(textureCube.release(), m_textureSpec.sampler))); 75208a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 75308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 75408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 75508a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_2D_ARRAY: 75608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 75708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float layerStep = 1.0f / (float)m_textureSpec.depth; 75808a3fca4026822a0f753c737b38553231926d8deAkos Dirner float levelStep = isAutoLod ? 0.0f : 1.0f / (float)(de::max(1, m_textureSpec.numLevels-1)*m_textureSpec.depth); 75908a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 76008a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cBias = fmtInfo.valueMin; 76108a3fca4026822a0f753c737b38553231926d8deAkos Dirner int baseCellSize = de::min(m_textureSpec.width/4, m_textureSpec.height/4); 76208a3fca4026822a0f753c737b38553231926d8deAkos Dirner de::MovePtr<tcu::Texture2DArray> texture2DArray; 76308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 76408a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture2DArray = de::MovePtr<tcu::Texture2DArray>(new tcu::Texture2DArray(texFmt, m_textureSpec.width, m_textureSpec.height, m_textureSpec.depth)); 76508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 76608a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int level = 0; level < m_textureSpec.numLevels; level++) 76708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 76808a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture2DArray->allocLevel(level); 76908a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::PixelBufferAccess levelAccess = texture2DArray->getLevel(level); 77008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 77108a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int layer = 0; layer < levelAccess.getDepth(); layer++) 77208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 77308a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fA = (float)layer*layerStep + (float)level*levelStep; 77408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fB = 1.0f-fA; 77508a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorA = cBias + cScale*Vec4(fA, fB, fA, fB); 77608a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorB = cBias + cScale*Vec4(fB, fA, fB, fA); 77708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 77808a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::fillWithGrid(tcu::getSubregion(levelAccess, 0, 0, layer, levelAccess.getWidth(), levelAccess.getHeight(), 1), de::max(1, baseCellSize>>level), colorA, colorB); 77908a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 78008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 78108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 78208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Compute LOD. 78308a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dudx = (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*(float)m_textureSpec.width / (float)viewportSize[0]; 78408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dvdy = (m_lookupSpec.maxCoord[1]-m_lookupSpec.minCoord[1])*proj*(float)m_textureSpec.height / (float)viewportSize[1]; 78508a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy); 78608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 78708a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Append to texture list. 78808a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_textures.push_back(TextureBindingSp(new TextureBinding(texture2DArray.release(), m_textureSpec.sampler))); 78908a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 79008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 79108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 79208a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_3D: 79308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 79408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float levelStep = isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1); 79508a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin; 79608a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 cBias = fmtInfo.valueMin; 79708a3fca4026822a0f753c737b38553231926d8deAkos Dirner int baseCellSize = de::min(de::min(m_textureSpec.width/2, m_textureSpec.height/2), m_textureSpec.depth/2); 79808a3fca4026822a0f753c737b38553231926d8deAkos Dirner de::MovePtr<tcu::Texture3D> texture3D; 79908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 80008a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture3D = de::MovePtr<tcu::Texture3D>(new tcu::Texture3D(texFmt, m_textureSpec.width, m_textureSpec.height, m_textureSpec.depth)); 80108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 80208a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int level = 0; level < m_textureSpec.numLevels; level++) 80308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 80408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fA = (float)level*levelStep; 80508a3fca4026822a0f753c737b38553231926d8deAkos Dirner float fB = 1.0f-fA; 80608a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorA = cBias + cScale*Vec4(fA, fB, fA, fB); 80708a3fca4026822a0f753c737b38553231926d8deAkos Dirner Vec4 colorB = cBias + cScale*Vec4(fB, fA, fB, fA); 80808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 80908a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture3D->allocLevel(level); 81008a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::fillWithGrid(texture3D->getLevel(level), de::max(1, baseCellSize>>level), colorA, colorB); 81108a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 81208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 81308a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Compute LOD. 81408a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dudx = (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*(float)m_textureSpec.width / (float)viewportSize[0]; 81508a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dvdy = (m_lookupSpec.maxCoord[1]-m_lookupSpec.minCoord[1])*proj*(float)m_textureSpec.height / (float)viewportSize[1]; 81608a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dwdx = (m_lookupSpec.maxCoord[2]-m_lookupSpec.minCoord[2])*0.5f*proj*(float)m_textureSpec.depth / (float)viewportSize[0]; 81708a3fca4026822a0f753c737b38553231926d8deAkos Dirner float dwdy = (m_lookupSpec.maxCoord[2]-m_lookupSpec.minCoord[2])*0.5f*proj*(float)m_textureSpec.depth / (float)viewportSize[1]; 81808a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, dwdx, 0.0f, dvdy, dwdy); 81908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 82008a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Append to texture list. 82108a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_textures.push_back(TextureBindingSp(new TextureBinding(texture3D.release(), m_textureSpec.sampler))); 82208a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 82308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 82408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 82508a3fca4026822a0f753c737b38553231926d8deAkos Dirner default: 82608a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(DE_FALSE); 82708a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 82808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 82908a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Set lookup scale & bias 83008a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.scale = fmtInfo.lookupScale; 83108a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.bias = fmtInfo.lookupBias; 83208a3fca4026822a0f753c737b38553231926d8deAkos Dirner lookupParams.offset = m_lookupSpec.offset; 83308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 83408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \todo [dirnerakos] Avoid const cast somehow 83508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const_cast<TexLookupParams&>(m_lookupParams) = lookupParams; 83608a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 83708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 83808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerclass ShaderTextureFunctionCase : public ShaderRenderCase 83908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 84008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerpublic: 84108a3fca4026822a0f753c737b38553231926d8deAkos Dirner ShaderTextureFunctionCase (tcu::TestContext& testCtx, 84208a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& name, 84308a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& desc, 84408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureLookupSpec& lookup, 84508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& texture, 84608a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexEvalFunc evalFunc, 84708a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isVertexCase); 84808a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual ~ShaderTextureFunctionCase (void); 84908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 85008a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual TestInstance* createInstance (Context& context) const; 85108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 8523fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahamprotected: 8533fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureLookupSpec m_lookupSpec; 8543fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureSpec m_textureSpec; 8553fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TexLookupParams m_lookupParams; 85608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 8573fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham void initShaderSources (void); 85808a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 85908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 86008a3fca4026822a0f753c737b38553231926d8deAkos DirnerShaderTextureFunctionCase::ShaderTextureFunctionCase (tcu::TestContext& testCtx, 86108a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& name, 86208a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& desc, 86308a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureLookupSpec& lookup, 86408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& texture, 86508a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexEvalFunc evalFunc, 86608a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isVertexCase) 86708a3fca4026822a0f753c737b38553231926d8deAkos Dirner : ShaderRenderCase (testCtx, name, desc, isVertexCase, new TexLookupEvaluator(evalFunc, m_lookupParams), NULL, NULL) 86808a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_lookupSpec (lookup) 86908a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_textureSpec (texture) 87008a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 87108a3fca4026822a0f753c737b38553231926d8deAkos Dirner initShaderSources(); 87208a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 87308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 87408a3fca4026822a0f753c737b38553231926d8deAkos DirnerShaderTextureFunctionCase::~ShaderTextureFunctionCase (void) 87508a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 87608a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 87708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 87808a3fca4026822a0f753c737b38553231926d8deAkos DirnerTestInstance* ShaderTextureFunctionCase::createInstance (Context& context) const 87908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 88008a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(m_evaluator != DE_NULL); 88108a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(m_uniformSetup != DE_NULL); 88208a3fca4026822a0f753c737b38553231926d8deAkos Dirner return new ShaderTextureFunctionInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_lookupSpec, m_textureSpec, m_lookupParams); 88308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 88408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 88508a3fca4026822a0f753c737b38553231926d8deAkos Dirnervoid ShaderTextureFunctionCase::initShaderSources (void) 88608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 88708a3fca4026822a0f753c737b38553231926d8deAkos Dirner Function function = m_lookupSpec.function; 88808a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isVtxCase = m_isVertexCase; 88908a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isProj = functionHasProj(function); 89008a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isGrad = functionHasGrad(function); 89108a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isShadow = m_textureSpec.sampler.compare != tcu::Sampler::COMPAREMODE_NONE; 89208a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool is2DProj4 = !isShadow && m_textureSpec.type == TEXTURETYPE_2D && (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJGRAD); 89308a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool isIntCoord = function == FUNCTION_TEXELFETCH; 89408a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool hasLodBias = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias; 89508a3fca4026822a0f753c737b38553231926d8deAkos Dirner int texCoordComps = m_textureSpec.type == TEXTURETYPE_2D ? 2 : 3; 89608a3fca4026822a0f753c737b38553231926d8deAkos Dirner int extraCoordComps = (isProj ? (is2DProj4 ? 2 : 1) : 0) + (isShadow ? 1 : 0); 89708a3fca4026822a0f753c737b38553231926d8deAkos Dirner glu::DataType coordType = glu::getDataTypeFloatVec(texCoordComps+extraCoordComps); 89808a3fca4026822a0f753c737b38553231926d8deAkos Dirner glu::Precision coordPrec = glu::PRECISION_HIGHP; 89908a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* coordTypeName = glu::getDataTypeName(coordType); 90008a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* coordPrecName = glu::getPrecisionName(coordPrec); 90108a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_textureSpec.format); 90208a3fca4026822a0f753c737b38553231926d8deAkos Dirner glu::DataType samplerType = glu::TYPE_LAST; 90308a3fca4026822a0f753c737b38553231926d8deAkos Dirner glu::DataType gradType = (m_textureSpec.type == TEXTURETYPE_CUBE_MAP || m_textureSpec.type == TEXTURETYPE_3D) ? glu::TYPE_FLOAT_VEC3 : glu::TYPE_FLOAT_VEC2; 90408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* gradTypeName = glu::getDataTypeName(gradType); 90508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* baseFuncName = DE_NULL; 90608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 90708a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(!isGrad || !hasLodBias); 90808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 90908a3fca4026822a0f753c737b38553231926d8deAkos Dirner switch (m_textureSpec.type) 91008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 91108a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_2D: samplerType = isShadow ? glu::TYPE_SAMPLER_2D_SHADOW : glu::getSampler2DType(texFmt); break; 91208a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_CUBE_MAP: samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_SHADOW : glu::getSamplerCubeType(texFmt); break; 91308a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_2D_ARRAY: samplerType = isShadow ? glu::TYPE_SAMPLER_2D_ARRAY_SHADOW : glu::getSampler2DArrayType(texFmt); break; 91408a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_3D: DE_ASSERT(!isShadow); samplerType = glu::getSampler3DType(texFmt); break; 91508a3fca4026822a0f753c737b38553231926d8deAkos Dirner default: 91608a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(DE_FALSE); 91708a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 91808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 91908a3fca4026822a0f753c737b38553231926d8deAkos Dirner switch (m_lookupSpec.function) 92008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 92108a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTURE: baseFuncName = "texture"; break; 92208a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREPROJ: baseFuncName = "textureProj"; break; 92308a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREPROJ3: baseFuncName = "textureProj"; break; 92408a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTURELOD: baseFuncName = "textureLod"; break; 92508a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREPROJLOD: baseFuncName = "textureProjLod"; break; 92608a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREPROJLOD3: baseFuncName = "textureProjLod"; break; 92708a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREGRAD: baseFuncName = "textureGrad"; break; 92808a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREPROJGRAD: baseFuncName = "textureProjGrad"; break; 92908a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXTUREPROJGRAD3: baseFuncName = "textureProjGrad"; break; 93008a3fca4026822a0f753c737b38553231926d8deAkos Dirner case FUNCTION_TEXELFETCH: baseFuncName = "texelFetch"; break; 93108a3fca4026822a0f753c737b38553231926d8deAkos Dirner default: 93208a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(DE_FALSE); 93308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 93408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 93508a3fca4026822a0f753c737b38553231926d8deAkos Dirner std::ostringstream vert; 93608a3fca4026822a0f753c737b38553231926d8deAkos Dirner std::ostringstream frag; 93708a3fca4026822a0f753c737b38553231926d8deAkos Dirner std::ostringstream& op = isVtxCase ? vert : frag; 93808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 93908a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "#version 310 es\n" 94008a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "layout(location = 0) in highp vec4 a_position;\n" 94108a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "layout(location = 4) in " << coordPrecName << " " << coordTypeName << " a_in0;\n"; 94208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 94308a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isGrad) 94408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 94508a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 5) in " << coordPrecName << " " << gradTypeName << " a_in1;\n"; 94608a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 6) in " << coordPrecName << " " << gradTypeName << " a_in2;\n"; 94708a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 94808a3fca4026822a0f753c737b38553231926d8deAkos Dirner else if (hasLodBias) 94908a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 5) in " << coordPrecName << " float a_in1;\n"; 95008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 95108a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "#version 310 es\n" 95208a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "layout(location = 0) out mediump vec4 o_color;\n"; 95308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 95408a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isVtxCase) 95508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 95608a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 0) out mediump vec4 v_color;\n"; 95708a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "layout(location = 0) in mediump vec4 v_color;\n"; 95808a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 95908a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 96008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 96108a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 0) out " << coordPrecName << " " << coordTypeName << " v_texCoord;\n"; 96208a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "layout(location = 0) in " << coordPrecName << " " << coordTypeName << " v_texCoord;\n"; 96308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 96408a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isGrad) 96508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 96608a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 1) out " << coordPrecName << " " << gradTypeName << " v_gradX;\n"; 96708a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 2) out " << coordPrecName << " " << gradTypeName << " v_gradY;\n"; 96808a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "layout(location = 1) in " << coordPrecName << " " << gradTypeName << " v_gradX;\n"; 96908a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "layout(location = 2) in " << coordPrecName << " " << gradTypeName << " v_gradY;\n"; 97008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 97108a3fca4026822a0f753c737b38553231926d8deAkos Dirner else if (hasLodBias) 97208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 97308a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "layout(location = 1) out " << coordPrecName << " float v_lodBias;\n"; 97408a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "layout(location = 1) in " << coordPrecName << " float v_lodBias;\n"; 97508a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 97608a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 97708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 97808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Uniforms 97908a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << "layout(set = 0, binding = 0) uniform highp " << glu::getDataTypeName(samplerType) << " u_sampler;\n" 98008a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "layout(set = 0, binding = 1) uniform buf0 { highp vec4 u_scale; };\n" 98108a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "layout(set = 0, binding = 2) uniform buf1 { highp vec4 u_bias; };\n"; 98208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 98308a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "\nvoid main()\n{\n" 98408a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "\tgl_Position = a_position;\n"; 98508a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "\nvoid main()\n{\n"; 98608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 98708a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isVtxCase) 98808a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "\tv_color = "; 98908a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 99008a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "\to_color = "; 99108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 99208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Op. 99308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 99408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* texCoord = isVtxCase ? "a_in0" : "v_texCoord"; 99508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* gradX = isVtxCase ? "a_in1" : "v_gradX"; 99608a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* gradY = isVtxCase ? "a_in2" : "v_gradY"; 99708a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* lodBias = isVtxCase ? "a_in1" : "v_lodBias"; 99808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 99908a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << "vec4(" << baseFuncName; 100008a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (m_lookupSpec.useOffset) 100108a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << "Offset"; 100208a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << "(u_sampler, "; 100308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 100408a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isIntCoord) 100508a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << "ivec" << (texCoordComps+extraCoordComps) << "("; 100608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 100708a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << texCoord; 100808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 100908a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isIntCoord) 101008a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ")"; 101108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 101208a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isGrad) 101308a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", " << gradX << ", " << gradY; 101408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 101508a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (functionHasLod(function)) 101608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 101708a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isIntCoord) 101808a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", int(" << lodBias << ")"; 101908a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 102008a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", " << lodBias; 102108a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 102208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 102308a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (m_lookupSpec.useOffset) 102408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 102508a3fca4026822a0f753c737b38553231926d8deAkos Dirner int offsetComps = m_textureSpec.type == TEXTURETYPE_3D ? 3 : 2; 102608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 102708a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", ivec" << offsetComps << "("; 102808a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int ndx = 0; ndx < offsetComps; ndx++) 102908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 103008a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (ndx != 0) 103108a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", "; 103208a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << m_lookupSpec.offset[ndx]; 103308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 103408a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ")"; 103508a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 103608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 103708a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (m_lookupSpec.useBias) 103808a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", " << lodBias; 103908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 104008a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ")"; 104108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 104208a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isShadow) 104308a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ", 0.0, 0.0, 1.0)"; 104408a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 104508a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ")*u_scale + u_bias"; 104608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 104708a3fca4026822a0f753c737b38553231926d8deAkos Dirner op << ";\n"; 104808a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 104908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 105008a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isVtxCase) 105108a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "\to_color = v_color;\n"; 105208a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 105308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 105408a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "\tv_texCoord = a_in0;\n"; 105508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 105608a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (isGrad) 105708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 105808a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "\tv_gradX = a_in1;\n"; 105908a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "\tv_gradY = a_in2;\n"; 106008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 106108a3fca4026822a0f753c737b38553231926d8deAkos Dirner else if (hasLodBias) 106208a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "\tv_lodBias = a_in1;\n"; 106308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 106408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 106508a3fca4026822a0f753c737b38553231926d8deAkos Dirner vert << "}\n"; 106608a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "}\n"; 106708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 106808a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_vertShaderSource = vert.str(); 106908a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_fragShaderSource = frag.str(); 107008a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 107108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 10728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerenum QueryFunction 10738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 10748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QUERYFUNCTION_TEXTURESIZE = 0, 10758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QUERYFUNCTION_TEXTUREQUERYLOD, 10768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QUERYFUNCTION_TEXTUREQUERYLEVELS, 10778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QUERYFUNCTION_TEXTURESAMPLES, 10788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 10798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QUERYFUNCTION_LAST 10808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner}; 10818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 10828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic void checkDeviceFeatures (Context& context, TextureType textureType) 10838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 10848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (textureType == TEXTURETYPE_CUBE_ARRAY) 10858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 10868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const vk::VkPhysicalDeviceFeatures& deviceFeatures = context.getDeviceFeatures(); 10878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 10888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (!deviceFeatures.imageCubeArray) 10898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TCU_THROW(NotSupportedError, "Cube array is not supported"); 10908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 10918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 10928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 10938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerclass TextureQueryInstance : public ShaderRenderCaseInstance 109408a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 109508a3fca4026822a0f753c737b38553231926d8deAkos Dirnerpublic: 10968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance (Context& context, 109708a3fca4026822a0f753c737b38553231926d8deAkos Dirner const bool isVertexCase, 109808a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& textureSpec); 10998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual ~TextureQueryInstance (void); 110008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 110108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerprotected: 110208a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual void setupDefaultInputs (void); 110308a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual void setupUniforms (const tcu::Vec4&); 110408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner void render (void); 110608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprotected: 110808a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& m_textureSpec; 110908a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 111008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11118c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryInstance::TextureQueryInstance (Context& context, 11128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 11138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec) 111408a3fca4026822a0f753c737b38553231926d8deAkos Dirner : ShaderRenderCaseInstance (context, isVertexCase, DE_NULL, DE_NULL, DE_NULL) 111508a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_textureSpec (textureSpec) 111608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 11178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_colorFormat = vk::VK_FORMAT_R32G32B32A32_SFLOAT; 111808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner checkDeviceFeatures(m_context, m_textureSpec.type); 112008a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 112108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11228c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryInstance::~TextureQueryInstance (void) 112308a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 112408a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 112508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryInstance::setupDefaultInputs (void) 112708a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 11288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const deUint32 numVertices = 4; 11298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const float positions[] = 113008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 11318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner -1.0f, -1.0f, 0.0f, 1.0f, 11328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner -1.0f, 1.0f, 0.0f, 1.0f, 11338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 1.0f, -1.0f, 0.0f, 1.0f, 11348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 1.0f, 1.0f, 0.0f, 1.0f 113508a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 113608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner addAttribute(0u, vk::VK_FORMAT_R32G32B32A32_SFLOAT, 4 * (deUint32)sizeof(float), numVertices, positions); 113808a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 113908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryInstance::setupUniforms (const tcu::Vec4&) 114108a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 114208a3fca4026822a0f753c737b38553231926d8deAkos Dirner useSampler(0u, 0u); 114308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 114408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryInstance::render (void) 114608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 11478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const deUint32 numVertices = 4; 11488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const deUint32 numTriangles = 2; 11498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const deUint16 indices[6] = { 0, 1, 2, 2, 1, 3 }; 115008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 11518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner ShaderRenderCaseInstance::setup(); 11528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner ShaderRenderCaseInstance::render(numVertices, numTriangles, indices); 11548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 11558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic int getMaxTextureSize (TextureType type, const tcu::IVec3& textureSize) 11578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 11588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int maxSize = 0; 11598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (type) 11618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 11628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 11638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 11648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner maxSize = textureSize.x(); 11658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 11668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 11688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 11698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 11708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 11718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner maxSize = de::max(textureSize.x(), textureSize.y()); 11728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 11738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 11758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner maxSize = de::max(textureSize.x(), de::max(textureSize.y(), textureSize.z())); 11768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 11778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 11798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 11808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 11818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return maxSize; 11838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 11848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic std::string getTextureSizeString (TextureType type, const tcu::IVec3& textureSize) 11868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 11878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner std::ostringstream str; 11888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (type) 119008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 11918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 11928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner str << textureSize.x() << "x1"; 11938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 11948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 11958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 11968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 11978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner str << textureSize.x() << "x" << textureSize.y(); 11988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 11998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 120008a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_3D: 12018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner str << textureSize.x() << "x" << textureSize.y() << "x" << textureSize.z(); 12028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 12038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 12058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner str << textureSize.x() << "x1 with " << textureSize.z() << " layer(s)"; 12068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 12078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 12098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 12108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner str << textureSize.x() << "x" << textureSize.y() << " with " << textureSize.z() << " layers(s)"; 12118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 12128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 12148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 12158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 12168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 12178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return str.str(); 12198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 12208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic bool isValidCase (TextureType type, const tcu::IVec3& textureSize, int lod, int lodBase) 12228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 12238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isSquare = textureSize.x() == textureSize.y(); 12248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isCubeArray = isSquare && (textureSize.z() % 6) == 0; 12258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int maxSize = getMaxTextureSize(type, textureSize); 12268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isLodValid = (maxSize >> (lod + lodBase)) != 0; 12278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (!isLodValid) 12298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return false; 12308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (type == TEXTURETYPE_CUBE_MAP && !isSquare) 12318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return false; 12328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (type == TEXTURETYPE_CUBE_ARRAY && !isCubeArray) 12338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return false; 12348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return true; 12368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 12378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic TextureBindingSp createEmptyTexture (deUint32 format, 1239653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos TextureType type, 12408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::IVec3& textureSize, 12418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int numLevels, 12428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int lodBase, 12438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::Sampler& sampler) 12448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 12458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::TextureFormat texFmt = glu::mapGLInternalFormat(format); 12468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureBinding::Parameters params (lodBase); 12478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureBindingSp textureBinding; 12488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (type) 12508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 12518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 125308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 12548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::Texture1D> texture (new tcu::Texture1D(texFmt, textureSize.x())); 125508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 125708a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture->allocLevel(level); 125808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 126008a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 126108a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 126208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 126308a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_2D: 126408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 12658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::Texture2D> texture (new tcu::Texture2D(texFmt, textureSize.x(), textureSize.y())); 126608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 126808a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture->allocLevel(level); 126908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 12718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 12728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 127308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 12758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 12768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::Texture3D> texture (new tcu::Texture3D(texFmt, textureSize.x(), textureSize.y(), textureSize.z())); 12778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 12798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner texture->allocLevel(level); 12808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 12818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 128208a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 128308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 128408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 128508a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_CUBE_MAP: 128608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 12878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TextureCube> texture (new tcu::TextureCube(texFmt, textureSize.x())); 128808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 129008a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int face = 0; face < tcu::CUBEFACE_LAST; face++) 129108a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture->allocLevel((tcu::CubeFace)face, level); 129208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 12948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 12958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 129608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 12978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 12988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 12998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::Texture1DArray> texture (new tcu::Texture1DArray(texFmt, textureSize.x(), textureSize.z())); 13008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 13028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner texture->allocLevel(level); 13038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 130508a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 130608a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 130708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 130808a3fca4026822a0f753c737b38553231926d8deAkos Dirner case TEXTURETYPE_2D_ARRAY: 130908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 13108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::Texture2DArray> texture (new tcu::Texture2DArray(texFmt, textureSize.x(), textureSize.y(), textureSize.z())); 131108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 13128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 131308a3fca4026822a0f753c737b38553231926d8deAkos Dirner texture->allocLevel(level); 131408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 13158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 13168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 13178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 13188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 13208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 13218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TextureCubeArray> texture (new tcu::TextureCubeArray(texFmt, textureSize.x(), textureSize.z())); 13228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int level = 0; level < numLevels; level++) 13248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner texture->allocLevel(level); 132508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 13268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = TextureBindingSp(new TextureBinding(texture.release(), sampler)); 132708a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 132808a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 132908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 133008a3fca4026822a0f753c737b38553231926d8deAkos Dirner default: 133108a3fca4026822a0f753c737b38553231926d8deAkos Dirner DE_ASSERT(false); 133208a3fca4026822a0f753c737b38553231926d8deAkos Dirner break; 133308a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 133408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 133508a3fca4026822a0f753c737b38553231926d8deAkos Dirner textureBinding->setParameters(params); 13368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return textureBinding; 13378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 13388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic inline glu::DataType getTextureSizeFuncResultType (TextureType textureType) 13408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 13418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (textureType) 13428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 13438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 13448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return glu::TYPE_INT; 13458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 13478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 13488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 13498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return glu::TYPE_INT_VEC2; 13508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 13528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 13538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 13548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return glu::TYPE_INT_VEC3; 13558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 13578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 13588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return glu::TYPE_LAST; 13598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 13608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 13618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerclass TextureSizeInstance : public TextureQueryInstance 13638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 13648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerpublic: 13658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureSizeInstance (Context& context, 13668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 13678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec); 13688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual ~TextureSizeInstance (void); 13698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual tcu::TestStatus iterate (void); 13718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprotected: 13738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual void setupUniforms (const tcu::Vec4& constCoords); 13748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprivate: 13768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner struct TestSize 13778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 13788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec3 textureSize; 13798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int lod; 13808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int lodBase; 13818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec3 expectedSize; 13828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 13838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner void initTexture (void); 13858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner bool testTextureSize (void); 13868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TestSize m_testSize; 13888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec3 m_expectedSize; 13898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int m_iterationCounter; 13908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner}; 13918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 13928c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureSizeInstance::TextureSizeInstance (Context& context, 13938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 13948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec) 13958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner : TextureQueryInstance (context, isVertexCase, textureSpec) 13968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_testSize () 13978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_expectedSize () 13988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_iterationCounter (0) 13998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 14008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner deMemset(&m_testSize, 0, sizeof(TestSize)); 14018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_renderSize = tcu::UVec2(1, 1); 14038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 14048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14058c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureSizeInstance::~TextureSizeInstance (void) 14068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 14078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 14088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureSizeInstance::setupUniforms (const tcu::Vec4& constCoords) 14108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 14118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance::setupUniforms(constCoords); 14128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner addUniform(1u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(int), &m_testSize.lod); 14138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 14148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureSizeInstance::initTexture (void) 14168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 14178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 14188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int numLevels = m_testSize.lod + m_testSize.lodBase + 1; 14198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureBindingSp textureBinding; 14208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Testing image size " << getTextureSizeString(m_textureSpec.type, m_testSize.textureSize) << tcu::TestLog::EndMessage; 14228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Lod: " << m_testSize.lod << ", base level: " << m_testSize.lodBase << tcu::TestLog::EndMessage; 14238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_textureSpec.type) 14258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 14268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 14278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << "x" << m_testSize.expectedSize.y() << "x" << m_testSize.expectedSize.z() << tcu::TestLog::EndMessage; 14288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 14318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << "x" << m_testSize.expectedSize.y() << tcu::TestLog::EndMessage; 14328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 14358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << "x" << m_testSize.expectedSize.y() << tcu::TestLog::EndMessage; 14368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 14398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << "x" << m_testSize.expectedSize.y() << " and " << m_testSize.textureSize.z() << " layer(s)" << tcu::TestLog::EndMessage; 14408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 14438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << "x" << m_testSize.expectedSize.y() << " and " << (m_testSize.textureSize.z() / 6) << " cube(s)" << tcu::TestLog::EndMessage; 14448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 14478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << tcu::TestLog::EndMessage; 14488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 14518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expecting: " << m_testSize.expectedSize.x() << " and " << m_testSize.textureSize.z() << " layer(s)" << tcu::TestLog::EndMessage; 14528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 14558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 14568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 14578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 14588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = createEmptyTexture(m_textureSpec.format, m_textureSpec.type, m_testSize.textureSize, numLevels, m_testSize.lodBase, m_textureSpec.sampler); 14608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 14618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_textures.clear(); 146208a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_textures.push_back(textureBinding); 146308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 146408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 146508a3fca4026822a0f753c737b38553231926d8deAkos Dirnertcu::TestStatus TextureSizeInstance::iterate (void) 146608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 146708a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TestSize testSizes[] = 146808a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 146908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(1, 2, 1), 0, 0, tcu::IVec3(1, 2, 1) }, 14708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 2, 1), 1, 0, tcu::IVec3(1, 1, 1) }, 147108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 147208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(1, 3, 2), 0, 0, tcu::IVec3(1, 3, 2) }, 147308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(1, 3, 2), 1, 0, tcu::IVec3(1, 1, 1) }, 147408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 147508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 0, 0, tcu::IVec3(100, 31, 18) }, 147608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 1, 0, tcu::IVec3(50, 15, 9) }, 147708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 2, 0, tcu::IVec3(25, 7, 4) }, 147808a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 3, 0, tcu::IVec3(12, 3, 2) }, 147908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 4, 0, tcu::IVec3(6, 1, 1) }, 148008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 5, 0, tcu::IVec3(3, 1, 1) }, 148108a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 6, 0, tcu::IVec3(1, 1, 1) }, 148208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 148308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 0, 0, tcu::IVec3(100, 128, 32) }, 148408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 1, 0, tcu::IVec3(50, 64, 16) }, 148508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 2, 0, tcu::IVec3(25, 32, 8) }, 148608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 3, 0, tcu::IVec3(12, 16, 4) }, 148708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 4, 0, tcu::IVec3(6, 8, 2) }, 148808a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 5, 0, tcu::IVec3(3, 4, 1) }, 148908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 6, 0, tcu::IVec3(1, 2, 1) }, 149008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 128, 32), 7, 0, tcu::IVec3(1, 1, 1) }, 149108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 149208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // pow 2 149308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 0, 0, tcu::IVec3(128, 64, 32) }, 149408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 1, 0, tcu::IVec3(64, 32, 16) }, 149508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 2, 0, tcu::IVec3(32, 16, 8) }, 149608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 3, 0, tcu::IVec3(16, 8, 4) }, 149708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 4, 0, tcu::IVec3(8, 4, 2) }, 149808a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 5, 0, tcu::IVec3(4, 2, 1) }, 149908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 6, 0, tcu::IVec3(2, 1, 1) }, 150008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 7, 0, tcu::IVec3(1, 1, 1) }, 150108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 150208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // w == h 150308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(1, 1, 1), 0, 0, tcu::IVec3(1, 1, 1) }, 150408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(64, 64, 64), 0, 0, tcu::IVec3(64, 64, 64) }, 150508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(64, 64, 64), 1, 0, tcu::IVec3(32, 32, 32) }, 150608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(64, 64, 64), 2, 0, tcu::IVec3(16, 16, 16) }, 150708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(64, 64, 64), 3, 0, tcu::IVec3(8, 8, 8) }, 150808a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(64, 64, 64), 4, 0, tcu::IVec3(4, 4, 4) }, 150908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 151008a3fca4026822a0f753c737b38553231926d8deAkos Dirner // with lod base 151108a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(100, 31, 18), 3, 1, tcu::IVec3(6, 1, 1) }, 151208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(128, 64, 32), 3, 1, tcu::IVec3(8, 4, 2) }, 151308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { tcu::IVec3(64, 64, 64), 1, 1, tcu::IVec3(16, 16, 16) }, 15148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 15158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // w == h and d % 6 == 0 (for cube array) 15168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 1, 6), 0, 0, tcu::IVec3(1, 1, 6) }, 15178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 0, 0, tcu::IVec3(32, 32, 12) }, 15188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 0, 1, tcu::IVec3(16, 16, 6) }, 15198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 1, 0, tcu::IVec3(16, 16, 6) }, 15208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 2, 0, tcu::IVec3(8, 8, 3) }, 15218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 3, 0, tcu::IVec3(4, 4, 1) }, 15228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 4, 0, tcu::IVec3(2, 2, 1) }, 15238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 5, 0, tcu::IVec3(1, 1, 1) }, 152408a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 152508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const int lastIterationIndex = DE_LENGTH_OF_ARRAY(testSizes) + 1; 152608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 152708a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_iterationCounter++; 152808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 152908a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (m_iterationCounter == lastIterationIndex) 153008a3fca4026822a0f753c737b38553231926d8deAkos Dirner return tcu::TestStatus::pass("Pass"); 153108a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 153208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 153308a3fca4026822a0f753c737b38553231926d8deAkos Dirner // set current test size 153408a3fca4026822a0f753c737b38553231926d8deAkos Dirner m_testSize = testSizes[m_iterationCounter - 1]; 153508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 153608a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (!testTextureSize()) 15378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::fail("Got unexpected result"); 153808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 153908a3fca4026822a0f753c737b38553231926d8deAkos Dirner return tcu::TestStatus::incomplete(); 154008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 154108a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 154208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 154308a3fca4026822a0f753c737b38553231926d8deAkos Dirnerbool TextureSizeInstance::testTextureSize (void) 154408a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 154508a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 154608a3fca4026822a0f753c737b38553231926d8deAkos Dirner bool success = true; 154708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 15488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // skip incompatible cases 15498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (!isValidCase(m_textureSpec.type, m_testSize.textureSize, m_testSize.lod, m_testSize.lodBase)) 155008a3fca4026822a0f753c737b38553231926d8deAkos Dirner return true; 155108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 155208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // setup texture 155308a3fca4026822a0f753c737b38553231926d8deAkos Dirner initTexture(); 155408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 15558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // determine expected texture size 15568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_textureSpec.type) 155708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 15588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 15598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 15608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 15618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 15628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_expectedSize = m_testSize.expectedSize; 15638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 156408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 15658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 15668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_expectedSize = tcu::IVec3(m_testSize.expectedSize.x(), m_testSize.textureSize.z(), 0); 15678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 156808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 15698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 15708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_expectedSize = tcu::IVec3(m_testSize.expectedSize.x(), m_testSize.expectedSize.y(), m_testSize.textureSize.z()); 15718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 157208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 15738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 15748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_expectedSize = tcu::IVec3(m_testSize.expectedSize.x(), m_testSize.expectedSize.y(), m_testSize.textureSize.z() / 6); 15758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 15768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 15778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 15788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 15798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 15808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 15818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 15828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // render 15838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance::render(); 15848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 15858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // test 15868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 15878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::TextureLevel& result = getResultImage(); 15888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec4 output = result.getAccess().getPixelInt(0, 0); 15898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int resultComponents = glu::getDataTypeScalarSize(getTextureSizeFuncResultType(m_textureSpec.type)); 15908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 15918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < resultComponents; ndx++) 15928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 15938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (output[ndx] != m_expectedSize[ndx]) 15948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 15958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner success = false; 15968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 15978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 15988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 15998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (success) 16018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 16028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // success 16038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Passed" << tcu::TestLog::EndMessage; 16048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 16058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner else 16068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 16078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // failure 16088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner std::stringstream resultSizeStr; 16098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (resultComponents) 16108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 16118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case 1: 16128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner resultSizeStr << output[0]; 16138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 16148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case 2: 16158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner resultSizeStr << output.toWidth<2>(); 16168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 16178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case 3: 16188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner resultSizeStr << output.toWidth<3>(); 16198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 16208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 16218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 16228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 16238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 16248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Result: " << resultSizeStr.str() << tcu::TestLog::EndMessage; 16258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Failed" << tcu::TestLog::EndMessage; 16268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 16278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 16288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << tcu::TestLog::EndMessage; 16308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return success; 16328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 16338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic vk::VkImageType getVkImageType (TextureType type) 16358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 16368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (type) 16378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 16388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 16398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 16408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return vk::VK_IMAGE_TYPE_1D; 16418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 16438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 16448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 16458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 16468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return vk::VK_IMAGE_TYPE_2D; 16478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 16498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return vk::VK_IMAGE_TYPE_3D; 16508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 16528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 16538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return (vk::VkImageType)0; 16548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 16558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 16568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerclass TextureSamplesInstance : public TextureQueryInstance 16588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 16598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerpublic: 16608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureSamplesInstance (Context& context, 16618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 16628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec); 16638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual ~TextureSamplesInstance (void); 16648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual tcu::TestStatus iterate (void); 16668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprivate: 16688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner void initTexture (void); 16698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int m_iterationCounter; 16718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vector<vk::VkSampleCountFlagBits> m_iterations; 16728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner}; 16738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16748c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureSamplesInstance::TextureSamplesInstance (Context& context, 16758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 16768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec) 16778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner : TextureQueryInstance (context, isVertexCase, textureSpec) 16788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_iterationCounter (0) 16798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 16808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_renderSize = tcu::UVec2(1, 1); 16818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // determine available sample counts 16838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 16848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const vk::VkFormat format = vk::mapTextureFormat(glu::mapGLInternalFormat(m_textureSpec.format)); 16858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const vk::VkImageType imageType = getVkImageType(m_textureSpec.type); 16868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VkImageFormatProperties properties; 16878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 16888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(), 16898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner format, 16908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner imageType, 16918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_IMAGE_TILING_OPTIMAL, 16928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_IMAGE_USAGE_SAMPLED_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT, 16938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner (vk::VkImageCreateFlags)0, 16948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner &properties) == vk::VK_ERROR_FORMAT_NOT_SUPPORTED) 16958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TCU_THROW(NotSupportedError, "Format not supported"); 16968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 169746c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // NOTE: The test case initializes MS images (for all supported N of samples), runs a program 169846c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // which invokes OpImageQuerySamples against the image and checks the result. 169946c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // 170046c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // Now, in the SPIR-V spec for the very operation we have the following language: 170146c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // 170246c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // OpImageQuerySamples 170346c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // Query the number of samples available per texel fetch in a multisample image. 170446c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // Result Type must be a scalar integer type. 170546c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // The result is the number of samples. 170646c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // Image must be an object whose type is OpTypeImage. 170746c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // Its Dim operand must be one of 2D and **MS of 1(multisampled). 170846c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // 170946c7c2729f7941bbe8e50d3919f1b75131e34b89Dominik Witczak // "MS of 1" implies the image must not be single-sample, meaning we must exclude 17101084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner // VK_SAMPLE_COUNT_1_BIT in the sampleFlags array below, and may have to skip further testing. 17118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const vk::VkSampleCountFlagBits sampleFlags[] = 17128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 17138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_SAMPLE_COUNT_2_BIT, 17148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_SAMPLE_COUNT_4_BIT, 17158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_SAMPLE_COUNT_8_BIT, 17168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_SAMPLE_COUNT_16_BIT, 17178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_SAMPLE_COUNT_32_BIT, 17188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_SAMPLE_COUNT_64_BIT 17198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 17208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(sampleFlags); samplesNdx++) 17228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 17238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const vk::VkSampleCountFlagBits& flag = sampleFlags[samplesNdx]; 17248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if ((properties.sampleCounts & flag) != 0) 17268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_iterations.push_back(flag); 17278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 17288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17291084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner if (m_iterations.empty()) 17301084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner { 17311084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner // Sampled images of integer formats may support only 1 sample. Exit the test with "Not supported" in these cases. 17321084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner if (tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER || 17331084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 17341084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner { 17351084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner TCU_THROW(NotSupportedError, "Skipping validation of integer formats as only VK_SAMPLE_COUNT_1_BIT is supported."); 17361084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner } 17371084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner 17381084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner DE_ASSERT(false); 17391084d0adc0bf29252b46b5d4bd4f2e3abed508d7Jorg Wagner } 17408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 17418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // setup texture 17438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner initTexture(); 17448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 17458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17468c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureSamplesInstance::~TextureSamplesInstance (void) 17478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 17488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 17498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnertcu::TestStatus TextureSamplesInstance::iterate (void) 17518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 17528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 17538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // update samples count 17558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 17568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(m_textures.size() == 1); 17578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureBinding::Parameters params = m_textures[0]->getParameters(); 17598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 1760efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan params.initialization = TextureBinding::INIT_CLEAR; 1761efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan params.samples = m_iterations[m_iterationCounter]; 17628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expected samples: " << m_iterations[m_iterationCounter] << tcu::TestLog::EndMessage; 17638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_textures[0]->setParameters(params); 17658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 17668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // render 17688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance::render(); 17698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // test 17718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 17728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::TextureLevel& result = getResultImage(); 17738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec4 output = result.getAccess().getPixelInt(0, 0); 17748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (output.x() == (int)m_iterations[m_iterationCounter]) 17768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 17778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // success 17788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Passed" << tcu::TestLog::EndMessage; 17798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 17808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner else 17818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 17828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // failure 17838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Result: " << output.x() << tcu::TestLog::EndMessage; 17848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Failed" << tcu::TestLog::EndMessage; 17858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::fail("Got unexpected result"); 17868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 17878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_iterationCounter++; 17898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_iterationCounter == (int)m_iterations.size()) 17908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::pass("Pass"); 17918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner else 17928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::incomplete(); 17938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 17948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 17958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 17968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureSamplesInstance::initTexture (void) 17978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 17988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 17998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec3 textureSize (m_textureSpec.width, m_textureSpec.height, m_textureSpec.depth); 18008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureBindingSp textureBinding; 18018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(m_textures.empty()); 18038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(m_textureSpec.type == TEXTURETYPE_2D || m_textureSpec.type == TEXTURETYPE_2D_ARRAY); 18048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Image size: " << getTextureSizeString(m_textureSpec.type, textureSize) << tcu::TestLog::EndMessage; 18068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = createEmptyTexture(m_textureSpec.format, m_textureSpec.type, textureSize, m_textureSpec.numLevels, 0 /* lodBase */, m_textureSpec.sampler); 18088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_textures.push_back(textureBinding); 18108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 18118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerclass TextureQueryLevelsInstance : public TextureQueryInstance 18138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 18148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerpublic: 18158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryLevelsInstance (Context& context, 18168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 18178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec); 18188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual ~TextureQueryLevelsInstance (void); 18198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual tcu::TestStatus iterate (void); 18218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprivate: 18238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner struct TestSize 18248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 18258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec3 textureSize; 18268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int lodBase; 18278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 18288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner void initTexture (void); 18308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner bool testTextureLevels (void); 18318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TestSize m_testSize; 18338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int m_levels; 18348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int m_iterationCounter; 18358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner}; 18368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18378c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryLevelsInstance::TextureQueryLevelsInstance (Context& context, 18388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 18398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec) 18408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner : TextureQueryInstance (context, isVertexCase, textureSpec) 18418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_testSize () 18428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_levels (0) 18438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_iterationCounter (0) 18448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 18458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner deMemset(&m_testSize, 0, sizeof(TestSize)); 18468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_renderSize = tcu::UVec2(1, 1); 18488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 18498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18508c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryLevelsInstance::~TextureQueryLevelsInstance (void) 18518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 18528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 18538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnertcu::TestStatus TextureQueryLevelsInstance::iterate (void) 18558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 18568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TestSize testSizes[] = 18578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 18588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 2, 1), 0 }, 18598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 2, 1), 1 }, 18608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 3, 2), 0 }, 18628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 3, 2), 1 }, 18638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 0 }, 18658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 1 }, 18668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 2 }, 18678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 3 }, 18688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 4 }, 18698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 5 }, 18708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 31, 18), 6 }, 18718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 0 }, 18738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 1 }, 18748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 2 }, 18758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 3 }, 18768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 4 }, 18778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 5 }, 18788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 6 }, 18798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(100, 128, 32), 7 }, 18808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // pow 2 18828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 0 }, 18838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 1 }, 18848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 2 }, 18858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 3 }, 18868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 4 }, 18878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 5 }, 18888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 6 }, 18898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(128, 64, 32), 7 }, 18908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 18918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // w == h 18928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 1, 1), 0 }, 18938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 0 }, 18948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 1 }, 18958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 2 }, 18968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 3 }, 18978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 4 }, 18988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 5 }, 18998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(64, 64, 64), 6 }, 19008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // w == h and d % 6 == 0 (for cube array) 19028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(1, 1, 6), 0 }, 19038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 0 }, 19048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 1 }, 19058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 2 }, 19068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 3 }, 19078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 4 }, 19088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { tcu::IVec3(32, 32, 12), 5 }, 19098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 19108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int lastIterationIndex = DE_LENGTH_OF_ARRAY(testSizes) + 1; 19118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_iterationCounter++; 19138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_iterationCounter == lastIterationIndex) 19158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::pass("Pass"); 19168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner else 19178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 19188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // set current test size 19198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_testSize = testSizes[m_iterationCounter - 1]; 19208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (!testTextureLevels()) 19228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::fail("Got unexpected result"); 19238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::incomplete(); 19258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 19268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 19278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerbool TextureQueryLevelsInstance::testTextureLevels (void) 19298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 19308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 19318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner bool success = true; 19328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // skip incompatible cases 19348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (!isValidCase(m_textureSpec.type, m_testSize.textureSize, 0, m_testSize.lodBase)) 19358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return true; 19368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // setup texture 19388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner initTexture(); 19398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // calculate accessible levels 19418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 19428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int mipLevels = deLog2Floor32(getMaxTextureSize(m_textureSpec.type, m_testSize.textureSize)) + 1; 19438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_levels = mipLevels - m_testSize.lodBase; 19458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(m_levels > 0); 19468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Expected levels: " << m_levels << tcu::TestLog::EndMessage; 19488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 19498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // render 19518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance::render(); 19528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // test 19548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 19558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::TextureLevel& result = getResultImage(); 19568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec4 output = result.getAccess().getPixelInt(0, 0); 19578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (output.x() == m_levels) 19598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 196008a3fca4026822a0f753c737b38553231926d8deAkos Dirner // success 196108a3fca4026822a0f753c737b38553231926d8deAkos Dirner log << tcu::TestLog::Message << "Passed" << tcu::TestLog::EndMessage; 196208a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 196308a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 196408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 196508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // failure 19668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Result: " << output.x() << tcu::TestLog::EndMessage; 196708a3fca4026822a0f753c737b38553231926d8deAkos Dirner log << tcu::TestLog::Message << "Failed" << tcu::TestLog::EndMessage; 196808a3fca4026822a0f753c737b38553231926d8deAkos Dirner success = false; 196908a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 197008a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 197108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 197208a3fca4026822a0f753c737b38553231926d8deAkos Dirner log << tcu::TestLog::Message << tcu::TestLog::EndMessage; 197308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 197408a3fca4026822a0f753c737b38553231926d8deAkos Dirner return success; 197508a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 197608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 19778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryLevelsInstance::initTexture (void) 19788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 19798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 19808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner int numLevels = m_testSize.lodBase + 1; 19818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureBindingSp textureBinding; 19828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Image size: " << getTextureSizeString(m_textureSpec.type, m_testSize.textureSize) << tcu::TestLog::EndMessage; 19848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Base level: " << m_testSize.lodBase << tcu::TestLog::EndMessage; 19858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = createEmptyTexture(m_textureSpec.format, m_textureSpec.type, m_testSize.textureSize, numLevels, m_testSize.lodBase, m_textureSpec.sampler); 19878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_textures.clear(); 19898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_textures.push_back(textureBinding); 19908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 19918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 19928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerstatic int getQueryLodFuncTextCoordComps (TextureType type) 19938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 19948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (type) 19958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 19968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 19978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 19988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return 1; 19998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 20018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 20028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return 2; 20038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 20058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 20068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 20078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return 3; 20088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 20108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 20118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return 0; 20128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 20138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 20148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerclass TextureQueryLodInstance : public TextureQueryInstance 201608a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 201708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerpublic: 20188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryLodInstance (Context& context, 20198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 20208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec); 20218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual ~TextureQueryLodInstance (void); 20228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual tcu::TestStatus iterate (void); 20248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprotected: 20268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual void setupDefaultInputs (void); 20278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprivate: 20298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner void initTexture (void); 203024631b2b56063f3c7e68639613f520d467238590Pyry Haulos float computeLevelFromLod (float computedLod) const; 20318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vector<float> computeQuadTexCoord (void) const; 20328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::Vec4 m_minCoord; 20348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::Vec4 m_maxCoord; 203524631b2b56063f3c7e68639613f520d467238590Pyry Haulos tcu::Vec2 m_lodBounds; 203624631b2b56063f3c7e68639613f520d467238590Pyry Haulos tcu::Vec2 m_levelBounds; 20378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner}; 20388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20398c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryLodInstance::TextureQueryLodInstance (Context& context, 20408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const bool isVertexCase, 20418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& textureSpec) 20428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner : TextureQueryInstance (context, isVertexCase, textureSpec) 20438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_minCoord () 20448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_maxCoord () 204524631b2b56063f3c7e68639613f520d467238590Pyry Haulos , m_lodBounds () 204624631b2b56063f3c7e68639613f520d467238590Pyry Haulos , m_levelBounds () 20478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 20488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // setup texture 20498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner initTexture(); 20508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // init min/max coords 20528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_textureSpec.type) 20538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 20548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 20558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 20568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_minCoord = Vec4(-0.2f, 0.0f, 0.0f, 0.0f); 20578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_maxCoord = Vec4( 1.5f, 0.0f, 0.0f, 0.0f); 20588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 20598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 20618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 20628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_minCoord = Vec4(-0.2f, -0.4f, 0.0f, 0.0f); 20638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_maxCoord = Vec4( 1.5f, 2.3f, 0.0f, 0.0f); 20648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 20658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 20678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_minCoord = Vec4(-1.2f, -1.4f, 0.1f, 0.0f); 20688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_maxCoord = Vec4( 1.5f, 2.3f, 2.3f, 0.0f); 20698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 20708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 20728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 20738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_minCoord = Vec4(-1.0f, -1.0f, 1.01f, 0.0f); 20748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_maxCoord = Vec4( 1.0f, 1.0f, 1.01f, 0.0f); 20758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 20768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 20788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 20798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 20808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 20818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // calculate lod and accessed level 20838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 20848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const tcu::UVec2& viewportSize = getViewportSize(); 208524631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float lodEps = (1.0f / float(1u << m_context.getDeviceProperties().limits.mipmapPrecisionBits)) + 0.008f; 20868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_textureSpec.type) 20888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 20898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D: 20908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_1D_ARRAY: 20918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 209224631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dudx = (m_maxCoord[0]-m_minCoord[0])*(float)m_textureSpec.width / (float)viewportSize[0]; 20938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 209424631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[0] = computeLodFromDerivates(LODMODE_MIN_BOUND, dudx, 0.0f)-lodEps; 209524631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[1] = computeLodFromDerivates(LODMODE_MAX_BOUND, dudx, 0.0f)+lodEps; 20968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 20978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 20988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 20998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D: 21008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_2D_ARRAY: 21018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 210224631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dudx = (m_maxCoord[0]-m_minCoord[0])*(float)m_textureSpec.width / (float)viewportSize[0]; 210324631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dvdy = (m_maxCoord[1]-m_minCoord[1])*(float)m_textureSpec.height / (float)viewportSize[1]; 21048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 210524631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[0] = computeLodFromDerivates(LODMODE_MIN_BOUND, dudx, 0.0f, 0.0f, dvdy)-lodEps; 210624631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[1] = computeLodFromDerivates(LODMODE_MAX_BOUND, dudx, 0.0f, 0.0f, dvdy)+lodEps; 21078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 21088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_MAP: 21118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_CUBE_ARRAY: 21128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 21138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // Compute LOD \note Assumes that only single side is accessed and R is constant major axis. 21148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(de::abs(m_minCoord[2] - m_maxCoord[2]) < 0.005); 21158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(de::abs(m_minCoord[0]) < de::abs(m_minCoord[2]) && de::abs(m_maxCoord[0]) < de::abs(m_minCoord[2])); 21168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(de::abs(m_minCoord[1]) < de::abs(m_minCoord[2]) && de::abs(m_maxCoord[1]) < de::abs(m_minCoord[2])); 21178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::CubeFaceFloatCoords c00 = tcu::getCubeFaceCoords(Vec3(m_minCoord[0], m_minCoord[1], m_minCoord[2])); 21198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::CubeFaceFloatCoords c10 = tcu::getCubeFaceCoords(Vec3(m_maxCoord[0], m_minCoord[1], m_minCoord[2])); 21208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::CubeFaceFloatCoords c01 = tcu::getCubeFaceCoords(Vec3(m_minCoord[0], m_maxCoord[1], m_minCoord[2])); 21218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner float dudx = (c10.s - c00.s)*(float)m_textureSpec.width / (float)viewportSize[0]; 21228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner float dvdy = (c01.t - c00.t)*(float)m_textureSpec.height / (float)viewportSize[1]; 21238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 212424631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[0] = computeLodFromDerivates(LODMODE_MIN_BOUND, dudx, 0.0f, 0.0f, dvdy)-lodEps; 212524631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[1] = computeLodFromDerivates(LODMODE_MAX_BOUND, dudx, 0.0f, 0.0f, dvdy)+lodEps; 21268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 21278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case TEXTURETYPE_3D: 21308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 213124631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dudx = (m_maxCoord[0]-m_minCoord[0])*(float)m_textureSpec.width / (float)viewportSize[0]; 213224631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dvdy = (m_maxCoord[1]-m_minCoord[1])*(float)m_textureSpec.height / (float)viewportSize[1]; 213324631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dwdx = (m_maxCoord[2]-m_minCoord[2])*0.5f*(float)m_textureSpec.depth / (float)viewportSize[0]; 213424631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float dwdy = (m_maxCoord[2]-m_minCoord[2])*0.5f*(float)m_textureSpec.depth / (float)viewportSize[1]; 21358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 213624631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[0] = computeLodFromDerivates(LODMODE_MIN_BOUND, dudx, 0.0f, dwdx, 0.0f, dvdy, dwdy)-lodEps; 213724631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_lodBounds[1] = computeLodFromDerivates(LODMODE_MAX_BOUND, dudx, 0.0f, dwdx, 0.0f, dvdy, dwdy)+lodEps; 21388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 21398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 21428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 21438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 21448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 214524631b2b56063f3c7e68639613f520d467238590Pyry Haulos 214624631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_levelBounds[0] = computeLevelFromLod(m_lodBounds[0]); 214724631b2b56063f3c7e68639613f520d467238590Pyry Haulos m_levelBounds[1] = computeLevelFromLod(m_lodBounds[1]); 21488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 21508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21518c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryLodInstance::~TextureQueryLodInstance (void) 21528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 21538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 21548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnertcu::TestStatus TextureQueryLodInstance::iterate (void) 21568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 21578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 21588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 215924631b2b56063f3c7e68639613f520d467238590Pyry Haulos log << tcu::TestLog::Message << "Expected: level in range " << m_levelBounds << ", lod in range " << m_lodBounds << tcu::TestLog::EndMessage; 21608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // render 21628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance::render(); 21638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // test 21658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 216624631b2b56063f3c7e68639613f520d467238590Pyry Haulos const tcu::TextureLevel& result = getResultImage(); 216724631b2b56063f3c7e68639613f520d467238590Pyry Haulos const tcu::Vec4 output = result.getAccess().getPixel(0, 0); 216824631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float resLevel = output.x(); 216924631b2b56063f3c7e68639613f520d467238590Pyry Haulos const float resLod = output.y(); 21708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 217124631b2b56063f3c7e68639613f520d467238590Pyry Haulos if (de::inRange(resLevel, m_levelBounds[0], m_levelBounds[1]) && de::inRange(resLod, m_lodBounds[0], m_lodBounds[1])) 21728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 21738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // success 21748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Passed" << tcu::TestLog::EndMessage; 21758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::pass("Pass"); 21768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner else 21788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 21798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // failure 218024631b2b56063f3c7e68639613f520d467238590Pyry Haulos log << tcu::TestLog::Message << "Result: level: " << resLevel << ", lod: " << resLod << tcu::TestLog::EndMessage; 21818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Failed" << tcu::TestLog::EndMessage; 21828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return tcu::TestStatus::fail("Got unexpected result"); 21838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 21858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 21868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryLodInstance::setupDefaultInputs (void) 21888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 21898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryInstance::setupDefaultInputs(); 21908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 21918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const deUint32 numVertices = 4; 21928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const vector<float> texCoord = computeQuadTexCoord(); 21938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int texCoordComps = getQueryLodFuncTextCoordComps(m_textureSpec.type); 21948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const vk::VkFormat coordFormats[] = 21958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 21968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_FORMAT_R32_SFLOAT, 21978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_FORMAT_R32G32_SFLOAT, 21988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vk::VK_FORMAT_R32G32B32_SFLOAT 21998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 22008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(de::inRange(texCoordComps, 1, 3)); 22028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT((int)texCoord.size() == texCoordComps * 4); 22038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner addAttribute(1u, coordFormats[texCoordComps - 1], (deUint32)(texCoordComps * sizeof(float)), numVertices, texCoord.data()); 22058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 22068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryLodInstance::initTexture (void) 22088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 22098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::TestLog& log = m_context.getTestContext().getLog(); 22108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::IVec3 textureSize (m_textureSpec.width, m_textureSpec.height, m_textureSpec.depth); 22118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureBindingSp textureBinding; 22128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(m_textures.empty()); 22148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner log << tcu::TestLog::Message << "Image size: " << getTextureSizeString(m_textureSpec.type, textureSize) << tcu::TestLog::EndMessage; 22168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner textureBinding = createEmptyTexture(m_textureSpec.format, m_textureSpec.type, textureSize, m_textureSpec.numLevels, 0 /* lodBase */, m_textureSpec.sampler); 22188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_textures.push_back(textureBinding); 22208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 22218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 222224631b2b56063f3c7e68639613f520d467238590Pyry Haulosfloat TextureQueryLodInstance::computeLevelFromLod (float computedLod) const 22238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 22248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int maxAccessibleLevel = m_textureSpec.numLevels - 1; 22258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // Clamp the computed LOD to the range of accessible levels. 22278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner computedLod = deFloatClamp(computedLod, 0.0f, (float)maxAccessibleLevel); 22288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // Return a value according to the min filter. 22308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_textureSpec.sampler.minFilter) 22318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 22328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case tcu::Sampler::LINEAR: 22338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case tcu::Sampler::NEAREST: 22348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return 0.0f; 22358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case tcu::Sampler::NEAREST_MIPMAP_NEAREST: 22378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case tcu::Sampler::LINEAR_MIPMAP_NEAREST: 22388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return deFloatClamp(deFloatCeil(computedLod + 0.5f) - 1.0f, 0.0f, (float)maxAccessibleLevel); 22398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case tcu::Sampler::NEAREST_MIPMAP_LINEAR: 22418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case tcu::Sampler::LINEAR_MIPMAP_LINEAR: 22428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return computedLod; 22438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 22458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 22468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return 0.0f; 22478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 22488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 22498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervector<float> TextureQueryLodInstance::computeQuadTexCoord (void) const 22518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 22528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vector<float> res; 22538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner tcu::Mat4 coordTransMat; 22548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 22568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner Vec4 s = m_maxCoord - m_minCoord; 22578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner Vec4 b = m_minCoord; 22588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner float baseCoordTrans[] = 22608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 22618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner s.x(), 0.0f, 0.f, b.x(), 22628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 0.f, s.y(), 0.f, b.y(), 22638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner s.z()/2.f, -s.z()/2.f, 0.f, s.z()/2.f + b.z(), 22648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner -s.w()/2.f, s.w()/2.f, 0.f, s.w()/2.f + b.w() 22658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 22668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner coordTransMat = tcu::Mat4(baseCoordTrans); 22688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 22698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int texCoordComps = getQueryLodFuncTextCoordComps(m_textureSpec.type); 22718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner Vec4 coords[4] = 22728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 22738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner coordTransMat * tcu::Vec4(0, 0, 0, 1), 22748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner coordTransMat * tcu::Vec4(0, 1, 0, 1), 22758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner coordTransMat * tcu::Vec4(1, 0, 0, 1), 22768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner coordTransMat * tcu::Vec4(1, 1, 0, 1) 22778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 22788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner res.resize(4 * texCoordComps); 22808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < 4; ndx++) 22828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner deMemcpy(&res[ndx * texCoordComps], coords[ndx].getPtr(), texCoordComps * sizeof(float)); 22838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return res; 22858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner} 22868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 22878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerclass TextureQueryCase : public ShaderRenderCase 22888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner{ 22898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerpublic: 22908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureQueryCase (tcu::TestContext& testCtx, 229108a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& name, 229208a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& desc, 229308a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string& samplerType, 229408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec& texture, 22958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner bool isVertexCase, 22968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QueryFunction function); 22978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner virtual ~TextureQueryCase (void); 229808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 229908a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual TestInstance* createInstance (Context& context) const; 230008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnerprotected: 23028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner void initShaderSources (void); 230308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 230408a3fca4026822a0f753c737b38553231926d8deAkos Dirner const std::string m_samplerTypeStr; 230508a3fca4026822a0f753c737b38553231926d8deAkos Dirner const TextureSpec m_textureSpec; 23068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const QueryFunction m_function; 230708a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 230808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23098c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryCase::TextureQueryCase (tcu::TestContext& testCtx, 23108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const std::string& name, 23118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const std::string& desc, 23128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const std::string& samplerType, 23138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TextureSpec& texture, 23148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner bool isVertexCase, 23158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner QueryFunction function) 231608a3fca4026822a0f753c737b38553231926d8deAkos Dirner : ShaderRenderCase (testCtx, name, desc, isVertexCase, (ShaderEvaluator*)DE_NULL, DE_NULL, DE_NULL) 231708a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_samplerTypeStr (samplerType) 231808a3fca4026822a0f753c737b38553231926d8deAkos Dirner , m_textureSpec (texture) 23198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner , m_function (function) 232008a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 23218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner initShaderSources(); 232208a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 232308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23248c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTextureQueryCase::~TextureQueryCase (void) 232508a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 232608a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 232708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23288c55aaea29fd4f9c690f8827957af80e23385e06Akos DirnerTestInstance* TextureQueryCase::createInstance (Context& context) const 232908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 23308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_function) 23318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 23328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTURESIZE: return new TextureSizeInstance(context, m_isVertexCase, m_textureSpec); 23338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTUREQUERYLOD: return new TextureQueryLodInstance(context, m_isVertexCase, m_textureSpec); 23348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTUREQUERYLEVELS: return new TextureQueryLevelsInstance(context, m_isVertexCase, m_textureSpec); 23358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTURESAMPLES: return new TextureSamplesInstance(context, m_isVertexCase, m_textureSpec); 23368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 23378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 23388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner return DE_NULL; 23398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 234008a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 234108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirnervoid TextureQueryCase::initShaderSources (void) 234308a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 23448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner std::ostringstream vert; 23458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner std::ostringstream frag; 23468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner std::ostringstream& op = m_isVertexCase ? vert : frag; 2347653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos glu::GLSLVersion version = glu::GLSL_VERSION_LAST; 234808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(m_function != QUERYFUNCTION_TEXTUREQUERYLOD || !m_isVertexCase); 235008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_function) 235208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 23538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTURESIZE: 23548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_textureSpec.type == TEXTURETYPE_1D || m_textureSpec.type == TEXTURETYPE_1D_ARRAY || m_textureSpec.type == TEXTURETYPE_CUBE_ARRAY) 23558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner version = glu::GLSL_VERSION_420; 23568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner else 23578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner version = glu::GLSL_VERSION_310_ES; 23588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 235908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTUREQUERYLOD: 23618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner version = glu::GLSL_VERSION_420; 23628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 236308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTUREQUERYLEVELS: 23658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner version = glu::GLSL_VERSION_430; 23668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 236708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTURESAMPLES: 23698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner version = glu::GLSL_VERSION_450; 23708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 237108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 23738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 23748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 23758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 237608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << glu::getGLSLVersionDeclaration(version) << "\n" 23788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner << "layout(location = 0) in highp vec4 a_position;\n"; 237908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner frag << glu::getGLSLVersionDeclaration(version) << "\n" 238108a3fca4026822a0f753c737b38553231926d8deAkos Dirner << "layout(location = 0) out mediump vec4 o_color;\n"; 238208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 238308a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (m_isVertexCase) 23848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 23858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "layout(location = 0) out mediump vec4 v_color;\n"; 238608a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "layout(location = 0) in mediump vec4 v_color;\n"; 23878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 238808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_function == QUERYFUNCTION_TEXTUREQUERYLOD) 239008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 23918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int texCoordComps = getQueryLodFuncTextCoordComps(m_textureSpec.type); 23928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const char* coordTypeName = glu::getDataTypeName(glu::getDataTypeFloatVec(texCoordComps)); 23938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 23948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "layout (location = 1) in highp " << coordTypeName << " a_texCoord;\n"; 23958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "layout (location = 0) out highp " << coordTypeName << " v_texCoord;\n"; 23968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner frag << "layout (location = 0) in highp " << coordTypeName << " v_texCoord;\n"; 239708a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 239808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 23998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // uniforms 24008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "layout(set = 0, binding = 0) uniform highp " << m_samplerTypeStr << " u_sampler;\n"; 24018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_function == QUERYFUNCTION_TEXTURESIZE) 24028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "layout(set = 0, binding = 1) uniform buf0 { highp int u_lod; };\n"; 24038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (version != glu::GLSL_VERSION_310_ES) 24058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "out gl_PerVertex {\n" 24068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner << "\tvec4 gl_Position;\n" 24078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner << "};\n"; 24088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "\nvoid main()\n{\n" 24108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner << "\tgl_Position = a_position;\n"; 24118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner frag << "\nvoid main()\n{\n"; 241208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 24138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_isVertexCase) 24148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "\tv_color = "; 241508a3fca4026822a0f753c737b38553231926d8deAkos Dirner else 24168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner frag << "\to_color = "; 24178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // op 24198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 24208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "vec4("; 24218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner switch (m_function) 24238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 24248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTURESIZE: 24258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 24268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const int resultComponents = glu::getDataTypeScalarSize(getTextureSizeFuncResultType(m_textureSpec.type)); 24278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "textureSize(u_sampler, u_lod)"; 24298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < 3 - resultComponents; ndx++) 24308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << ", 0.0"; 24318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << ", 1.0"; 24328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 24348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 24358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTUREQUERYLOD: 24378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "textureQueryLod(u_sampler, v_texCoord), 0.0, 1.0"; 24388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 24398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTUREQUERYLEVELS: 24418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "textureQueryLevels(u_sampler), 0.0, 0.0, 1.0"; 24428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 24438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner case QUERYFUNCTION_TEXTURESAMPLES: 24458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << "textureSamples(u_sampler), 0.0, 0.0, 1.0"; 24468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 244708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 24488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner default: 24498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner DE_ASSERT(false); 24508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner break; 24518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 24528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner op << ");\n"; 24548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 24558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_isVertexCase) 24578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner frag << "\to_color = v_color;\n"; 24588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner if (m_function == QUERYFUNCTION_TEXTUREQUERYLOD) 24608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "\tv_texCoord = a_texCoord;\n"; 24618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 24628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner vert << "}\n"; 246308a3fca4026822a0f753c737b38553231926d8deAkos Dirner frag << "}\n"; 246408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 24658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_vertShaderSource = vert.str(); 24668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner m_fragShaderSource = frag.str(); 246708a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 246808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 246908a3fca4026822a0f753c737b38553231926d8deAkos Dirnerclass ShaderTextureFunctionTests : public tcu::TestCaseGroup 247008a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 247108a3fca4026822a0f753c737b38553231926d8deAkos Dirnerpublic: 247208a3fca4026822a0f753c737b38553231926d8deAkos Dirner ShaderTextureFunctionTests (tcu::TestContext& context); 247308a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual ~ShaderTextureFunctionTests (void); 247408a3fca4026822a0f753c737b38553231926d8deAkos Dirner virtual void init (void); 247508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 247608a3fca4026822a0f753c737b38553231926d8deAkos Dirnerprivate: 247708a3fca4026822a0f753c737b38553231926d8deAkos Dirner ShaderTextureFunctionTests (const ShaderTextureFunctionTests&); // not allowed! 247808a3fca4026822a0f753c737b38553231926d8deAkos Dirner ShaderTextureFunctionTests& operator= (const ShaderTextureFunctionTests&); // not allowed! 247908a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 248008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 248108a3fca4026822a0f753c737b38553231926d8deAkos DirnerShaderTextureFunctionTests::ShaderTextureFunctionTests (tcu::TestContext& context) 248208a3fca4026822a0f753c737b38553231926d8deAkos Dirner : TestCaseGroup(context, "texture_functions", "Texture Access Function Tests") 248308a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 248408a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 248508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 248608a3fca4026822a0f753c737b38553231926d8deAkos DirnerShaderTextureFunctionTests::~ShaderTextureFunctionTests (void) 248708a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 248808a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 248908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 249008a3fca4026822a0f753c737b38553231926d8deAkos Dirnerenum CaseFlags 249108a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 249208a3fca4026822a0f753c737b38553231926d8deAkos Dirner VERTEX = (1<<0), 249308a3fca4026822a0f753c737b38553231926d8deAkos Dirner FRAGMENT = (1<<1), 249408a3fca4026822a0f753c737b38553231926d8deAkos Dirner BOTH = VERTEX|FRAGMENT 249508a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 249608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 249708a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstruct TexFuncCaseSpec 249808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 249908a3fca4026822a0f753c737b38553231926d8deAkos Dirner const char* name; 250008a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureLookupSpec lookupSpec; 250108a3fca4026822a0f753c737b38553231926d8deAkos Dirner TextureSpec texSpec; 250208a3fca4026822a0f753c737b38553231926d8deAkos Dirner TexEvalFunc evalFunc; 250308a3fca4026822a0f753c737b38553231926d8deAkos Dirner deUint32 flags; 250408a3fca4026822a0f753c737b38553231926d8deAkos Dirner}; 250508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 250608a3fca4026822a0f753c737b38553231926d8deAkos Dirner#define CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, USEBIAS, MINLOD, MAXLOD, USEOFFSET, OFFSET, TEXSPEC, EVALFUNC, FLAGS) \ 250708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { #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 } 250808a3fca4026822a0f753c737b38553231926d8deAkos Dirner#define GRAD_CASE_SPEC(NAME, FUNC, MINCOORD, MAXCOORD, MINDX, MAXDX, MINDY, MAXDY, USEOFFSET, OFFSET, TEXSPEC, EVALFUNC, FLAGS) \ 250908a3fca4026822a0f753c737b38553231926d8deAkos Dirner { #NAME, TextureLookupSpec(FUNC, MINCOORD, MAXCOORD, false, 0.0f, 0.0f, MINDX, MAXDX, MINDY, MAXDY, USEOFFSET, OFFSET), TEXSPEC, EVALFUNC, FLAGS } 251008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 25113fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahamclass SparseShaderTextureFunctionInstance : public ShaderTextureFunctionInstance 25123fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 25133fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahampublic: 25143fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham SparseShaderTextureFunctionInstance (Context& context, 25153fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isVertexCase, 25163fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const ShaderEvaluator& evaluator, 25173fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const UniformSetup& uniformSetup, 25183fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureLookupSpec& lookupSpec, 25193fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureSpec& textureSpec, 25203fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TexLookupParams& lookupParams, 25213fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const ImageBackingMode imageBackingMode = IMAGE_BACKING_MODE_SPARSE); 25223fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham virtual ~SparseShaderTextureFunctionInstance (void); 25233fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham}; 25243fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25253fabf9547b3e2113a74936b196c69f101ce0851bGabor AbrahamSparseShaderTextureFunctionInstance::SparseShaderTextureFunctionInstance (Context& context, 25263fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isVertexCase, 25273fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const ShaderEvaluator& evaluator, 25283fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const UniformSetup& uniformSetup, 25293fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureLookupSpec& lookupSpec, 25303fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureSpec& textureSpec, 25313fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TexLookupParams& lookupParams, 25323fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const ImageBackingMode imageBackingMode) 25333fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham : ShaderTextureFunctionInstance (context, isVertexCase, evaluator, uniformSetup, lookupSpec, textureSpec, lookupParams, imageBackingMode) 25343fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 25353fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham} 25363fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25373fabf9547b3e2113a74936b196c69f101ce0851bGabor AbrahamSparseShaderTextureFunctionInstance::~SparseShaderTextureFunctionInstance (void) 25383fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 25393fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham} 25403fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25413fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahamclass SparseShaderTextureFunctionCase : public ShaderTextureFunctionCase 25423fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 25433fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahampublic: 25443fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham SparseShaderTextureFunctionCase (tcu::TestContext& testCtx, 25453fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const std::string& name, 25463fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const std::string& desc, 25473fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureLookupSpec& lookup, 25483fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureSpec& texture, 25493fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham TexEvalFunc evalFunc, 25503fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham bool isVertexCase); 25513fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 2552653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos virtual ~SparseShaderTextureFunctionCase (void); 25533fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25543fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham virtual TestInstance* createInstance (Context& context) const; 25553fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahamprotected: 25563fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham void initShaderSources (void); 25573fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham}; 25583fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25593fabf9547b3e2113a74936b196c69f101ce0851bGabor AbrahamSparseShaderTextureFunctionCase::SparseShaderTextureFunctionCase (tcu::TestContext& testCtx, 25603fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const std::string& name, 25613fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const std::string& desc, 25623fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureLookupSpec& lookup, 25633fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const TextureSpec& texture, 25643fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham TexEvalFunc evalFunc, 25653fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham bool isVertexCase) 2566653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos : ShaderTextureFunctionCase (testCtx, name, desc, lookup, texture, evalFunc, isVertexCase) 25673fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 25683fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham initShaderSources(); 25693fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham} 25703fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25713fabf9547b3e2113a74936b196c69f101ce0851bGabor Abrahamvoid SparseShaderTextureFunctionCase::initShaderSources (void) 25723fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 25733fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const Function function = m_lookupSpec.function; 25743fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isVtxCase = m_isVertexCase; 25753fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isProj = functionHasProj(function); 25763fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isGrad = functionHasGrad(function); 25773fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isShadow = m_textureSpec.sampler.compare != tcu::Sampler::COMPAREMODE_NONE; 25783fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool is2DProj4 = !isShadow && m_textureSpec.type == TEXTURETYPE_2D && (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJGRAD); 25793fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool isIntCoord = function == FUNCTION_TEXELFETCH; 25803fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const bool hasLodBias = functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias; 25813fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const int texCoordComps = m_textureSpec.type == TEXTURETYPE_2D ? 2 : 3; 25823fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const int extraCoordComps = (isProj ? (is2DProj4 ? 2 : 1) : 0) + (isShadow ? 1 : 0); 25833fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const glu::DataType coordType = glu::getDataTypeFloatVec(texCoordComps+extraCoordComps); 25843fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const glu::Precision coordPrec = glu::PRECISION_HIGHP; 25853fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* coordTypeName = glu::getDataTypeName(coordType); 25863fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* coordPrecName = glu::getPrecisionName(coordPrec); 25873fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_textureSpec.format); 25883fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham glu::DataType samplerType = glu::TYPE_LAST; 25893fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const glu::DataType gradType = (m_textureSpec.type == TEXTURETYPE_CUBE_MAP || m_textureSpec.type == TEXTURETYPE_3D) ? glu::TYPE_FLOAT_VEC3 : glu::TYPE_FLOAT_VEC2; 25903fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* gradTypeName = glu::getDataTypeName(gradType); 25913fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* baseFuncName = DE_NULL; 25923fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25933fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham DE_ASSERT(!isGrad || !hasLodBias); 25943fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 25953fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham switch (m_textureSpec.type) 25963fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 25973fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case TEXTURETYPE_2D: samplerType = isShadow ? glu::TYPE_SAMPLER_2D_SHADOW : glu::getSampler2DType(texFmt); break; 25983fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case TEXTURETYPE_CUBE_MAP: samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_SHADOW : glu::getSamplerCubeType(texFmt); break; 25993fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case TEXTURETYPE_2D_ARRAY: samplerType = isShadow ? glu::TYPE_SAMPLER_2D_ARRAY_SHADOW : glu::getSampler2DArrayType(texFmt); break; 26003fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case TEXTURETYPE_3D: DE_ASSERT(!isShadow); samplerType = glu::getSampler3DType(texFmt); break; 26013fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham default: 26023fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham DE_ASSERT(DE_FALSE); 26033fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26043fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26053fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham // Not supported cases 26063fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham switch (m_lookupSpec.function) 26073fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26083fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case FUNCTION_TEXTURE: baseFuncName = "sparseTexture"; break; 26093fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case FUNCTION_TEXTURELOD: baseFuncName = "sparseTextureLod"; break; 26103fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case FUNCTION_TEXTUREGRAD: baseFuncName = "sparseTextureGrad"; break; 26113fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham case FUNCTION_TEXELFETCH: baseFuncName = "sparseTexelFetch"; break; 26123fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham default: 26133fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham DE_ASSERT(DE_FALSE); 26143fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26153fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26163fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham std::ostringstream vert; 26173fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham std::ostringstream frag; 26183fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham std::ostringstream& op = isVtxCase ? vert : frag; 26193fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26203fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "#version 450\n" 26213fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "#extension GL_ARB_sparse_texture2 : require\n" 26223fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "layout(location = 0) in highp vec4 a_position;\n" 26233fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "layout(location = 4) in " << coordPrecName << " " << coordTypeName << " a_in0;\n"; 26243fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26253fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isGrad) 26263fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26273fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 5) in " << coordPrecName << " " << gradTypeName << " a_in1;\n"; 26283fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 6) in " << coordPrecName << " " << gradTypeName << " a_in2;\n"; 26293fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26303fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else if (hasLodBias) 26313fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 5) in " << coordPrecName << " float a_in1;\n"; 26323fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26333fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "#version 450\n" 26343fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "#extension GL_ARB_sparse_texture2 : require\n" 26353fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "layout(location = 0) out mediump vec4 o_color;\n"; 26363fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26373fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isVtxCase) 26383fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26393fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 0) out mediump vec4 v_color;\n"; 26403fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "layout(location = 0) in mediump vec4 v_color;\n"; 26413fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26423fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 26433fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26443fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 0) out " << coordPrecName << " " << coordTypeName << " v_texCoord;\n"; 26453fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "layout(location = 0) in " << coordPrecName << " " << coordTypeName << " v_texCoord;\n"; 26463fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26473fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isGrad) 26483fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26493fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 1) out " << coordPrecName << " " << gradTypeName << " v_gradX;\n"; 26503fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 2) out " << coordPrecName << " " << gradTypeName << " v_gradY;\n"; 26513fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "layout(location = 1) in " << coordPrecName << " " << gradTypeName << " v_gradX;\n"; 26523fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "layout(location = 2) in " << coordPrecName << " " << gradTypeName << " v_gradY;\n"; 26533fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26543fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else if (hasLodBias) 26553fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26563fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "layout(location = 1) out " << coordPrecName << " float v_lodBias;\n"; 26573fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "layout(location = 1) in " << coordPrecName << " float v_lodBias;\n"; 26583fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26593fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 26603fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26613fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham // Uniforms 26623fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "layout(set = 0, binding = 0) uniform highp " << glu::getDataTypeName(samplerType) << " u_sampler;\n" 26633fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "layout(set = 0, binding = 1) uniform buf0 { highp vec4 u_scale; };\n" 26643fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "layout(set = 0, binding = 2) uniform buf1 { highp vec4 u_bias; };\n"; 26653fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26663fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "out gl_PerVertex {\n" 26673fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << " vec4 gl_Position;\n" 26683fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "};\n"; 26693fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\nvoid main()\n{\n" 26703fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham << "\tgl_Position = a_position;\n"; 26713fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "\nvoid main()\n{\n"; 26723fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26733fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham // Op. 26743fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 26753fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham // Texel declaration 26763fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isShadow) 26773fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "\tfloat texel;\n"; 26783fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 26793fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "\tvec4 texel;\n"; 26803fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26813fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* const texCoord = isVtxCase ? "a_in0" : "v_texCoord"; 26823fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* const gradX = isVtxCase ? "a_in1" : "v_gradX"; 26833fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* const gradY = isVtxCase ? "a_in2" : "v_gradY"; 26843fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham const char* const lodBias = isVtxCase ? "a_in1" : "v_lodBias"; 26853fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26863fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "\tint success = " << baseFuncName; 26873fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26883fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (m_lookupSpec.useOffset) 26893fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "Offset"; 26903fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26913fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "ARB(u_sampler, "; 26923fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26933fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isIntCoord) 26943fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "ivec" << (texCoordComps+extraCoordComps) << "("; 26953fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26963fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << texCoord; 26973fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 26983fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isIntCoord) 26993fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ")"; 27003fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27013fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isGrad) 27023fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", " << gradX << ", " << gradY; 27033fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27043fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (functionHasLod(function)) 27053fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 27063fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isIntCoord) 27073fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", int(" << lodBias << ")"; 27083fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 27093fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", " << lodBias; 27103fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 27113fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27123fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (m_lookupSpec.useOffset) 27133fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 27143fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham int offsetComps = m_textureSpec.type == TEXTURETYPE_3D ? 3 : 2; 27153fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27163fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", ivec" << offsetComps << "("; 27173fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham for (int ndx = 0; ndx < offsetComps; ndx++) 27183fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 27193fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (ndx != 0) 27203fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", "; 27213fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << m_lookupSpec.offset[ndx]; 27223fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 27233fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ")"; 27243fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 27253fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27263fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", texel"; 27273fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27283fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (m_lookupSpec.useBias) 27293fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ", " << lodBias; 27303fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27313fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << ");\n"; 27323fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27333fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham // Check sparse validity, and handle each case 27343fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "\tif (sparseTexelsResidentARB(success))\n"; 27353fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27363fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isVtxCase) 27373fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\t\tv_color = "; 27383fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 27393fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "\t\to_color = "; 27403fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27413fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isShadow) 27423fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "vec4(texel, 0.0, 0.0, 1.0);\n"; 27433fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 27443fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "vec4(texel * u_scale + u_bias);\n"; 27453fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27463fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham op << "\telse\n"; 27473fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27483fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham // This color differs from the used colors 27493fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isVtxCase) 27503fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\t\tv_color = vec4(0.54117647058, 0.16862745098, 0.8862745098, 1.0);\n"; 27513fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 27523fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "\t\to_color = vec4(0.54117647058, 0.16862745098, 0.8862745098, 1.0);\n"; 27533fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 27543fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27553fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isVtxCase) 27563fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "\to_color = v_color;\n"; 27573fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else 27583fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 27593fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\tv_texCoord = a_in0;\n"; 27603fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27613fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (isGrad) 27623fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 27633fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\tv_gradX = a_in1;\n"; 27643fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\tv_gradY = a_in2;\n"; 27653fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 27663fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham else if (hasLodBias) 27673fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "\tv_lodBias = a_in1;\n"; 27683fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 27693fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27703fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham vert << "}\n"; 27713fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham frag << "}\n"; 27723fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27733fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham m_vertShaderSource = vert.str(); 27743fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham m_fragShaderSource = frag.str(); 27753fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham} 27763fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27773fabf9547b3e2113a74936b196c69f101ce0851bGabor AbrahamSparseShaderTextureFunctionCase::~SparseShaderTextureFunctionCase () 27783fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 27793fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham} 27803fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 27813fabf9547b3e2113a74936b196c69f101ce0851bGabor AbrahamTestInstance* SparseShaderTextureFunctionCase::createInstance (Context& context) const 27823fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham{ 27833fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham DE_ASSERT(m_evaluator != DE_NULL); 27843fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham DE_ASSERT(m_uniformSetup != DE_NULL); 27853fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham return new SparseShaderTextureFunctionInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_lookupSpec, m_textureSpec, m_lookupParams); 27863fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham} 27873fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 278808a3fca4026822a0f753c737b38553231926d8deAkos Dirnerstatic void createCaseGroup (tcu::TestCaseGroup* parent, const char* groupName, const char* groupDesc, const TexFuncCaseSpec* cases, int numCases) 278908a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 279008a3fca4026822a0f753c737b38553231926d8deAkos Dirner de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(parent->getTestContext(), groupName, groupDesc)); 279108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 279208a3fca4026822a0f753c737b38553231926d8deAkos Dirner for (int ndx = 0; ndx < numCases; ndx++) 279308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 279408a3fca4026822a0f753c737b38553231926d8deAkos Dirner std::string name = cases[ndx].name; 279508a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (cases[ndx].flags & VERTEX) 27963fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 27973fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (!functionHasProj(cases[ndx].lookupSpec.function)) 27983fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham group->addChild(new SparseShaderTextureFunctionCase(parent->getTestContext(), ("sparse_" + name + "_vertex"), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, true )); 279908a3fca4026822a0f753c737b38553231926d8deAkos Dirner group->addChild(new ShaderTextureFunctionCase(parent->getTestContext(), (name + "_vertex"), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, true )); 28003fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 28013fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham 280208a3fca4026822a0f753c737b38553231926d8deAkos Dirner if (cases[ndx].flags & FRAGMENT) 28033fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham { 28043fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham if (!functionHasProj(cases[ndx].lookupSpec.function)) 28053fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham group->addChild(new SparseShaderTextureFunctionCase(parent->getTestContext(), ("sparse_" + name + "_fragment"), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, false)); 280608a3fca4026822a0f753c737b38553231926d8deAkos Dirner group->addChild(new ShaderTextureFunctionCase(parent->getTestContext(), (name + "_fragment"), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, false)); 28073fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham } 280808a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 280908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 281008a3fca4026822a0f753c737b38553231926d8deAkos Dirner parent->addChild(group.release()); 281108a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 281208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 281308a3fca4026822a0f753c737b38553231926d8deAkos Dirnervoid ShaderTextureFunctionTests::init (void) 281408a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 281508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Samplers 281608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerNearestNoMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 281708a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::NEAREST, tcu::Sampler::NEAREST, 281808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 281908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 282008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerLinearNoMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 282108a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::LINEAR, tcu::Sampler::LINEAR, 282208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 282308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 282408a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerNearestMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 282508a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST, 282608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 282708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 282808a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerLinearMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 282908a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::LINEAR_MIPMAP_NEAREST, tcu::Sampler::LINEAR, 283008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 283108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 283208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 283308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerShadowNoMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 283408a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::NEAREST, tcu::Sampler::NEAREST, 283508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_LESS, 283608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 283708a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerShadowMipmap (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 283808a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST, 283908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_LESS, 284008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 284108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 284208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const tcu::Sampler samplerTexelFetch (tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL, 284308a3fca4026822a0f753c737b38553231926d8deAkos Dirner tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST, 2844392eadf5037ad2c363c3ad02e982435f938f9da1Akos Dirner 00.0f /* LOD threshold */, true /* normalized coords */, tcu::Sampler::COMPAREMODE_NONE, 284508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 0 /* cmp channel */, tcu::Vec4(0.0f) /* border color */, true /* seamless cube map */); 284608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 284708a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Default textures. 284808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Type Format W H D L Sampler 284908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DFixed (TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 1, samplerLinearNoMipmap); 285008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DFloat (TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 1, samplerLinearNoMipmap); 285108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DInt (TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 1, samplerNearestNoMipmap); 285208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DUint (TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 1, samplerNearestNoMipmap); 285308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DMipmapFixed (TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 9, samplerLinearMipmap); 285408a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DMipmapFloat (TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 9, samplerLinearMipmap); 285508a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DMipmapInt (TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 9, samplerNearestMipmap); 285608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DMipmapUint (TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 9, samplerNearestMipmap); 285708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 28588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex2DShadow (TEXTURETYPE_2D, GL_DEPTH_COMPONENT16, 256, 256, 1, 1, samplerShadowNoMipmap); 285908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DMipmapShadow (TEXTURETYPE_2D, GL_DEPTH_COMPONENT16, 256, 256, 1, 9, samplerShadowMipmap); 286008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 286108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DTexelFetchFixed (TEXTURETYPE_2D, GL_RGBA8, 256, 256, 1, 9, samplerTexelFetch); 286208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DTexelFetchFloat (TEXTURETYPE_2D, GL_RGBA16F, 256, 256, 1, 9, samplerTexelFetch); 286308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DTexelFetchInt (TEXTURETYPE_2D, GL_RGBA8I, 256, 256, 1, 9, samplerTexelFetch); 286408a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DTexelFetchUint (TEXTURETYPE_2D, GL_RGBA8UI, 256, 256, 1, 9, samplerTexelFetch); 286508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 286608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeFixed (TEXTURETYPE_CUBE_MAP, GL_RGBA8, 256, 256, 1, 1, samplerLinearNoMipmap); 286708a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeFloat (TEXTURETYPE_CUBE_MAP, GL_RGBA16F, 256, 256, 1, 1, samplerLinearNoMipmap); 286808a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeInt (TEXTURETYPE_CUBE_MAP, GL_RGBA8I, 256, 256, 1, 1, samplerNearestNoMipmap); 286908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeUint (TEXTURETYPE_CUBE_MAP, GL_RGBA8UI, 256, 256, 1, 1, samplerNearestNoMipmap); 287008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeMipmapFixed (TEXTURETYPE_CUBE_MAP, GL_RGBA8, 256, 256, 1, 9, samplerLinearMipmap); 287108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeMipmapFloat (TEXTURETYPE_CUBE_MAP, GL_RGBA16F, 128, 128, 1, 8, samplerLinearMipmap); 287208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeMipmapInt (TEXTURETYPE_CUBE_MAP, GL_RGBA8I, 256, 256, 1, 9, samplerNearestMipmap); 287308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeMipmapUint (TEXTURETYPE_CUBE_MAP, GL_RGBA8UI, 256, 256, 1, 9, samplerNearestMipmap); 287408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 287508a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeShadow (TEXTURETYPE_CUBE_MAP, GL_DEPTH_COMPONENT16, 256, 256, 1, 1, samplerShadowNoMipmap); 287608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec texCubeMipmapShadow (TEXTURETYPE_CUBE_MAP, GL_DEPTH_COMPONENT16, 256, 256, 1, 9, samplerShadowMipmap); 287708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 287808a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayFixed (TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 1, samplerLinearNoMipmap); 287908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayFloat (TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 1, samplerLinearNoMipmap); 288008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayInt (TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 1, samplerNearestNoMipmap); 288108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayUint (TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 1, samplerNearestNoMipmap); 288208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayMipmapFixed (TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 8, samplerLinearMipmap); 288308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayMipmapFloat (TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 8, samplerLinearMipmap); 288408a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayMipmapInt (TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 8, samplerNearestMipmap); 288508a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayMipmapUint (TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 8, samplerNearestMipmap); 288608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 288708a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayShadow (TEXTURETYPE_2D_ARRAY, GL_DEPTH_COMPONENT16, 128, 128, 4, 1, samplerShadowNoMipmap); 288808a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayMipmapShadow (TEXTURETYPE_2D_ARRAY, GL_DEPTH_COMPONENT16, 128, 128, 4, 8, samplerShadowMipmap); 288908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 289008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayTexelFetchFixed (TEXTURETYPE_2D_ARRAY, GL_RGBA8, 128, 128, 4, 8, samplerTexelFetch); 289108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayTexelFetchFloat (TEXTURETYPE_2D_ARRAY, GL_RGBA16F, 128, 128, 4, 8, samplerTexelFetch); 289208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayTexelFetchInt (TEXTURETYPE_2D_ARRAY, GL_RGBA8I, 128, 128, 4, 8, samplerTexelFetch); 289308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex2DArrayTexelFetchUint (TEXTURETYPE_2D_ARRAY, GL_RGBA8UI, 128, 128, 4, 8, samplerTexelFetch); 289408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 289508a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DFixed (TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 1, samplerLinearNoMipmap); 289608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DFloat (TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 1, samplerLinearNoMipmap); 289708a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DInt (TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 1, samplerNearestNoMipmap); 289808a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DUint (TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 1, samplerNearestNoMipmap); 289908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DMipmapFixed (TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 7, samplerLinearMipmap); 290008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DMipmapFloat (TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 7, samplerLinearMipmap); 290108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DMipmapInt (TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 7, samplerNearestMipmap); 290208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DMipmapUint (TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 7, samplerNearestMipmap); 290308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 290408a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DTexelFetchFixed (TEXTURETYPE_3D, GL_RGBA8, 64, 32, 32, 7, samplerTexelFetch); 290508a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DTexelFetchFloat (TEXTURETYPE_3D, GL_RGBA16F, 64, 32, 32, 7, samplerTexelFetch); 290608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DTexelFetchInt (TEXTURETYPE_3D, GL_RGBA8I, 64, 32, 32, 7, samplerTexelFetch); 290708a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TextureSpec tex3DTexelFetchUint (TEXTURETYPE_3D, GL_RGBA8UI, 64, 32, 32, 7, samplerTexelFetch); 290808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 29098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DFixed (TEXTURETYPE_1D, GL_RGBA8, 256, 1, 1, 1, samplerLinearNoMipmap); 29108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DFloat (TEXTURETYPE_1D, GL_RGBA16F, 256, 1, 1, 1, samplerLinearNoMipmap); 29118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DInt (TEXTURETYPE_1D, GL_RGBA8I, 256, 1, 1, 1, samplerNearestNoMipmap); 29128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DUint (TEXTURETYPE_1D, GL_RGBA8UI, 256, 1, 1, 1, samplerNearestNoMipmap); 29138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DMipmapFixed (TEXTURETYPE_1D, GL_RGBA8, 256, 1, 1, 9, samplerLinearMipmap); 29148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DMipmapFloat (TEXTURETYPE_1D, GL_RGBA16F, 256, 1, 1, 9, samplerLinearMipmap); 29158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DMipmapInt (TEXTURETYPE_1D, GL_RGBA8I, 256, 1, 1, 9, samplerNearestMipmap); 29168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DMipmapUint (TEXTURETYPE_1D, GL_RGBA8UI, 256, 1, 1, 9, samplerNearestMipmap); 29178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 29188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DShadow (TEXTURETYPE_1D, GL_DEPTH_COMPONENT16, 256, 1, 1, 1, samplerShadowNoMipmap); 29198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DMipmapShadow (TEXTURETYPE_1D, GL_DEPTH_COMPONENT16, 256, 1, 1, 9, samplerShadowMipmap); 29208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 29218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayFixed (TEXTURETYPE_1D_ARRAY, GL_RGBA8, 256, 1, 4, 1, samplerLinearNoMipmap); 29228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayFloat (TEXTURETYPE_1D_ARRAY, GL_RGBA16F, 256, 1, 4, 1, samplerLinearNoMipmap); 29238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayInt (TEXTURETYPE_1D_ARRAY, GL_RGBA8I, 256, 1, 4, 1, samplerNearestNoMipmap); 29248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayUint (TEXTURETYPE_1D_ARRAY, GL_RGBA8UI, 256, 1, 4, 1, samplerNearestNoMipmap); 29258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayMipmapFixed (TEXTURETYPE_1D_ARRAY, GL_RGBA8, 256, 1, 4, 9, samplerLinearMipmap); 29268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayMipmapFloat (TEXTURETYPE_1D_ARRAY, GL_RGBA16F, 256, 1, 4, 9, samplerLinearMipmap); 29278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayMipmapInt (TEXTURETYPE_1D_ARRAY, GL_RGBA8I, 256, 1, 4, 9, samplerNearestMipmap); 29288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayMipmapUint (TEXTURETYPE_1D_ARRAY, GL_RGBA8UI, 256, 1, 4, 9, samplerNearestMipmap); 29298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 29308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayShadow (TEXTURETYPE_1D_ARRAY, GL_DEPTH_COMPONENT16, 256, 1, 4, 1, samplerShadowNoMipmap); 29318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec tex1DArrayMipmapShadow (TEXTURETYPE_1D_ARRAY, GL_DEPTH_COMPONENT16, 256, 1, 4, 9, samplerShadowMipmap); 29328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 29338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayFixed (TEXTURETYPE_CUBE_ARRAY, GL_RGBA8, 256, 256, 12, 1, samplerLinearNoMipmap); 29348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayFloat (TEXTURETYPE_CUBE_ARRAY, GL_RGBA16F, 256, 256, 12, 1, samplerLinearNoMipmap); 29358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayInt (TEXTURETYPE_CUBE_ARRAY, GL_RGBA8I, 256, 256, 12, 1, samplerNearestNoMipmap); 29368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayUint (TEXTURETYPE_CUBE_ARRAY, GL_RGBA8UI, 256, 256, 12, 1, samplerNearestNoMipmap); 29378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayMipmapFixed (TEXTURETYPE_CUBE_ARRAY, GL_RGBA8, 256, 256, 12, 9, samplerLinearMipmap); 29388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayMipmapFloat (TEXTURETYPE_CUBE_ARRAY, GL_RGBA16F, 128, 128, 12, 8, samplerLinearMipmap); 29398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayMipmapInt (TEXTURETYPE_CUBE_ARRAY, GL_RGBA8I, 256, 256, 12, 9, samplerNearestMipmap); 29408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayMipmapUint (TEXTURETYPE_CUBE_ARRAY, GL_RGBA8UI, 256, 256, 12, 9, samplerNearestMipmap); 29418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 29428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayShadow (TEXTURETYPE_CUBE_ARRAY, GL_DEPTH_COMPONENT16, 256, 256, 12, 1, samplerShadowNoMipmap); 29438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner static const TextureSpec texCubeArrayMipmapShadow (TEXTURETYPE_CUBE_ARRAY, GL_DEPTH_COMPONENT16, 256, 256, 12, 9, samplerShadowMipmap); 29448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 294508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // texture() cases 294608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureCases[] = 294708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 294808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 294908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 295808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 295908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 296308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 296908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 297208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 297708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 297908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 298608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 298908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 299108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 299908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 300008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 300508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 300808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 300908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 301008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 301108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 301208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 301308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 301408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 301508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 301608a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Not in spec. 301708a3fca4026822a0f753c737b38553231926d8deAkos Dirner// 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) 301808a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 301908a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texture", "texture() Tests", textureCases, DE_LENGTH_OF_ARRAY(textureCases)); 302008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 302108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureOffset() cases 302208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \note _bias variants are not using mipmap thanks to wide allowed range for LOD computation 302308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureOffsetCases[] = 302408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 302508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 302608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 302708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 302808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 302908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 303508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 303908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 304008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 304808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 304908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 305008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 305108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 305208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 305308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 30548efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30558efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30568efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30578efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_float, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30588efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30598efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(isampler3d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30608efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 30618efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(usampler3d, FUNCTION_TEXTURE, Vec4(-0.2f, -0.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), 306208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 306308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 306408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 306508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 306608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 306708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 306808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 306908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 307008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 307108a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 307208a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureoffset", "textureOffset() Tests", textureOffsetCases, DE_LENGTH_OF_ARRAY(textureOffsetCases)); 307308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 307408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureProj() cases 307508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \note Currently uses constant divider! 307608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureProjCases[] = 307708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 307808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 307908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 308808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 308908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 309308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 309908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 310208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 310708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 310908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 311608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 311908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 312008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 312108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 312208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 312308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 312408a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 312508a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureproj", "textureProj() Tests", textureProjCases, DE_LENGTH_OF_ARRAY(textureProjCases)); 312608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 312708a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureProjOffset() cases 312808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \note Currently uses constant divider! 312908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureProjOffsetCases[] = 313008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 313108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 313208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 313908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 314108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 314608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 314908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 315508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 315908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 31608efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DFixed, evalTexture3DProjOffset, VERTEX), 31618efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_fixed, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapFixed, evalTexture3DProjOffset, FRAGMENT), 31628efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DFloat, evalTexture3DProjOffset, VERTEX), 31638efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(sampler3d_float, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DMipmapFloat, evalTexture3DProjOffset, FRAGMENT), 31648efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DInt, evalTexture3DProjOffset, VERTEX), 31658efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(isampler3d, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(3, -8, 7), tex3DMipmapInt, evalTexture3DProjOffset, FRAGMENT), 31668efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(-8, 7, 3), tex3DUint, evalTexture3DProjOffset, VERTEX), 31678efe5254646f6bdeb3c9ea26ae37ae24a3286375Iago Toral Quiroga CASE_SPEC(usampler3d, FUNCTION_TEXTUREPROJ, Vec4(-0.3f, -0.6f, 0.0f, 1.5f), Vec4(2.25f, 3.45f, 2.0f, 1.5f), false, 0.0f, 0.0f, true, IVec3(7, 3, -8), tex3DMipmapUint, evalTexture3DProjOffset, FRAGMENT), 316808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 316908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 317008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 317108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 317208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 317308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 317408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 317508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 317608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 317708a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 317808a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureprojoffset", "textureOffsetProj() Tests", textureProjOffsetCases, DE_LENGTH_OF_ARRAY(textureProjOffsetCases)); 317908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 318008a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureLod() cases 318108a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureLodCases[] = 318208a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 318308a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 318408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 318508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 318608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 318708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 318808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 318908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 319408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 319808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 319908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 320008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 320108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 320208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 320308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 320408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 320508a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 320608a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texturelod", "textureLod() Tests", textureLodCases, DE_LENGTH_OF_ARRAY(textureLodCases)); 320708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 320808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureLodOffset() cases 320908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureLodOffsetCases[] = 321008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 321108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 321208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 321308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 321408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 321508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 321608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 321708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 321808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 321908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 322008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 322108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 322208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 322308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 322408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 322508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 322608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 322708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 322808a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 322908a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texturelodoffset", "textureLodOffset() Tests", textureLodOffsetCases, DE_LENGTH_OF_ARRAY(textureLodOffsetCases)); 323008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 323108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureProjLod() cases 323208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureProjLodCases[] = 323308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 323408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 323508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 323608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 323708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 323808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 323908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 324008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 324508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 324908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 325008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 325108a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 325208a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureprojlod", "textureProjLod() Tests", textureProjLodCases, DE_LENGTH_OF_ARRAY(textureProjLodCases)); 325308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 325408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureProjLodOffset() cases 325508a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureProjLodOffsetCases[] = 325608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 325708a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 325808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 325908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 326308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 326808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 326908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 327008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 327108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 327208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 327308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 327408a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 327508a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureprojlodoffset", "textureProjLodOffset() Tests", textureProjLodOffsetCases, DE_LENGTH_OF_ARRAY(textureProjLodOffsetCases)); 327608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 327708a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureGrad() cases 327808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \note Only one of dudx, dudy, dvdx, dvdy is non-zero since spec allows approximating p from derivates by various methods. 327908a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureGradCases[] = 328008a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 328108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 328208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 328308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 328408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 328508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 328608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 328708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 328808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 328908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 329208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 329708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 329908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 330408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 330708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 330808a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 330908a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texturegrad", "textureGrad() Tests", textureGradCases, DE_LENGTH_OF_ARRAY(textureGradCases)); 331008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 331108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureGradOffset() cases 331208a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureGradOffsetCases[] = 331308a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 331408a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 331508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 331608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 331708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 331808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 331908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 332008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 332508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 332908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 333008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 333108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 333208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 333308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 333408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 333508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 333608a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 333708a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texturegradoffset", "textureGradOffset() Tests", textureGradOffsetCases, DE_LENGTH_OF_ARRAY(textureGradOffsetCases)); 333808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 333908a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureProjGrad() cases 334008a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureProjGradCases[] = 334108a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 334208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 334308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 334408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 334508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 334608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 334708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 334808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 334908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 335308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 335908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 336008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 336108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 336208a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 336308a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureprojgrad", "textureProjGrad() Tests", textureProjGradCases, DE_LENGTH_OF_ARRAY(textureProjGradCases)); 336408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 336508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // textureProjGradOffset() cases 336608a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec textureProjGradOffsetCases[] = 336708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 336808a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord MinDx MaxDx MinDy MaxDy Offset? Offset Format EvalFunc Flags 336908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 337408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 337808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 337908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 338608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 338708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 338808a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 338908a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "textureprojgradoffset", "textureProjGradOffset() Tests", textureProjGradOffsetCases, DE_LENGTH_OF_ARRAY(textureProjGradOffsetCases)); 339008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 339108a3fca4026822a0f753c737b38553231926d8deAkos Dirner // texelFetch() cases 339208a3fca4026822a0f753c737b38553231926d8deAkos Dirner // \note Level is constant across quad 339308a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec texelFetchCases[] = 339408a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 339508a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 339608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 339708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 339808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 339908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 340108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 340608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 340908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 341008a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 341108a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texelfetch", "texelFetch() Tests", texelFetchCases, DE_LENGTH_OF_ARRAY(texelFetchCases)); 341208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 341308a3fca4026822a0f753c737b38553231926d8deAkos Dirner // texelFetchOffset() cases 341408a3fca4026822a0f753c737b38553231926d8deAkos Dirner static const TexFuncCaseSpec texelFetchOffsetCases[] = 341508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 341608a3fca4026822a0f753c737b38553231926d8deAkos Dirner // Name Function MinCoord MaxCoord Bias? MinLod MaxLod Offset? Offset Format EvalFunc Flags 341708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 341808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 341908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 342208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342508a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 342708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342808a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 342908a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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), 343008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 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) 343108a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 343208a3fca4026822a0f753c737b38553231926d8deAkos Dirner createCaseGroup(this, "texelfetchoffset", "texelFetchOffset() Tests", texelFetchOffsetCases, DE_LENGTH_OF_ARRAY(texelFetchOffsetCases)); 343308a3fca4026822a0f753c737b38553231926d8deAkos Dirner 34348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // texture query functions 343508a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 34368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner struct TexQueryFuncCaseSpec 343708a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 34388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const char* name; 34398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const char* samplerName; 34408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner TextureSpec textureSpec; 344108a3fca4026822a0f753c737b38553231926d8deAkos Dirner }; 344208a3fca4026822a0f753c737b38553231926d8deAkos Dirner 34438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TestCaseGroup> queryGroup (new tcu::TestCaseGroup(m_testCtx, "query", "Texture query function tests")); 344408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 34458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // textureSize() cases 344608a3fca4026822a0f753c737b38553231926d8deAkos Dirner { 34478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec textureSizeCases[] = 34488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 34498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2d_fixed", "sampler2D", tex2DFixed }, 34508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2d_float", "sampler2D", tex2DFloat }, 34518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2d", "isampler2D", tex2DInt }, 34528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2d", "usampler2D", tex2DUint }, 34538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dshadow", "sampler2DShadow", tex2DShadow }, 34548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler3d_fixed", "sampler3D", tex3DFixed }, 34558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler3d_float", "sampler3D", tex3DFloat }, 34568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler3d", "isampler3D", tex3DInt }, 34578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler3d", "usampler3D", tex3DUint }, 34588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercube_fixed", "samplerCube", texCubeFixed }, 34598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercube_float", "samplerCube", texCubeFloat }, 34608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isamplercube", "isamplerCube", texCubeInt }, 34618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usamplercube", "usamplerCube", texCubeUint }, 34628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubeshadow", "samplerCubeShadow", texCubeShadow }, 34638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darray_fixed", "sampler2DArray", tex2DArrayFixed }, 34648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darray_float", "sampler2DArray", tex2DArrayFloat }, 34658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2darray", "isampler2DArray", tex2DArrayInt }, 34668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2darray", "usampler2DArray", tex2DArrayUint }, 34678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darrayshadow", "sampler2DArrayShadow", tex2DArrayShadow }, 34688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearray_fixed", "samplerCubeArray", texCubeArrayFixed }, 34698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearray_float", "samplerCubeArray", texCubeArrayFloat }, 34708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isamplercubearray", "isamplerCubeArray", texCubeArrayInt }, 34718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usamplercubearray", "usamplerCubeArray", texCubeArrayUint }, 34728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearrayshadow", "samplerCubeArrayShadow", texCubeArrayShadow }, 34738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1d_fixed", "sampler1D", tex1DFixed }, 34748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1d_float", "sampler1D", tex1DFloat }, 34758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler1d", "isampler1D", tex1DInt }, 34768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler1d", "usampler1D", tex1DUint }, 34778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1dshadow", "sampler1DShadow", tex1DShadow }, 34788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darray_fixed", "sampler1DArray", tex1DArrayFixed }, 34798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darray_float", "sampler1DArray", tex1DArrayFloat }, 34808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler1darray", "isampler1DArray", tex1DArrayInt }, 34818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler1darray", "usampler1DArray", tex1DArrayUint }, 34828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darrayshadow", "sampler1DArrayShadow", tex1DArrayShadow }, 34838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 34848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 34858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(m_testCtx, "texturesize", "textureSize() Tests")); 34868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 34878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureSizeCases); ++ndx) 34888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 34898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec& caseSpec = textureSizeCases[ndx]; 34908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 34918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_vertex"), "", caseSpec.samplerName, caseSpec.textureSpec, true, QUERYFUNCTION_TEXTURESIZE)); 34928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_fragment"), "", caseSpec.samplerName, caseSpec.textureSpec, false, QUERYFUNCTION_TEXTURESIZE)); 34938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 34948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 34958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner queryGroup->addChild(group.release()); 34968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 34978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 34988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // textureSamples() cases 34998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec textureSamplesCases[] = 35018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dms_fixed", "sampler2DMS", tex2DFixed }, 35038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dms_float", "sampler2DMS", tex2DFloat }, 35048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2dms", "isampler2DMS", tex2DInt }, 35058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2dms", "usampler2DMS", tex2DUint }, 35068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dmsarray_fixed", "sampler2DMSArray", tex2DArrayFixed }, 35078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dmsarray_float", "sampler2DMSArray", tex2DArrayFloat }, 35088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2dmsarray", "isampler2DMSArray", tex2DArrayInt }, 35098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2dmsarray", "usampler2DMSArray", tex2DArrayUint }, 35108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 35118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(m_testCtx, "texturesamples", "textureSamples() Tests")); 35138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureSamplesCases); ++ndx) 35158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec& caseSpec = textureSamplesCases[ndx]; 35178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_vertex"), "", caseSpec.samplerName, caseSpec.textureSpec, true, QUERYFUNCTION_TEXTURESAMPLES)); 35198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_fragment"), "", caseSpec.samplerName, caseSpec.textureSpec, false, QUERYFUNCTION_TEXTURESAMPLES)); 35208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 35218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner queryGroup->addChild(group.release()); 35238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 35248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // textureQueryLevels() cases 35268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35278c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec textureQueryLevelsCases[] = 35288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2d_fixed", "sampler2D", tex2DFixed }, 35308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2d_float", "sampler2D", tex2DFloat }, 35318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2d", "isampler2D", tex2DInt }, 35328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2d", "usampler2D", tex2DUint }, 35338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dshadow", "sampler2DShadow", tex2DShadow }, 35348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler3d_fixed", "sampler3D", tex3DFixed }, 35358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler3d_float", "sampler3D", tex3DFloat }, 35368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler3d", "isampler3D", tex3DInt }, 35378c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler3d", "usampler3D", tex3DUint }, 35388c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercube_fixed", "samplerCube", texCubeFixed }, 35398c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercube_float", "samplerCube", texCubeFloat }, 35408c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isamplercube", "isamplerCube", texCubeInt }, 35418c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usamplercube", "usamplerCube", texCubeUint }, 35428c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubeshadow", "samplerCubeShadow", texCubeShadow }, 35438c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darray_fixed", "sampler2DArray", tex2DArrayFixed }, 35448c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darray_float", "sampler2DArray", tex2DArrayFloat }, 35458c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2darray", "isampler2DArray", tex2DArrayInt }, 35468c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2darray", "usampler2DArray", tex2DArrayUint }, 35478c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darrayshadow", "sampler2DArrayShadow", tex2DArrayShadow }, 35488c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearray_fixed", "samplerCubeArray", texCubeArrayFixed }, 35498c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearray_float", "samplerCubeArray", texCubeArrayFloat }, 35508c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isamplercubearray", "isamplerCubeArray", texCubeArrayInt }, 35518c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usamplercubearray", "usamplerCubeArray", texCubeArrayUint }, 35528c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearrayshadow", "samplerCubeArrayShadow", texCubeArrayShadow }, 35538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1d_fixed", "sampler1D", tex1DFixed }, 35548c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1d_float", "sampler1D", tex1DFloat }, 35558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler1d", "isampler1D", tex1DInt }, 35568c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler1d", "usampler1D", tex1DUint }, 35578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1dshadow", "sampler1DShadow", tex1DShadow }, 35588c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darray_fixed", "sampler1DArray", tex1DArrayFixed }, 35598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darray_float", "sampler1DArray", tex1DArrayFloat }, 35608c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler1darray", "isampler1DArray", tex1DArrayInt }, 35618c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler1darray", "usampler1DArray", tex1DArrayUint }, 35628c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darrayshadow", "sampler1DArrayShadow", tex1DArrayShadow }, 35638c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 35648c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35658c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(m_testCtx, "texturequerylevels", "textureQueryLevels() Tests")); 35668c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35678c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureQueryLevelsCases); ++ndx) 35688c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35698c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec& caseSpec = textureQueryLevelsCases[ndx]; 35708c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35718c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_vertex"), "", caseSpec.samplerName, caseSpec.textureSpec, true, QUERYFUNCTION_TEXTUREQUERYLEVELS)); 35728c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_fragment"), "", caseSpec.samplerName, caseSpec.textureSpec, false, QUERYFUNCTION_TEXTUREQUERYLEVELS)); 35738c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 35748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35758c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner queryGroup->addChild(group.release()); 35768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 35778c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 35788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // textureQueryLod() cases 35798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec textureQueryLodCases[] = 35818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 35828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2d_fixed", "sampler2D", tex2DMipmapFixed }, 35838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2d_float", "sampler2D", tex2DMipmapFloat }, 35848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2d", "isampler2D", tex2DMipmapInt }, 35858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2d", "usampler2D", tex2DMipmapUint }, 35868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2dshadow", "sampler2DShadow", tex2DMipmapShadow }, 35878c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler3d_fixed", "sampler3D", tex3DMipmapFixed }, 35888c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler3d_float", "sampler3D", tex3DMipmapFloat }, 35898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler3d", "isampler3D", tex3DMipmapInt }, 35908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler3d", "usampler3D", tex3DMipmapUint }, 35918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercube_fixed", "samplerCube", texCubeMipmapFixed }, 35928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercube_float", "samplerCube", texCubeMipmapFloat }, 35938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isamplercube", "isamplerCube", texCubeMipmapInt }, 35948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usamplercube", "usamplerCube", texCubeMipmapUint }, 35958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubeshadow", "samplerCubeShadow", texCubeMipmapShadow }, 35968c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darray_fixed", "sampler2DArray", tex2DArrayMipmapFixed }, 35978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darray_float", "sampler2DArray", tex2DArrayMipmapFloat }, 35988c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler2darray", "isampler2DArray", tex2DArrayMipmapInt }, 35998c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler2darray", "usampler2DArray", tex2DArrayMipmapUint }, 36008c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler2darrayshadow", "sampler2DArrayShadow", tex2DArrayMipmapShadow }, 36018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearray_fixed", "samplerCubeArray", texCubeArrayMipmapFixed }, 36028c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearray_float", "samplerCubeArray", texCubeArrayMipmapFloat }, 36038c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isamplercubearray", "isamplerCubeArray", texCubeArrayMipmapInt }, 36048c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usamplercubearray", "usamplerCubeArray", texCubeArrayMipmapUint }, 36058c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "samplercubearrayshadow", "samplerCubeArrayShadow", texCubeArrayMipmapShadow }, 36068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1d_fixed", "sampler1D", tex1DMipmapFixed }, 36078c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1d_float", "sampler1D", tex1DMipmapFloat }, 36088c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler1d", "isampler1D", tex1DMipmapInt }, 36098c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler1d", "usampler1D", tex1DMipmapUint }, 36108c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1dshadow", "sampler1DShadow", tex1DMipmapShadow }, 36118c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darray_fixed", "sampler1DArray", tex1DArrayMipmapFixed }, 36128c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darray_float", "sampler1DArray", tex1DArrayMipmapFloat }, 36138c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "isampler1darray", "isampler1DArray", tex1DArrayMipmapInt }, 36148c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "usampler1darray", "usampler1DArray", tex1DArrayMipmapUint }, 36158c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { "sampler1darrayshadow", "sampler1DArrayShadow", tex1DArrayMipmapShadow }, 36168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner }; 36178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 36188c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(m_testCtx, "texturequerylod", "textureQueryLod() Tests")); 36198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 36208c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureQueryLodCases); ++ndx) 36218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner { 36228c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner const TexQueryFuncCaseSpec& caseSpec = textureQueryLodCases[ndx]; 36238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner 36248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner // available only in fragment shader 36258c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_fragment"), "", caseSpec.samplerName, caseSpec.textureSpec, false, QUERYFUNCTION_TEXTUREQUERYLOD)); 36268c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner } 362708a3fca4026822a0f753c737b38553231926d8deAkos Dirner 36288c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner queryGroup->addChild(group.release()); 362908a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 363008a3fca4026822a0f753c737b38553231926d8deAkos Dirner 36318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner addChild(queryGroup.release()); 363208a3fca4026822a0f753c737b38553231926d8deAkos Dirner } 363308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 363408a3fca4026822a0f753c737b38553231926d8deAkos Dirner 363508a3fca4026822a0f753c737b38553231926d8deAkos Dirner} // anonymous 363608a3fca4026822a0f753c737b38553231926d8deAkos Dirner 363708a3fca4026822a0f753c737b38553231926d8deAkos Dirnertcu::TestCaseGroup* createTextureFunctionTests (tcu::TestContext& testCtx) 363808a3fca4026822a0f753c737b38553231926d8deAkos Dirner{ 363908a3fca4026822a0f753c737b38553231926d8deAkos Dirner return new ShaderTextureFunctionTests(testCtx); 364008a3fca4026822a0f753c737b38553231926d8deAkos Dirner} 364108a3fca4026822a0f753c737b38553231926d8deAkos Dirner 364208a3fca4026822a0f753c737b38553231926d8deAkos Dirner} // sr 364308a3fca4026822a0f753c737b38553231926d8deAkos Dirner} // vkt 3644