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