1c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal#ifndef _VKTSHADERRENDER_HPP
2c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal#define _VKTSHADERRENDER_HPP
3f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal/*------------------------------------------------------------------------
43c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * Vulkan Conformance Tests
53c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * ------------------------
63c17bc60af5c131488c834c64851a00449e4ef59Peter Gal *
7f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * Copyright (c) 2015 The Khronos Group Inc.
8f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd.
9f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
13f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
15f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
20978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
21f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
22f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *//*!
23f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * \file
24f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * \brief Vulkan ShaderRenderCase
25f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *//*--------------------------------------------------------------------*/
26f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
27f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include "tcuTexture.hpp"
28e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal#include "tcuSurface.hpp"
29e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "deMemory.h"
31fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal#include "deSharedPtr.hpp"
328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "deUniquePtr.hpp"
338bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
34e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal#include "vkDefs.hpp"
3570fc0800efe725f4f91f4d03b09aa0e567dbb09cDominik Witczak#include "vkRefUtil.hpp"
368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkPrograms.hpp"
37e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal#include "vkRef.hpp"
38e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal#include "vkMemUtil.hpp"
39da90931967434116522be552f82c8bc164a835bfPeter Gal#include "vkBuilderUtil.hpp"
4030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner#include "vkTypeUtil.hpp"
41ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus#include "vkPlatform.hpp"
42f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
43fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal#include "vktTestCaseUtil.hpp"
44fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
45f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galnamespace vkt
46f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
47c5a432af8404a1620230c8b0f31bc9a469196726Peter Galnamespace sr
48f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
49f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
50d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass LineStream
51d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
52d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic:
53d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal						LineStream		(int indent = 0)	{ m_indent = indent; }
54d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal						~LineStream		(void)				{}
55d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
56d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	const char*			str				(void) const		{ m_string = m_stream.str(); return m_string.c_str(); }
57d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LineStream&			operator<<		(const char* line)	{ for (int i = 0; i < m_indent; i++) { m_stream << "\t"; } m_stream << line << "\n"; return *this; }
58d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
59d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galprivate:
60d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	int					m_indent;
61d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	std::ostringstream	m_stream;
62d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	mutable std::string	m_string;
63d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal};
64d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
65f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass QuadGrid;
66e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galclass ShaderRenderCaseInstance;
67f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
68f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass TextureBinding
69f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
70fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Galpublic:
71fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	enum Type
72fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	{
73fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		TYPE_NONE = 0,
748c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		TYPE_1D,
75fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		TYPE_2D,
768c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		TYPE_3D,
77fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		TYPE_CUBE_MAP,
788c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		TYPE_1D_ARRAY,
79fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		TYPE_2D_ARRAY,
808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		TYPE_CUBE_ARRAY,
81fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
82fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		TYPE_LAST
83fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	};
84fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
85efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan	enum Init
86efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan	{
87efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan		INIT_UPLOAD_DATA,
88efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan		INIT_CLEAR,
89efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan
90efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan		INIT_LAST
91efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan	};
92efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan
9330ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	struct Parameters
9430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	{
9530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		deUint32					baseMipLevel;
9630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		vk::VkComponentMapping		componentMapping;
978c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		vk::VkSampleCountFlagBits	samples;
98efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan		Init						initialization;
9930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
10030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		Parameters (deUint32					baseMipLevel_		= 0,
1018c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner					vk::VkComponentMapping		componentMapping_	= vk::makeComponentMappingRGBA(),
102a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos					vk::VkSampleCountFlagBits	samples_			= vk::VK_SAMPLE_COUNT_1_BIT,
103efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan					Init						initialization_		= INIT_UPLOAD_DATA)
10430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner			: baseMipLevel		(baseMipLevel_)
10530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner			, componentMapping	(componentMapping_)
1068c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, samples			(samples_)
107efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan			, initialization	(initialization_)
10830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		{
10930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		}
11030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	};
11130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
1123038af220852000e643054412d14679c61d58838Peter Gal										TextureBinding		(const tcu::Archive&	archive,
1133038af220852000e643054412d14679c61d58838Peter Gal															const char*				filename,
1143038af220852000e643054412d14679c61d58838Peter Gal															const Type				type,
1153038af220852000e643054412d14679c61d58838Peter Gal															const tcu::Sampler&		sampler);
1168c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner
1178c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner										TextureBinding		(const tcu::Texture1D* tex1D, const tcu::Sampler& sampler);
11830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner										TextureBinding		(const tcu::Texture2D* tex2D, const tcu::Sampler& sampler);
1198c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner										TextureBinding		(const tcu::Texture3D* tex3D, const tcu::Sampler& sampler);
12030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner										TextureBinding		(const tcu::TextureCube* texCube, const tcu::Sampler& sampler);
1218c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner										TextureBinding		(const tcu::Texture1DArray* tex1DArray, const tcu::Sampler& sampler);
12230ce08903679a18155ace4ae14042f8af01261c1Akos Dirner										TextureBinding		(const tcu::Texture2DArray* tex2DArray, const tcu::Sampler& sampler);
1238c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner										TextureBinding		(const tcu::TextureCubeArray* texCubeArray, const tcu::Sampler& sampler);
1248c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner
1253038af220852000e643054412d14679c61d58838Peter Gal										~TextureBinding		(void);
12630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
12794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	Type								getType				(void) const { return m_type;		}
1283038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Sampler&					getSampler			(void) const { return m_sampler;	}
1298c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner
1308c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::Texture1D&				get1D				(void) const { DE_ASSERT(getType() == TYPE_1D && m_binding.tex1D != NULL);					return *m_binding.tex1D;		}
1318c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::Texture2D&				get2D				(void) const { DE_ASSERT(getType() == TYPE_2D && m_binding.tex2D != NULL);					return *m_binding.tex2D;		}
1328c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::Texture3D&				get3D				(void) const { DE_ASSERT(getType() == TYPE_3D && m_binding.tex3D != NULL);					return *m_binding.tex3D;		}
1338c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::TextureCube&				getCube				(void) const { DE_ASSERT(getType() == TYPE_CUBE_MAP && m_binding.texCube != NULL);			return *m_binding.texCube;		}
1348c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::Texture1DArray&			get1DArray			(void) const { DE_ASSERT(getType() == TYPE_1D_ARRAY && m_binding.tex1DArray != NULL);		return *m_binding.tex1DArray;	}
1358c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::Texture2DArray&			get2DArray			(void) const { DE_ASSERT(getType() == TYPE_2D_ARRAY && m_binding.tex2DArray != NULL);		return *m_binding.tex2DArray;	}
1368c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner	const tcu::TextureCubeArray&		getCubeArray		(void) const { DE_ASSERT(getType() == TYPE_CUBE_ARRAY && m_binding.texCubeArray != NULL);	return *m_binding.texCubeArray;	}
13730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
13830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	void								setParameters		(const Parameters& params) { m_params = params; }
13930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	const Parameters&					getParameters		(void) const { return m_params; }
140fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
141fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Galprivate:
1423038af220852000e643054412d14679c61d58838Peter Gal										TextureBinding		(const TextureBinding&);	// not allowed!
1433038af220852000e643054412d14679c61d58838Peter Gal	TextureBinding&						operator=			(const TextureBinding&);	// not allowed!
1443038af220852000e643054412d14679c61d58838Peter Gal
1453038af220852000e643054412d14679c61d58838Peter Gal	static de::MovePtr<tcu::Texture2D>	loadTexture2D		(const tcu::Archive& archive, const char* filename);
1463038af220852000e643054412d14679c61d58838Peter Gal
1473038af220852000e643054412d14679c61d58838Peter Gal	Type								m_type;
1483038af220852000e643054412d14679c61d58838Peter Gal	tcu::Sampler						m_sampler;
14930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	Parameters							m_params;
150baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
151fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	union
152fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	{
1538c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture1D*			tex1D;
15430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		const tcu::Texture2D*			tex2D;
1558c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture3D*			tex3D;
15630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		const tcu::TextureCube*			texCube;
1578c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture1DArray*		tex1DArray;
15830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner		const tcu::Texture2DArray*		tex2DArray;
1598c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::TextureCubeArray*	texCubeArray;
160fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	} m_binding;
161f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal};
162f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
1633038af220852000e643054412d14679c61d58838Peter Galtypedef de::SharedPtr<TextureBinding> TextureBindingSp;
1643038af220852000e643054412d14679c61d58838Peter Gal
165f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderEvalContext.
166f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
167f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass ShaderEvalContext
168f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
169f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galpublic:
170e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Limits.
171e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	enum
172e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	{
173e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		MAX_USER_ATTRIBS	= 4,
174e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		MAX_TEXTURES		= 4
175e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	};
176e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
177e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	struct ShaderSampler
178e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	{
1798c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		tcu::Sampler					sampler;
1808c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture1D*			tex1D;
1818c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture2D*			tex2D;
1828c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture3D*			tex3D;
1838c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::TextureCube*			texCube;
1848c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture1DArray*		tex1DArray;
1858c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::Texture2DArray*		tex2DArray;
1868c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner		const tcu::TextureCubeArray*	texCubeArray;
187e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
188e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		inline ShaderSampler (void)
1898c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			: tex1D			(DE_NULL)
1908c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, tex2D			(DE_NULL)
1918c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, tex3D			(DE_NULL)
1928c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, texCube		(DE_NULL)
1938c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, tex1DArray	(DE_NULL)
1948c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, tex2DArray	(DE_NULL)
1958c55aaea29fd4f9c690f8827957af80e23385e06Akos Dirner			, texCubeArray	(DE_NULL)
196e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		{
197e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		}
198e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	};
199e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
200e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal							ShaderEvalContext		(const QuadGrid& quadGrid);
201e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal							~ShaderEvalContext		(void);
202e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
203e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	void					reset					(float sx, float sy);
204e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
205e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Inputs.
206e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	tcu::Vec4				coords;
207e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	tcu::Vec4				unitCoords;
208e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	tcu::Vec4				constCoords;
209e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
210e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	tcu::Vec4				in[MAX_USER_ATTRIBS];
211e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	ShaderSampler			textures[MAX_TEXTURES];
212e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
213e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Output.
214e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	tcu::Vec4				color;
215e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	bool					isDiscarded;
216e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
217e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Functions.
218e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	inline void				discard					(void)  { isDiscarded = true; }
219e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	tcu::Vec4				texture2D				(int unitNdx, const tcu::Vec2& coords);
220f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
221f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galprivate:
2223c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	const QuadGrid&			m_quadGrid;
223f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal};
224f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
225f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galtypedef void (*ShaderEvalFunc) (ShaderEvalContext& c);
226f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
227e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline void evalCoordsPassthroughX		(ShaderEvalContext& c) { c.color.x() = c.coords.x(); }
228e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline void evalCoordsPassthroughXY		(ShaderEvalContext& c) { c.color.xy() = c.coords.swizzle(0,1); }
229e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline void evalCoordsPassthroughXYZ	(ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); }
230e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline void evalCoordsPassthrough		(ShaderEvalContext& c) { c.color = c.coords; }
231e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline void evalCoordsSwizzleWZYX		(ShaderEvalContext& c) { c.color = c.coords.swizzle(3,2,1,0); }
232f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
233f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderEvaluator
234f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// Either inherit a class with overridden evaluate() or just pass in an evalFunc.
235f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
236f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass ShaderEvaluator
237f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
238f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galpublic:
239fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							ShaderEvaluator			(void);
240fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							ShaderEvaluator			(const ShaderEvalFunc evalFunc);
241fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	virtual					~ShaderEvaluator		(void);
242f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
243fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	virtual void			evaluate				(ShaderEvalContext& ctx) const;
244f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
245f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galprivate:
246fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							ShaderEvaluator			(const ShaderEvaluator&);   // not allowed!
247fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	ShaderEvaluator&		operator=				(const ShaderEvaluator&);   // not allowed!
248f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
249fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const ShaderEvalFunc	m_evalFunc;
250f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal};
251f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
25202297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal// UniformSetup
25302297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
25402297b806657cc6311a7ff5f5cc4976e91abbb83Peter Galtypedef void (*UniformSetupFunc) (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords);
25502297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
25602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Galclass UniformSetup
25702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{
25802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Galpublic:
259fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							UniformSetup			(void);
260fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							UniformSetup			(const UniformSetupFunc setup);
261fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	virtual					~UniformSetup			(void);
262fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	virtual void			setup					(ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) const;
26302297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
26402297b806657cc6311a7ff5f5cc4976e91abbb83Peter Galprivate:
265fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							UniformSetup			(const UniformSetup&);	// not allowed!
266fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	UniformSetup&			operator=				(const UniformSetup&);	// not allowed!
26702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
268fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const UniformSetupFunc	m_setupFunc;
26902297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal};
27002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
271c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Galtypedef void (*AttributeSetupFunc) (ShaderRenderCaseInstance& instance, deUint32 numVertices);
272f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
273f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass ShaderRenderCase : public vkt::TestCase
274f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
275f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galpublic:
2760a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal													ShaderRenderCase	(tcu::TestContext&			testCtx,
2770a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const std::string&			name,
2780a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const std::string&			description,
2790a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const bool					isVertexCase,
2800a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const ShaderEvalFunc		evalFunc,
2810a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const UniformSetup*		uniformSetup,
2820a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const AttributeSetupFunc	attribFunc);
2830a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal
2840a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal													ShaderRenderCase	(tcu::TestContext&			testCtx,
2850a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const std::string&			name,
2860a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const std::string&			description,
2870a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const bool					isVertexCase,
2880a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const ShaderEvaluator*		evaluator,
2890a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const UniformSetup*		uniformSetup,
2900a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal																		 const AttributeSetupFunc	attribFunc);
2910a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal
2920a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	virtual											~ShaderRenderCase	(void);
2930a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	virtual	void									initPrograms		(vk::SourceCollections& programCollection) const;
2940a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	virtual	TestInstance*							createInstance		(Context& context) const;
295f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
296e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Galprotected:
2970a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	std::string										m_vertShaderSource;
2980a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	std::string										m_fragShaderSource;
299e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
3000a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	const bool										m_isVertexCase;
3010a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	const de::UniquePtr<const ShaderEvaluator>		m_evaluator;
3020a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	const de::UniquePtr<const UniformSetup>			m_uniformSetup;
3030a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	const AttributeSetupFunc						m_attribFunc;
304f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal};
305f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
306657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Galenum BaseUniformType
307657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal{
308657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// Bool
309657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UB_FALSE,
310657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UB_TRUE,
311657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
312657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// BVec4
313657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UB4_FALSE,
314657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UB4_TRUE,
315657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
316657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// Integers
317657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_ZERO,
318657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_ONE,
319657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_TWO,
320657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_THREE,
321657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_FOUR,
322657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_FIVE,
323657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_SIX,
324657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_SEVEN,
3258de9729b70dce1afe01b302d07daee35a25baec7Peter Gal	UI_EIGHT,
326657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI_ONEHUNDREDONE,
327657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
328657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// IVec2
329657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_MINUS_ONE,
330657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_ZERO,
331657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_ONE,
332657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_TWO,
333657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_THREE,
334657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_FOUR,
335657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI2_FIVE,
336657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
337657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// IVec3
338657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_MINUS_ONE,
339657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_ZERO,
340657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_ONE,
341657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_TWO,
342657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_THREE,
343657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_FOUR,
344657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI3_FIVE,
345657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
346657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// IVec4
347657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_MINUS_ONE,
348657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_ZERO,
349657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_ONE,
350657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_TWO,
351657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_THREE,
352657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_FOUR,
353657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UI4_FIVE,
354657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
355657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// Float
356657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_ZERO,
357657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_ONE,
358657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_TWO,
359657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_THREE,
360657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_FOUR,
361657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_FIVE,
362657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_SIX,
363657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_SEVEN,
3648de9729b70dce1afe01b302d07daee35a25baec7Peter Gal	UF_EIGHT,
365657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
366657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_HALF,
367657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_THIRD,
368657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_FOURTH,
369657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_FIFTH,
370657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_SIXTH,
371657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_SEVENTH,
372657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UF_EIGHTH,
373657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
374657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// Vec2
375657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV2_MINUS_ONE,
376657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV2_ZERO,
377657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV2_ONE,
378657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV2_TWO,
379657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV2_THREE,
380657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
381657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV2_HALF,
382657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
383657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// Vec3
384657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV3_MINUS_ONE,
385657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV3_ZERO,
386657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV3_ONE,
387657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV3_TWO,
388657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV3_THREE,
389657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
390657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV3_HALF,
391657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
392657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal// Vec4
393657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_MINUS_ONE,
394657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_ZERO,
395657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_ONE,
396657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_TWO,
397657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_THREE,
398657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
399657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_HALF,
400657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
401657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_BLACK,
402657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	UV4_GRAY,
403ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus	UV4_WHITE,
404ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus
405ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus// Last
406ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus	U_LAST
407657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal};
408da90931967434116522be552f82c8bc164a835bfPeter Gal
40923597067ccf919c019f237c49dd153d1ea502efcPeter Galenum BaseAttributeType
41023597067ccf919c019f237c49dd153d1ea502efcPeter Gal{
41123597067ccf919c019f237c49dd153d1ea502efcPeter Gal// User attributes
41223597067ccf919c019f237c49dd153d1ea502efcPeter Gal	A_IN0,
41323597067ccf919c019f237c49dd153d1ea502efcPeter Gal	A_IN1,
41423597067ccf919c019f237c49dd153d1ea502efcPeter Gal	A_IN2,
41523597067ccf919c019f237c49dd153d1ea502efcPeter Gal	A_IN3,
41623597067ccf919c019f237c49dd153d1ea502efcPeter Gal
41723597067ccf919c019f237c49dd153d1ea502efcPeter Gal// Matrices
41823597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT2,
41923597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT2x3,
42023597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT2x4,
42123597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT3x2,
42223597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT3,
42323597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT3x4,
42423597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT4x2,
42523597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT4x3,
42623597067ccf919c019f237c49dd153d1ea502efcPeter Gal	MAT4
42723597067ccf919c019f237c49dd153d1ea502efcPeter Gal};
42823597067ccf919c019f237c49dd153d1ea502efcPeter Gal
429f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderRenderCaseInstance.
430f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
431f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass ShaderRenderCaseInstance : public vkt::TestInstance
432f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
433f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galpublic:
4343fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	enum ImageBackingMode
4353fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	{
4363fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham		IMAGE_BACKING_MODE_REGULAR = 0,
4373fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham		IMAGE_BACKING_MODE_SPARSE,
4383fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	};
4393fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham
440446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// Default wertex and fragment grid sizes are used by a large collection of tests
441446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// to generate input sets. Some tests might change their behavior if the
442446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// default grid size values are altered, so care should be taken to confirm that
443446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// any changes to default values do not produce regressions.
444446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// If a particular tests needs to use a different grid size value, rather than
445446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// modifying the default grid size values for all tests, it is recommended that
446446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// the test specifies the required grid size using the gridSize parameter in the
447446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	// ShaderRenderCaseInstance constuctor instead.
448446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	enum
449446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	{
450446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga		GRID_SIZE_DEFAULTS			= 0,
451446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga		GRID_SIZE_DEFAULT_VERTEX	= 90,
452446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga		GRID_SIZE_DEFAULT_FRAGMENT	= 4,
453446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga	};
454446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga
455304cfa10f23de889965ba19223120cf3d65592c0Peter Siket														ShaderRenderCaseInstance	(Context&					context);
456fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal														ShaderRenderCaseInstance	(Context&					context,
457fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal																					const bool					isVertexCase,
458fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal																					const ShaderEvaluator&		evaluator,
459fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal																					const UniformSetup&			uniformSetup,
4603fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					const AttributeSetupFunc	attribFunc,
461446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga																					const ImageBackingMode		imageBackingMode = IMAGE_BACKING_MODE_REGULAR,
462446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga																					const deUint32				gridSize = static_cast<deUint32>(GRID_SIZE_DEFAULTS));
463a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal
464a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal	virtual												~ShaderRenderCaseInstance	(void);
465a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal	virtual tcu::TestStatus								iterate						(void);
466a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal
4673c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	void												addAttribute				(deUint32			bindingLocation,
4683c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					vk::VkFormat		format,
4693c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					deUint32			sizePerElement,
4703c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					deUint32			count,
4713c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					const void*			data);
4723c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	void												useAttribute				(deUint32			bindingLocation,
4733c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					BaseAttributeType	type);
474c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
4758cb8307ee692db4a772d298911b90a6bfb2d1604Peter Gal	template<typename T>
4763c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	void												addUniform					(deUint32				bindingLocation,
4773c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					vk::VkDescriptorType	descriptorType,
47894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos																					const T&				data);
4793c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	void												addUniform					(deUint32				bindingLocation,
4803c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					vk::VkDescriptorType	descriptorType,
4812fefaff91934f41ff34328c6e6b95ed24892b5a4Pyry Haulos																					size_t					dataSize,
4823c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					const void*				data);
4833c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	void												useUniform					(deUint32				bindingLocation,
4843c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					BaseUniformType			type);
48530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	void												useSampler					(deUint32				bindingLocation,
4863c17bc60af5c131488c834c64851a00449e4ef59Peter Gal																					deUint32				textureId);
487da90931967434116522be552f82c8bc164a835bfPeter Gal
48830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	static const tcu::Vec4								getDefaultConstCoords		(void) { return tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f); }
48968ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket	void												setPushConstantRanges		(const deUint32 rangeCount, const vk::VkPushConstantRange* const pcRanges);
49068ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket	virtual void										updatePushConstants			(vk::VkCommandBuffer commandBuffer, vk::VkPipelineLayout pipelineLayout);
49130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
492e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Galprotected:
49330ce08903679a18155ace4ae14042f8af01261c1Akos Dirner														ShaderRenderCaseInstance	(Context&					context,
49430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const bool					isVertexCase,
49530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const ShaderEvaluator*		evaluator,
49630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const UniformSetup*		uniformSetup,
4973fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const AttributeSetupFunc	attribFunc,
498446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga																					 const ImageBackingMode		imageBackingMode = IMAGE_BACKING_MODE_REGULAR,
499446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga																					 const deUint32				gridSize = static_cast<deUint32>(GRID_SIZE_DEFAULTS));
50030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
501a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal	virtual void										setup						(void);
502a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal	virtual void										setupUniforms				(const tcu::Vec4& constCoords);
50330ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	virtual void										setupDefaultInputs			(void);
50430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
50530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	void												render						(deUint32					numVertices,
50630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 deUint32					numTriangles,
50730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const deUint16*			indices,
50830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const tcu::Vec4&			constCoords		= getDefaultConstCoords());
50930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
51068ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket	void												render						(deUint32					numVertices,
51168ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket																					 deUint32					numIndices,
51268ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket																					 const deUint16*			indices,
51368ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket																					 vk::VkPrimitiveTopology	topology,
51468ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket																					 const tcu::Vec4&			constCoords		= getDefaultConstCoords());
51568ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket
51630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	const tcu::TextureLevel&							getResultImage				(void) const { return m_resultImage; }
517e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
518689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const tcu::UVec2									getViewportSize				(void) const;
519e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
520ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus	void												setSampleCount				(vk::VkSampleCountFlagBits sampleCount);
521ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus
522d6a0393ade7cd708f3497dcd7d1e82a931c31b1eDaniel Hegedus	bool												isMultiSampling				(void) const;
523304cfa10f23de889965ba19223120cf3d65592c0Peter Siket
52472a80055d864e628d5cca1ec402bf303b180496fPeter Siket	ImageBackingMode									m_imageBackingMode;
525446a2fdc65c554d54b4cb58327a8ed9190486463Iago Toral Quiroga
5263b177126650ab2c7ddba7071c2402d5d5c86107cBoris Zanin	deUint32											m_quadGridSize;
52772a80055d864e628d5cca1ec402bf303b180496fPeter Siketprivate:
52872a80055d864e628d5cca1ec402bf303b180496fPeter Siket
52972a80055d864e628d5cca1ec402bf303b180496fPeter Siket	struct SparseContext
53072a80055d864e628d5cca1ec402bf303b180496fPeter Siket	{
53172a80055d864e628d5cca1ec402bf303b180496fPeter Siket											SparseContext	(vkt::Context& context);
53272a80055d864e628d5cca1ec402bf303b180496fPeter Siket
53372a80055d864e628d5cca1ec402bf303b180496fPeter Siket		vkt::Context&						m_context;
53472a80055d864e628d5cca1ec402bf303b180496fPeter Siket		const deUint32						m_queueFamilyIndex;
53572a80055d864e628d5cca1ec402bf303b180496fPeter Siket		vk::Unique<vk::VkDevice>			m_device;
53672a80055d864e628d5cca1ec402bf303b180496fPeter Siket		vk::DeviceDriver					m_deviceInterface;
537da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi		const vk::VkQueue					m_queue;
53872a80055d864e628d5cca1ec402bf303b180496fPeter Siket		const de::UniquePtr<vk::Allocator>	m_allocator;
53972a80055d864e628d5cca1ec402bf303b180496fPeter Siket	private:
54072a80055d864e628d5cca1ec402bf303b180496fPeter Siket		vk::Move<vk::VkDevice>				createDevice	(void) const;
54172a80055d864e628d5cca1ec402bf303b180496fPeter Siket		vk::Allocator*						createAllocator	(void) const;
54272a80055d864e628d5cca1ec402bf303b180496fPeter Siket
54372a80055d864e628d5cca1ec402bf303b180496fPeter Siket	};
54472a80055d864e628d5cca1ec402bf303b180496fPeter Siket
54572a80055d864e628d5cca1ec402bf303b180496fPeter Siket	de::UniquePtr<SparseContext>						m_sparseContext;
54672a80055d864e628d5cca1ec402bf303b180496fPeter Siketprotected:
54730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	vk::Allocator&										m_memAlloc;
548fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const tcu::Vec4										m_clearColor;
54930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	const bool											m_isVertexCase;
55030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
55130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	std::vector<tcu::Mat4>								m_userAttribTransforms;
5523038af220852000e643054412d14679c61d58838Peter Gal	std::vector<TextureBindingSp>						m_textures;
553e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
55430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	std::string											m_vertexShaderName;
55530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	std::string											m_fragmentShaderName;
55630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	tcu::UVec2											m_renderSize;
55730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	vk::VkFormat										m_colorFormat;
558da90931967434116522be552f82c8bc164a835bfPeter Gal
559f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galprivate:
56030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	typedef std::vector<tcu::ConstPixelBufferAccess>	TextureLayerData;
56130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	typedef std::vector<TextureLayerData>				TextureData;
56230ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
56330ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	void												uploadImage					(const tcu::TextureFormat&		texFormat,
56430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const TextureData&				textureData,
56530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const tcu::Sampler&			refSampler,
56630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 deUint32						mipLevels,
56730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 deUint32						arrayLayers,
56830ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 vk::VkImage					destImage);
56930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
570efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan	void												clearImage					(const tcu::Sampler&			refSampler,
571efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan																					 deUint32						mipLevels,
572efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan																					 deUint32						arrayLayers,
573efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan																					 vk::VkImage					destImage);
574efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan
5752fe94dcfdd7717b349bdfec56183e303ab52f2bbMarcin Kańtoch	void												checkSparseSupport			(const vk::VkImageCreateInfo&	imageInfo) const;
5763fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham
5773fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	void												uploadSparseImage			(const tcu::TextureFormat&		texFormat,
5783fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const TextureData&				textureData,
5793fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const tcu::Sampler&			refSampler,
5803fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const deUint32					mipLevels,
5813fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const deUint32					arrayLayers,
5823fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const vk::VkImage				sparseImage,
5833fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const vk::VkImageCreateInfo&	imageCreateInfo,
5843fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const tcu::UVec3				texSize);
5853fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham
58630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	void												createSamplerUniform		(deUint32						bindingLocation,
58730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 TextureBinding::Type			textureType,
588efc1d1b69b644d80e91c96faa4d65bb4c0f60586Slawomir Cygan																					 TextureBinding::Init			textureInit,
58930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const tcu::TextureFormat&		texFormat,
5903fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham																					 const tcu::UVec3				texSize,
59130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const TextureData&				textureData,
59230ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 const tcu::Sampler&			refSampler,
59330ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 deUint32						mipLevels,
59430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 deUint32						arrayLayers,
59530ce08903679a18155ace4ae14042f8af01261c1Akos Dirner																					 TextureBinding::Parameters		textureParams);
5960d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
5972fefaff91934f41ff34328c6e6b95ed24892b5a4Pyry Haulos	void												setupUniformData			(deUint32 bindingLocation, size_t size, const void* dataPtr);
598e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
599a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal	void												computeVertexReference		(tcu::Surface& result, const QuadGrid& quadGrid);
600a52f7463763fff8640cd7bf8c7828b380939132dPeter Gal	void												computeFragmentReference	(tcu::Surface& result, const QuadGrid& quadGrid);
6013c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	bool												compareImages				(const tcu::Surface&	resImage,
602fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal																					 const tcu::Surface&	refImage,
603fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal																					 float					errorThreshold);
604e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
60530ce08903679a18155ace4ae14042f8af01261c1Akos Dirnerprivate:
60630ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	const ShaderEvaluator*								m_evaluator;
60730ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	const UniformSetup*									m_uniformSetup;
608fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const AttributeSetupFunc							m_attribFunc;
60930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	de::MovePtr<QuadGrid>								m_quadGrid;
61030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	tcu::TextureLevel									m_resultImage;
61130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner
61223597067ccf919c019f237c49dd153d1ea502efcPeter Gal	struct EnabledBaseAttribute
61323597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
61423597067ccf919c019f237c49dd153d1ea502efcPeter Gal		deUint32			location;
61523597067ccf919c019f237c49dd153d1ea502efcPeter Gal		BaseAttributeType	type;
61623597067ccf919c019f237c49dd153d1ea502efcPeter Gal	};
61723597067ccf919c019f237c49dd153d1ea502efcPeter Gal	std::vector<EnabledBaseAttribute>					m_enabledBaseAttributes;
61823597067ccf919c019f237c49dd153d1ea502efcPeter Gal
61930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	de::MovePtr<vk::DescriptorSetLayoutBuilder>			m_descriptorSetLayoutBuilder;
62030ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	de::MovePtr<vk::DescriptorPoolBuilder>				m_descriptorPoolBuilder;
62130ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	de::MovePtr<vk::DescriptorSetUpdateBuilder>			m_descriptorSetUpdateBuilder;
622da90931967434116522be552f82c8bc164a835bfPeter Gal
62394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	typedef de::SharedPtr<vk::Unique<vk::VkBuffer> >		VkBufferSp;
62494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	typedef de::SharedPtr<vk::Unique<vk::VkImage> >			VkImageSp;
6254ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	typedef de::SharedPtr<vk::Unique<vk::VkImageView> >		VkImageViewSp;
62694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	typedef de::SharedPtr<vk::Unique<vk::VkSampler> >		VkSamplerSp;
6270a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	typedef de::SharedPtr<vk::Allocation>					AllocationSp;
6284ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
6294ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	class UniformInfo
6301321ec058d8d9a206223de94ba29037a28f8caddPeter Gal	{
6314ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	public:
6324ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal									UniformInfo		(void) {}
6334ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		virtual						~UniformInfo	(void) {}
6344ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
635fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		vk::VkDescriptorType		type;
6361321ec058d8d9a206223de94ba29037a28f8caddPeter Gal		deUint32					location;
6371321ec058d8d9a206223de94ba29037a28f8caddPeter Gal	};
6384ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
6394ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	class BufferUniform : public UniformInfo
6404ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	{
6414ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	public:
6424ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal									BufferUniform	(void) {}
6434ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		virtual						~BufferUniform	(void) {}
6444ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
6454ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		VkBufferSp					buffer;
6464ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		AllocationSp				alloc;
64768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk::VkDescriptorBufferInfo	descriptor;
6484ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	};
6494ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
6504ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	class SamplerUniform : public UniformInfo
6514ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	{
6524ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	public:
6534ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal									SamplerUniform	(void) {}
6544ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		virtual						~SamplerUniform	(void) {}
6554ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
656baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		VkImageSp					image;
6574ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		VkImageViewSp				imageView;
6584ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal		VkSamplerSp					sampler;
659baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		AllocationSp				alloc;
66068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk::VkDescriptorImageInfo	descriptor;
6614ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	};
6624ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
6634ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	typedef de::SharedPtr<de::UniquePtr<UniformInfo> >	UniformInfoSp;
6644ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	std::vector<UniformInfoSp>							m_uniformInfos;
665c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
66670fc0800efe725f4f91f4d03b09aa0e567dbb09cDominik Witczak	std::vector< de::SharedPtr<vk::Allocation> >		m_allocations;
66770fc0800efe725f4f91f4d03b09aa0e567dbb09cDominik Witczak
668c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	std::vector<vk::VkVertexInputBindingDescription>	m_vertexBindingDescription;
66930ce08903679a18155ace4ae14042f8af01261c1Akos Dirner	std::vector<vk::VkVertexInputAttributeDescription>	m_vertexAttributeDescription;
670fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal
671fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal	std::vector<VkBufferSp>								m_vertexBuffers;
672fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal	std::vector<AllocationSp>							m_vertexBufferAllocs;
673ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus
674ece5b23cbb13cd4e908a44bb5d8227fae30c32d9Daniel Hegedus	vk::VkSampleCountFlagBits							m_sampleCount;
67568ee9460976d1add6e36d0f2f216bb6c1c86aa96Peter Siket	std::vector<vk::VkPushConstantRange>				m_pushConstantRanges;
6763fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham
6773fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	// Wrapper functions around m_context calls to support sparse cases.
6783fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	vk::VkDevice										getDevice						(void) const;
6793fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	deUint32											getUniversalQueueFamilyIndex	(void) const;
6803fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	const vk::DeviceInterface&							getDeviceInterface				(void) const;
6813fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	vk::VkQueue											getUniversalQueue				(void) const;
6823fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	vk::VkPhysicalDevice								getPhysicalDevice				(void) const;
6833fabf9547b3e2113a74936b196c69f101ce0851bGabor Abraham	const vk::InstanceInterface&						getInstanceInterface			(void) const;
68472a80055d864e628d5cca1ec402bf303b180496fPeter Siket	SparseContext*										createSparseContext				(void) const;
68572a80055d864e628d5cca1ec402bf303b180496fPeter Siket	vk::Allocator&										getAllocator					(void) const;
686f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal};
687f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
6888cb8307ee692db4a772d298911b90a6bfb2d1604Peter Galtemplate<typename T>
689fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Galvoid ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescriptorType descriptorType, const T& data)
6908cb8307ee692db4a772d298911b90a6bfb2d1604Peter Gal{
69102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	addUniform(bindingLocation, descriptorType, sizeof(T), &data);
6928cb8307ee692db4a772d298911b90a6bfb2d1604Peter Gal}
6938cb8307ee692db4a772d298911b90a6bfb2d1604Peter Gal
694c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal} // sr
695f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} // vkt
696f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
697c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal#endif // _VKTSHADERRENDER_HPP
698