141702fa78437820bc601e604de6a490eb09513ddPeter Siket/*------------------------------------------------------------------------
241702fa78437820bc601e604de6a490eb09513ddPeter Siket * Vulkan Conformance Tests
341702fa78437820bc601e604de6a490eb09513ddPeter Siket * ------------------------
441702fa78437820bc601e604de6a490eb09513ddPeter Siket *
541702fa78437820bc601e604de6a490eb09513ddPeter Siket * Copyright (c) 2016 The Khronos Group Inc.
641702fa78437820bc601e604de6a490eb09513ddPeter Siket * Copyright (c) 2016 Samsung Electronics Co., Ltd.
741702fa78437820bc601e604de6a490eb09513ddPeter Siket * Copyright (c) 2014 The Android Open Source Project
841702fa78437820bc601e604de6a490eb09513ddPeter Siket *
941702fa78437820bc601e604de6a490eb09513ddPeter Siket * Licensed under the Apache License, Version 2.0 (the "License");
1041702fa78437820bc601e604de6a490eb09513ddPeter Siket * you may not use this file except in compliance with the License.
1141702fa78437820bc601e604de6a490eb09513ddPeter Siket * You may obtain a copy of the License at
1241702fa78437820bc601e604de6a490eb09513ddPeter Siket *
1341702fa78437820bc601e604de6a490eb09513ddPeter Siket *      http://www.apache.org/licenses/LICENSE-2.0
1441702fa78437820bc601e604de6a490eb09513ddPeter Siket *
1541702fa78437820bc601e604de6a490eb09513ddPeter Siket * Unless required by applicable law or agreed to in writing, software
1641702fa78437820bc601e604de6a490eb09513ddPeter Siket * distributed under the License is distributed on an "AS IS" BASIS,
1741702fa78437820bc601e604de6a490eb09513ddPeter Siket * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1841702fa78437820bc601e604de6a490eb09513ddPeter Siket * See the License for the specific language governing permissions and
1941702fa78437820bc601e604de6a490eb09513ddPeter Siket * limitations under the License.
2041702fa78437820bc601e604de6a490eb09513ddPeter Siket *
2141702fa78437820bc601e604de6a490eb09513ddPeter Siket *//*!
2241702fa78437820bc601e604de6a490eb09513ddPeter Siket * \file
2341702fa78437820bc601e604de6a490eb09513ddPeter Siket * \brief Texture test utilities.
2441702fa78437820bc601e604de6a490eb09513ddPeter Siket *//*--------------------------------------------------------------------*/
2541702fa78437820bc601e604de6a490eb09513ddPeter Siket
2641702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vktTextureTestUtil.hpp"
2741702fa78437820bc601e604de6a490eb09513ddPeter Siket
2841702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "deFilePath.hpp"
2941702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "deMath.h"
3041702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "tcuCompressedTexture.hpp"
3141702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "tcuImageIO.hpp"
3241702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "tcuStringTemplate.hpp"
3341702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "tcuTestLog.hpp"
3441702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vkBuilderUtil.hpp"
3541702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vkImageUtil.hpp"
3641702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vkPrograms.hpp"
3741702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vkQueryUtil.hpp"
3841702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vkRefUtil.hpp"
3941702fa78437820bc601e604de6a490eb09513ddPeter Siket#include "vkTypeUtil.hpp"
4041702fa78437820bc601e604de6a490eb09513ddPeter Siket#include <map>
4141702fa78437820bc601e604de6a490eb09513ddPeter Siket#include <string>
4241702fa78437820bc601e604de6a490eb09513ddPeter Siket#include <vector>
4341702fa78437820bc601e604de6a490eb09513ddPeter Siket
4441702fa78437820bc601e604de6a490eb09513ddPeter Siketusing tcu::TestLog;
4541702fa78437820bc601e604de6a490eb09513ddPeter Siket
4641702fa78437820bc601e604de6a490eb09513ddPeter Siketusing namespace vk;
4741702fa78437820bc601e604de6a490eb09513ddPeter Siketusing namespace glu::TextureTestUtil;
4841702fa78437820bc601e604de6a490eb09513ddPeter Siket
4941702fa78437820bc601e604de6a490eb09513ddPeter Siketnamespace vkt
5041702fa78437820bc601e604de6a490eb09513ddPeter Siket{
5141702fa78437820bc601e604de6a490eb09513ddPeter Siketnamespace texture
5241702fa78437820bc601e604de6a490eb09513ddPeter Siket{
5341702fa78437820bc601e604de6a490eb09513ddPeter Siketnamespace util
5441702fa78437820bc601e604de6a490eb09513ddPeter Siket{
5541702fa78437820bc601e604de6a490eb09513ddPeter Siket
5641702fa78437820bc601e604de6a490eb09513ddPeter Siketstruct ShaderParameters {
5741702fa78437820bc601e604de6a490eb09513ddPeter Siket	float		bias;				//!< User-supplied bias.
5841702fa78437820bc601e604de6a490eb09513ddPeter Siket	float		ref;				//!< Reference value for shadow lookups.
5941702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::Vec2	padding;			//!< Shader uniform padding.
6041702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::Vec4	colorScale;			//!< Scale for texture color values.
6141702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::Vec4	colorBias;			//!< Bias for texture color values.
6241702fa78437820bc601e604de6a490eb09513ddPeter Siket};
6341702fa78437820bc601e604de6a490eb09513ddPeter Siket
6441702fa78437820bc601e604de6a490eb09513ddPeter Siketconst char* getProgramName(Program program)
6541702fa78437820bc601e604de6a490eb09513ddPeter Siket{
6641702fa78437820bc601e604de6a490eb09513ddPeter Siket	switch (program)
6741702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
6841702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_FLOAT:			return "2D_FLOAT";
6941702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_INT:			return "2D_INT";
7041702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_UINT:			return "2D_UINT";
7141702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_SHADOW:			return "2D_SHADOW";
7241702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_FLOAT_BIAS:		return "2D_FLOAT_BIAS";
7341702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_INT_BIAS:		return "2D_INT_BIAS";
7441702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_UINT_BIAS:		return "2D_UINT_BIAS";
7541702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_SHADOW_BIAS:	return "2D_SHADOW_BIAS";
7641702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_FLOAT:			return "1D_FLOAT";
7741702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_INT:			return "1D_INT";
7841702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_UINT:			return "1D_UINT";
7941702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_SHADOW:			return "1D_SHADOW";
8041702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_FLOAT_BIAS:		return "1D_FLOAT_BIAS";
8141702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_INT_BIAS:		return "1D_INT_BIAS";
8241702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_UINT_BIAS:		return "1D_UINT_BIAS";
8341702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_SHADOW_BIAS:	return "1D_SHADOW_BIAS";
8441702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_FLOAT:		return "CUBE_FLOAT";
8541702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_INT:			return "CUBE_INT";
8641702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_UINT:			return "CUBE_UINT";
8741702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_SHADOW:		return "CUBE_SHADOW";
8841702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_FLOAT_BIAS:	return "CUBE_FLOAT_BIAS";
8941702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_INT_BIAS:		return "CUBE_INT_BIAS";
9041702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_UINT_BIAS:	return "CUBE_UINT_BIAS";
9141702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_SHADOW_BIAS:	return "CUBE_SHADOW_BIAS";
9241702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_ARRAY_FLOAT:	return "2D_ARRAY_FLOAT";
9341702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_ARRAY_INT:		return "2D_ARRAY_INT";
9441702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_ARRAY_UINT:		return "2D_ARRAY_UINT";
9541702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_2D_ARRAY_SHADOW:	return "2D_ARRAY_SHADOW";
9641702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_3D_FLOAT:			return "3D_FLOAT";
9741702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_3D_INT:			return "3D_INT";
9841702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_3D_UINT:			return "3D_UINT";
9941702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_3D_FLOAT_BIAS:		return "3D_FLOAT_BIAS";
10041702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_3D_INT_BIAS:		return "3D_INT_BIAS";
10141702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_3D_UINT_BIAS:		return "3D_UINT_BIAS";
10241702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_ARRAY_FLOAT:	return "CUBE_ARRAY_FLOAT";
10341702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_ARRAY_INT:	return "CUBE_ARRAY_INT";
10441702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_ARRAY_UINT:	return "CUBE_ARRAY_UINT";
10541702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_CUBE_ARRAY_SHADOW:	return "CUBE_ARRAY_SHADOW";
10641702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_ARRAY_FLOAT:	return "1D_ARRAY_FLOAT";
10741702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_ARRAY_INT:		return "1D_ARRAY_INT";
10841702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_ARRAY_UINT:		return "1D_ARRAY_UINT";
10941702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_1D_ARRAY_SHADOW:	return "1D_ARRAY_SHADOW";
11041702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_BUFFER_FLOAT:		return "BUFFER_FLOAT";
11141702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_BUFFER_INT:		return "BUFFER_INT";
11241702fa78437820bc601e604de6a490eb09513ddPeter Siket		case PROGRAM_BUFFER_UINT:		return "BUFFER_UINT";
11341702fa78437820bc601e604de6a490eb09513ddPeter Siket		default:
11441702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_ASSERT(false);
11541702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
11641702fa78437820bc601e604de6a490eb09513ddPeter Siket	return NULL;
11741702fa78437820bc601e604de6a490eb09513ddPeter Siket}
11841702fa78437820bc601e604de6a490eb09513ddPeter Siket
11941702fa78437820bc601e604de6a490eb09513ddPeter SiketVkImageViewType textureTypeToImageViewType (TextureBinding::Type type)
12041702fa78437820bc601e604de6a490eb09513ddPeter Siket{
12141702fa78437820bc601e604de6a490eb09513ddPeter Siket	switch (type)
12241702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
12341702fa78437820bc601e604de6a490eb09513ddPeter Siket		case TextureBinding::TYPE_2D:			return VK_IMAGE_VIEW_TYPE_2D;
12441702fa78437820bc601e604de6a490eb09513ddPeter Siket		case TextureBinding::TYPE_2D_ARRAY:		return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
12541702fa78437820bc601e604de6a490eb09513ddPeter Siket		case TextureBinding::TYPE_CUBE_MAP:		return VK_IMAGE_VIEW_TYPE_CUBE;
12641702fa78437820bc601e604de6a490eb09513ddPeter Siket		case TextureBinding::TYPE_3D:			return VK_IMAGE_VIEW_TYPE_3D;
12741702fa78437820bc601e604de6a490eb09513ddPeter Siket		default:
12841702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_ASSERT(false);
12941702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
13041702fa78437820bc601e604de6a490eb09513ddPeter Siket
13141702fa78437820bc601e604de6a490eb09513ddPeter Siket	return VK_IMAGE_VIEW_TYPE_2D;
13241702fa78437820bc601e604de6a490eb09513ddPeter Siket}
13341702fa78437820bc601e604de6a490eb09513ddPeter Siket
13441702fa78437820bc601e604de6a490eb09513ddPeter SiketVkImageType imageViewTypeToImageType (VkImageViewType type)
13541702fa78437820bc601e604de6a490eb09513ddPeter Siket{
13641702fa78437820bc601e604de6a490eb09513ddPeter Siket	switch (type)
13741702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
13841702fa78437820bc601e604de6a490eb09513ddPeter Siket		case VK_IMAGE_VIEW_TYPE_2D:
13941702fa78437820bc601e604de6a490eb09513ddPeter Siket		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
14041702fa78437820bc601e604de6a490eb09513ddPeter Siket		case VK_IMAGE_VIEW_TYPE_CUBE:			return VK_IMAGE_TYPE_2D;
14141702fa78437820bc601e604de6a490eb09513ddPeter Siket		case VK_IMAGE_VIEW_TYPE_3D:				return VK_IMAGE_TYPE_3D;
14241702fa78437820bc601e604de6a490eb09513ddPeter Siket		default:
14341702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_ASSERT(false);
14441702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
14541702fa78437820bc601e604de6a490eb09513ddPeter Siket
14641702fa78437820bc601e604de6a490eb09513ddPeter Siket	return VK_IMAGE_TYPE_2D;
14741702fa78437820bc601e604de6a490eb09513ddPeter Siket}
14841702fa78437820bc601e604de6a490eb09513ddPeter Siket
14941702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid initializePrograms(vk::SourceCollections& programCollection, glu::Precision texCoordPrecision, const std::vector<Program>& programs)
15041702fa78437820bc601e604de6a490eb09513ddPeter Siket{
15141702fa78437820bc601e604de6a490eb09513ddPeter Siket	static const char* vertShaderTemplate =
15241702fa78437820bc601e604de6a490eb09513ddPeter Siket		"${VTX_HEADER}"
15341702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout(location = 0) ${VTX_IN} highp vec4 a_position;\n"
15441702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout(location = 1) ${VTX_IN} ${PRECISION} ${TEXCOORD_TYPE} a_texCoord;\n"
15541702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout(location = 0) ${VTX_OUT} ${PRECISION} ${TEXCOORD_TYPE} v_texCoord;\n"
15641702fa78437820bc601e604de6a490eb09513ddPeter Siket		"${VTX_OUT} gl_PerVertex { vec4 gl_Position; };\n"
15741702fa78437820bc601e604de6a490eb09513ddPeter Siket		"\n"
15841702fa78437820bc601e604de6a490eb09513ddPeter Siket		"void main (void)\n"
15941702fa78437820bc601e604de6a490eb09513ddPeter Siket		"{\n"
16041702fa78437820bc601e604de6a490eb09513ddPeter Siket		"	gl_Position = a_position;\n"
16141702fa78437820bc601e604de6a490eb09513ddPeter Siket		"	v_texCoord = a_texCoord;\n"
16241702fa78437820bc601e604de6a490eb09513ddPeter Siket		"}\n";
16341702fa78437820bc601e604de6a490eb09513ddPeter Siket
16441702fa78437820bc601e604de6a490eb09513ddPeter Siket	static const char* fragShaderTemplate =
16541702fa78437820bc601e604de6a490eb09513ddPeter Siket		"${FRAG_HEADER}"
16641702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout(location = 0) ${FRAG_IN} ${PRECISION} ${TEXCOORD_TYPE} v_texCoord;\n"
16741702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout(location = 0) out mediump vec4 ${FRAG_COLOR};\n"
16841702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout (set=0, binding=0, std140) uniform Block \n"
16941702fa78437820bc601e604de6a490eb09513ddPeter Siket		"{\n"
17041702fa78437820bc601e604de6a490eb09513ddPeter Siket		"  ${PRECISION} float u_bias;\n"
17141702fa78437820bc601e604de6a490eb09513ddPeter Siket		"  ${PRECISION} float u_ref;\n"
17241702fa78437820bc601e604de6a490eb09513ddPeter Siket		"  ${PRECISION} vec4 u_colorScale;\n"
17341702fa78437820bc601e604de6a490eb09513ddPeter Siket		"  ${PRECISION} vec4 u_colorBias;\n"
17441702fa78437820bc601e604de6a490eb09513ddPeter Siket		"};\n\n"
17541702fa78437820bc601e604de6a490eb09513ddPeter Siket		"layout (set=1, binding=0) uniform ${PRECISION} ${SAMPLER_TYPE} u_sampler;\n"
17641702fa78437820bc601e604de6a490eb09513ddPeter Siket		"void main (void)\n"
17741702fa78437820bc601e604de6a490eb09513ddPeter Siket		"{\n"
17841702fa78437820bc601e604de6a490eb09513ddPeter Siket		"	${FRAG_COLOR} = ${LOOKUP} * u_colorScale + u_colorBias;\n"
17941702fa78437820bc601e604de6a490eb09513ddPeter Siket		"}\n";
18041702fa78437820bc601e604de6a490eb09513ddPeter Siket
18141702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::StringTemplate					vertexSource	(vertShaderTemplate);
18241702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::StringTemplate					fragmentSource	(fragShaderTemplate);
18341702fa78437820bc601e604de6a490eb09513ddPeter Siket
18441702fa78437820bc601e604de6a490eb09513ddPeter Siket	for (std::vector<Program>::const_iterator programIt = programs.begin(); programIt != programs.end(); ++programIt)
18541702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
18641702fa78437820bc601e604de6a490eb09513ddPeter Siket		Program								program	= *programIt;
18741702fa78437820bc601e604de6a490eb09513ddPeter Siket		std::map<std::string, std::string>	params;
18841702fa78437820bc601e604de6a490eb09513ddPeter Siket
18941702fa78437820bc601e604de6a490eb09513ddPeter Siket		bool	isCube		= de::inRange<int>(program, PROGRAM_CUBE_FLOAT, PROGRAM_CUBE_SHADOW_BIAS);
19041702fa78437820bc601e604de6a490eb09513ddPeter Siket		bool	isArray		= de::inRange<int>(program, PROGRAM_2D_ARRAY_FLOAT, PROGRAM_2D_ARRAY_SHADOW)
19141702fa78437820bc601e604de6a490eb09513ddPeter Siket								|| de::inRange<int>(program, PROGRAM_1D_ARRAY_FLOAT, PROGRAM_1D_ARRAY_SHADOW);
19241702fa78437820bc601e604de6a490eb09513ddPeter Siket
19341702fa78437820bc601e604de6a490eb09513ddPeter Siket		bool	is1D		= de::inRange<int>(program, PROGRAM_1D_FLOAT, PROGRAM_1D_SHADOW_BIAS)
19441702fa78437820bc601e604de6a490eb09513ddPeter Siket								|| de::inRange<int>(program, PROGRAM_1D_ARRAY_FLOAT, PROGRAM_1D_ARRAY_SHADOW)
19541702fa78437820bc601e604de6a490eb09513ddPeter Siket								|| de::inRange<int>(program, PROGRAM_BUFFER_FLOAT, PROGRAM_BUFFER_UINT);
19641702fa78437820bc601e604de6a490eb09513ddPeter Siket
19741702fa78437820bc601e604de6a490eb09513ddPeter Siket		bool	is2D		= de::inRange<int>(program, PROGRAM_2D_FLOAT, PROGRAM_2D_SHADOW_BIAS)
19841702fa78437820bc601e604de6a490eb09513ddPeter Siket								|| de::inRange<int>(program, PROGRAM_2D_ARRAY_FLOAT, PROGRAM_2D_ARRAY_SHADOW);
19941702fa78437820bc601e604de6a490eb09513ddPeter Siket
20041702fa78437820bc601e604de6a490eb09513ddPeter Siket		bool	is3D		= de::inRange<int>(program, PROGRAM_3D_FLOAT, PROGRAM_3D_UINT_BIAS);
20141702fa78437820bc601e604de6a490eb09513ddPeter Siket		bool	isCubeArray	= de::inRange<int>(program, PROGRAM_CUBE_ARRAY_FLOAT, PROGRAM_CUBE_ARRAY_SHADOW);
20241702fa78437820bc601e604de6a490eb09513ddPeter Siket
20341702fa78437820bc601e604de6a490eb09513ddPeter Siket		const std::string	version	= glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450);
20441702fa78437820bc601e604de6a490eb09513ddPeter Siket
20541702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["FRAG_HEADER"]	= version + "\n";
20641702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["VTX_HEADER"]	= version + "\n";
20741702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["VTX_IN"]		= "in";
20841702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["VTX_OUT"]		= "out";
20941702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["FRAG_IN"]		= "in";
21041702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["FRAG_COLOR"]	= "dEQP_FragColor";
21141702fa78437820bc601e604de6a490eb09513ddPeter Siket
21241702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["PRECISION"]		= glu::getPrecisionName(texCoordPrecision);
21341702fa78437820bc601e604de6a490eb09513ddPeter Siket
21441702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (isCubeArray)
21541702fa78437820bc601e604de6a490eb09513ddPeter Siket			params["TEXCOORD_TYPE"]	= "vec4";
21641702fa78437820bc601e604de6a490eb09513ddPeter Siket		else if (isCube || (is2D && isArray) || is3D)
21741702fa78437820bc601e604de6a490eb09513ddPeter Siket			params["TEXCOORD_TYPE"]	= "vec3";
21841702fa78437820bc601e604de6a490eb09513ddPeter Siket		else if ((is1D && isArray) || is2D)
21941702fa78437820bc601e604de6a490eb09513ddPeter Siket			params["TEXCOORD_TYPE"]	= "vec2";
22041702fa78437820bc601e604de6a490eb09513ddPeter Siket		else if (is1D)
22141702fa78437820bc601e604de6a490eb09513ddPeter Siket			params["TEXCOORD_TYPE"]	= "float";
22241702fa78437820bc601e604de6a490eb09513ddPeter Siket		else
22341702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_ASSERT(DE_FALSE);
22441702fa78437820bc601e604de6a490eb09513ddPeter Siket
22541702fa78437820bc601e604de6a490eb09513ddPeter Siket		const char*	sampler	= DE_NULL;
22641702fa78437820bc601e604de6a490eb09513ddPeter Siket		const char*	lookup	= DE_NULL;
22741702fa78437820bc601e604de6a490eb09513ddPeter Siket
22841702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (program)
22941702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
23041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_FLOAT:			sampler = "sampler2D";				lookup = "texture(u_sampler, v_texCoord)";												break;
23141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_INT:			sampler = "isampler2D";				lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
23241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_UINT:			sampler = "usampler2D";				lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
23341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_SHADOW:			sampler = "sampler2DShadow";		lookup = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";			break;
23441702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_FLOAT_BIAS:		sampler = "sampler2D";				lookup = "texture(u_sampler, v_texCoord, u_bias)";										break;
23541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_INT_BIAS:		sampler = "isampler2D";				lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
23641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_UINT_BIAS:		sampler = "usampler2D";				lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
23741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_SHADOW_BIAS:	sampler = "sampler2DShadow";		lookup = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";	break;
23841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_FLOAT:			sampler = "sampler1D";				lookup = "texture(u_sampler, v_texCoord)";												break;
23941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_INT:			sampler = "isampler1D";				lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
24041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_UINT:			sampler = "usampler1D";				lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
24141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_SHADOW:			sampler = "sampler1DShadow";		lookup = "vec4(texture(u_sampler, vec3(v_texCoord, 0.0, u_ref)), 0.0, 0.0, 1.0)";		break;
24241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_FLOAT_BIAS:		sampler = "sampler1D";				lookup = "texture(u_sampler, v_texCoord, u_bias)";										break;
24341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_INT_BIAS:		sampler = "isampler1D";				lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
24441702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_UINT_BIAS:		sampler = "usampler1D";				lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
24541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_SHADOW_BIAS:	sampler = "sampler1DShadow";		lookup = "vec4(texture(u_sampler, vec3(v_texCoord, 0.0, u_ref), u_bias), 0.0, 0.0, 1.0)";	break;
24641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_FLOAT:		sampler = "samplerCube";			lookup = "texture(u_sampler, v_texCoord)";												break;
24741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_INT:			sampler = "isamplerCube";			lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
24841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_UINT:			sampler = "usamplerCube";			lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
24941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_SHADOW:		sampler = "samplerCubeShadow";		lookup = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";			break;
25041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_FLOAT_BIAS:	sampler = "samplerCube";			lookup = "texture(u_sampler, v_texCoord, u_bias)";										break;
25141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_INT_BIAS:		sampler = "isamplerCube";			lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
25241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_UINT_BIAS:	sampler = "usamplerCube";			lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
25341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_SHADOW_BIAS:	sampler = "samplerCubeShadow";		lookup = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";	break;
25441702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_ARRAY_FLOAT:	sampler = "sampler2DArray";			lookup = "texture(u_sampler, v_texCoord)";												break;
25541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_ARRAY_INT:		sampler = "isampler2DArray";		lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
25641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_ARRAY_UINT:		sampler = "usampler2DArray";		lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
25741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_2D_ARRAY_SHADOW:	sampler = "sampler2DArrayShadow";	lookup = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";			break;
25841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_3D_FLOAT:			sampler = "sampler3D";				lookup = "texture(u_sampler, v_texCoord)";												break;
25941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_3D_INT:			sampler = "isampler3D";				lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
26041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_3D_UINT:			sampler = "usampler3D";				lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
26141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_3D_FLOAT_BIAS:		sampler = "sampler3D";				lookup = "texture(u_sampler, v_texCoord, u_bias)";										break;
26241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_3D_INT_BIAS:		sampler = "isampler3D";				lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
26341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_3D_UINT_BIAS:		sampler = "usampler3D";				lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";								break;
26441702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_ARRAY_FLOAT:	sampler = "samplerCubeArray";		lookup = "texture(u_sampler, v_texCoord)";												break;
26541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_ARRAY_INT:	sampler = "isamplerCubeArray";		lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
26641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_ARRAY_UINT:	sampler = "usamplerCubeArray";		lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
26741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_CUBE_ARRAY_SHADOW:	sampler = "samplerCubeArrayShadow";	lookup = "vec4(texture(u_sampler, v_texCoord, u_ref), 0.0, 0.0, 1.0)";			break;
26841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_ARRAY_FLOAT:	sampler = "sampler1DArray";			lookup = "texture(u_sampler, v_texCoord)";												break;
26941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_ARRAY_INT:		sampler = "isampler1DArray";		lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
27041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_ARRAY_UINT:		sampler = "usampler1DArray";		lookup = "vec4(texture(u_sampler, v_texCoord))";										break;
27141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_1D_ARRAY_SHADOW:	sampler = "sampler1DArrayShadow";	lookup = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";			break;
27241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_BUFFER_FLOAT:		sampler = "samplerBuffer";			lookup = "texelFetch(u_sampler, int(v_texCoord))";										break;
27341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_BUFFER_INT:		sampler = "isamplerBuffer";			lookup = "vec4(texelFetch(u_sampler, int(v_texCoord)))";								break;
27441702fa78437820bc601e604de6a490eb09513ddPeter Siket			case PROGRAM_BUFFER_UINT:		sampler = "usamplerBuffer";			lookup = "vec4(texelFetch(u_sampler, int(v_texCoord)))";								break;
27541702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:
27641702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_ASSERT(false);
27741702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
27841702fa78437820bc601e604de6a490eb09513ddPeter Siket
27941702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["SAMPLER_TYPE"]	= sampler;
28041702fa78437820bc601e604de6a490eb09513ddPeter Siket		params["LOOKUP"]		= lookup;
28141702fa78437820bc601e604de6a490eb09513ddPeter Siket
28241702fa78437820bc601e604de6a490eb09513ddPeter Siket		programCollection.glslSources.add("vertext_" + std::string(getProgramName(program))) << glu::VertexSource(vertexSource.specialize(params));
28341702fa78437820bc601e604de6a490eb09513ddPeter Siket		programCollection.glslSources.add("fragment_" + std::string(getProgramName(program))) << glu::FragmentSource(fragmentSource.specialize(params));
28441702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
28541702fa78437820bc601e604de6a490eb09513ddPeter Siket}
28641702fa78437820bc601e604de6a490eb09513ddPeter Siket
28741702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureBinding::TextureBinding (Context& context)
28841702fa78437820bc601e604de6a490eb09513ddPeter Siket	: m_context			(context)
28941702fa78437820bc601e604de6a490eb09513ddPeter Siket{
29041702fa78437820bc601e604de6a490eb09513ddPeter Siket}
29141702fa78437820bc601e604de6a490eb09513ddPeter Siket
29241702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureBinding::TextureBinding (Context& context, const TestTextureSp& textureData, const TextureBinding::Type type)
29341702fa78437820bc601e604de6a490eb09513ddPeter Siket	: m_context			(context)
29441702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_type			(type)
29541702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_textureData		(textureData)
29641702fa78437820bc601e604de6a490eb09513ddPeter Siket{
29741702fa78437820bc601e604de6a490eb09513ddPeter Siket	updateTextureData(m_textureData, m_type);
29841702fa78437820bc601e604de6a490eb09513ddPeter Siket}
29941702fa78437820bc601e604de6a490eb09513ddPeter Siket
30041702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureBinding::updateTextureData (const TestTextureSp& textureData, const TextureBinding::Type textureType)
30141702fa78437820bc601e604de6a490eb09513ddPeter Siket{
30241702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&						vkd						= m_context.getDeviceInterface();
30341702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDevice								vkDevice				= m_context.getDevice();
30441702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkQueue								queue					= m_context.getUniversalQueue();
30541702fa78437820bc601e604de6a490eb09513ddPeter Siket	const deUint32								queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
30641702fa78437820bc601e604de6a490eb09513ddPeter Siket	Allocator&									allocator				= m_context.getDefaultAllocator();
30741702fa78437820bc601e604de6a490eb09513ddPeter Siket
30841702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_type			= textureType;
30941702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureData	= textureData;
31041702fa78437820bc601e604de6a490eb09513ddPeter Siket
31141702fa78437820bc601e604de6a490eb09513ddPeter Siket	const bool									isCube					= m_type == TYPE_CUBE_MAP;
31241702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageCreateFlags					imageCreateFlags		= isCube ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0;
31341702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageViewType						imageViewType			= textureTypeToImageViewType(textureType);
31441702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageType							imageType				= imageViewTypeToImageType(imageViewType);
31541702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageTiling							imageTiling				= VK_IMAGE_TILING_OPTIMAL;
31641702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageUsageFlags						imageUsageFlags			= VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
317044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan	const VkFormat								format					= textureData->isCompressed() ? mapCompressedTextureFormat(textureData->getCompressedLevel(0, 0).getFormat()) : mapTextureFormat(textureData->getTextureFormat());
31841702fa78437820bc601e604de6a490eb09513ddPeter Siket	const tcu::UVec3							textureDimension		= textureData->getTextureDimension();
31941702fa78437820bc601e604de6a490eb09513ddPeter Siket	const deUint32								mipLevels				= textureData->getNumLevels();
32041702fa78437820bc601e604de6a490eb09513ddPeter Siket	const deUint32								arraySize				= textureData->getArraySize();
32141702fa78437820bc601e604de6a490eb09513ddPeter Siket	vk::VkImageFormatProperties					imageFormatProperties;
32241702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkResult								imageFormatQueryResult	= m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(), format, imageType, imageTiling, imageUsageFlags, imageCreateFlags, &imageFormatProperties);
32341702fa78437820bc601e604de6a490eb09513ddPeter Siket
32441702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (imageFormatQueryResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
32541702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
32641702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_THROW(NotSupportedError, (std::string("Format not supported: ") + vk::getFormatName(format)).c_str());
32741702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
32841702fa78437820bc601e604de6a490eb09513ddPeter Siket	else
32941702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(imageFormatQueryResult);
33041702fa78437820bc601e604de6a490eb09513ddPeter Siket
33141702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (imageFormatProperties.maxArrayLayers < arraySize)
33241702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_THROW(NotSupportedError, ("Maximum array layers number for this format is not enough for this test."));
33341702fa78437820bc601e604de6a490eb09513ddPeter Siket
33441702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (imageFormatProperties.maxMipLevels < mipLevels)
33541702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_THROW(NotSupportedError, ("Maximum mimap level number for this format is not enough for this test."));
33641702fa78437820bc601e604de6a490eb09513ddPeter Siket
33741702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (imageFormatProperties.maxExtent.width < textureDimension.x() ||
33841702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageFormatProperties.maxExtent.height < textureDimension.y() ||
33941702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageFormatProperties.maxExtent.depth < textureDimension.z())
34041702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
34141702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_THROW(NotSupportedError, ("Maximum image dimension for this format is not enough for this test."));
34241702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
34341702fa78437820bc601e604de6a490eb09513ddPeter Siket
34441702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Create image
34541702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageCreateInfo						imageParams				=
34641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
34741702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,							// VkStructureType			sType;
34841702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,														// const void*				pNext;
34941702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageCreateFlags,												// VkImageCreateFlags		flags;
35041702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageType,														// VkImageType				imageType;
35141702fa78437820bc601e604de6a490eb09513ddPeter Siket		format,															// VkFormat					format;
35241702fa78437820bc601e604de6a490eb09513ddPeter Siket		{																// VkExtent3D				extent;
35341702fa78437820bc601e604de6a490eb09513ddPeter Siket			(deUint32)textureDimension.x(),
35441702fa78437820bc601e604de6a490eb09513ddPeter Siket			(deUint32)textureDimension.y(),
35541702fa78437820bc601e604de6a490eb09513ddPeter Siket			(deUint32)textureDimension.z()
35641702fa78437820bc601e604de6a490eb09513ddPeter Siket		},
35741702fa78437820bc601e604de6a490eb09513ddPeter Siket		mipLevels,														// deUint32					mipLevels;
35841702fa78437820bc601e604de6a490eb09513ddPeter Siket		arraySize,														// deUint32					arrayLayers;
35941702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits	samples;
36041702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageTiling,													// VkImageTiling			tiling;
36141702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageUsageFlags,												// VkImageUsageFlags		usage;
36241702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_SHARING_MODE_EXCLUSIVE,										// VkSharingMode			sharingMode;
36341702fa78437820bc601e604de6a490eb09513ddPeter Siket		1u,																// deUint32					queueFamilyIndexCount;
36441702fa78437820bc601e604de6a490eb09513ddPeter Siket		&queueFamilyIndex,												// const deUint32*			pQueueFamilyIndices;
36541702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_IMAGE_LAYOUT_UNDEFINED										// VkImageLayout			initialLayout;
36641702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
36741702fa78437820bc601e604de6a490eb09513ddPeter Siket
36841702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureImage			= createImage(vkd, vkDevice, &imageParams);
36941702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureImageMemory	= allocator.allocate(getImageMemoryRequirements(vkd, vkDevice, *m_textureImage), MemoryRequirement::Any);
37041702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.bindImageMemory(vkDevice, *m_textureImage, m_textureImageMemory->getMemory(), m_textureImageMemory->getOffset()));
37141702fa78437820bc601e604de6a490eb09513ddPeter Siket
37241702fa78437820bc601e604de6a490eb09513ddPeter Siket	updateTextureViewMipLevels(0, mipLevels - 1);
37341702fa78437820bc601e604de6a490eb09513ddPeter Siket
37441702fa78437820bc601e604de6a490eb09513ddPeter Siket	pipeline::uploadTestTexture(vkd, vkDevice, queue, queueFamilyIndex, allocator, *m_textureData, *m_textureImage);
37541702fa78437820bc601e604de6a490eb09513ddPeter Siket}
37641702fa78437820bc601e604de6a490eb09513ddPeter Siket
37741702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureBinding::updateTextureViewMipLevels (deUint32 baseLevel, deUint32 maxLevel)
37841702fa78437820bc601e604de6a490eb09513ddPeter Siket{
37941702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&						vkd						= m_context.getDeviceInterface();
38041702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDevice								vkDevice				= m_context.getDevice();
38141702fa78437820bc601e604de6a490eb09513ddPeter Siket	const vk::VkImageViewType					imageViewType			= textureTypeToImageViewType(m_type);
382044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan	const vk::VkFormat							format					= m_textureData->isCompressed() ? mapCompressedTextureFormat(m_textureData->getCompressedLevel(0, 0).getFormat()) : mapTextureFormat(m_textureData->getTextureFormat());
38341702fa78437820bc601e604de6a490eb09513ddPeter Siket	const bool									isShadowTexture			= tcu::hasDepthComponent(m_textureData->getTextureFormat().order);
38441702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageAspectFlags					aspectMask				= isShadowTexture ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
38541702fa78437820bc601e604de6a490eb09513ddPeter Siket	const deUint32								layerCount				= m_textureData->getArraySize();
38641702fa78437820bc601e604de6a490eb09513ddPeter Siket	const vk::VkImageViewCreateInfo				viewParams				=
38741702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
38841702fa78437820bc601e604de6a490eb09513ddPeter Siket		vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType			sType;
38941702fa78437820bc601e604de6a490eb09513ddPeter Siket		NULL,											// const voide*				pNext;
39041702fa78437820bc601e604de6a490eb09513ddPeter Siket		0u,												// VkImageViewCreateFlags	flags;
39141702fa78437820bc601e604de6a490eb09513ddPeter Siket		*m_textureImage,								// VkImage					image;
39241702fa78437820bc601e604de6a490eb09513ddPeter Siket		imageViewType,									// VkImageViewType			viewType;
39341702fa78437820bc601e604de6a490eb09513ddPeter Siket		format,											// VkFormat					format;
39441702fa78437820bc601e604de6a490eb09513ddPeter Siket		makeComponentMappingRGBA(),						// VkComponentMapping		components;
39541702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
39641702fa78437820bc601e604de6a490eb09513ddPeter Siket			aspectMask,									// VkImageAspectFlags	aspectMask;
39741702fa78437820bc601e604de6a490eb09513ddPeter Siket			baseLevel,									// deUint32				baseMipLevel;
39841702fa78437820bc601e604de6a490eb09513ddPeter Siket			maxLevel-baseLevel+1,						// deUint32				levelCount;
39941702fa78437820bc601e604de6a490eb09513ddPeter Siket			0,											// deUint32				baseArrayLayer;
40041702fa78437820bc601e604de6a490eb09513ddPeter Siket			layerCount									// deUint32				layerCount;
40141702fa78437820bc601e604de6a490eb09513ddPeter Siket		},												// VkImageSubresourceRange	subresourceRange;
40241702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
40341702fa78437820bc601e604de6a490eb09513ddPeter Siket
40441702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureImageView		= createImageView(vkd, vkDevice, &viewParams);
40541702fa78437820bc601e604de6a490eb09513ddPeter Siket}
40641702fa78437820bc601e604de6a490eb09513ddPeter Siket
40741702fa78437820bc601e604de6a490eb09513ddPeter Siketconst deUint16		TextureRenderer::s_vertexIndices[6] = { 0, 1, 2, 2, 1, 3 };
40841702fa78437820bc601e604de6a490eb09513ddPeter Siketconst VkDeviceSize	TextureRenderer::s_vertexIndexBufferSize = sizeof(TextureRenderer::s_vertexIndices);
40941702fa78437820bc601e604de6a490eb09513ddPeter Siket
41041702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureRenderer::TextureRenderer (Context& context, VkSampleCountFlagBits sampleCount, deUint32 renderWidth, deUint32 renderHeight)
41141702fa78437820bc601e604de6a490eb09513ddPeter Siket	: m_context					(context)
41241702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_log						(context.getTestContext().getLog())
41341702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_renderWidth				(renderWidth)
41441702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_renderHeight			(renderHeight)
41541702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_sampleCount				(sampleCount)
41641702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_multisampling			(m_sampleCount != VK_SAMPLE_COUNT_1_BIT)
41741702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_imageFormat				(VK_FORMAT_R8G8B8A8_UNORM)
41841702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_textureFormat			(vk::mapVkFormat(m_imageFormat))
41941702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_uniformBufferSize		(sizeof(ShaderParameters))
42041702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_resultBufferSize		(renderWidth * renderHeight * m_textureFormat.getPixelSize())
42141702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_viewportOffsetX			(0.0f)
42241702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_viewportOffsetY			(0.0f)
42341702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_viewportWidth			((float)renderWidth)
42441702fa78437820bc601e604de6a490eb09513ddPeter Siket	, m_viewportHeight			((float)renderHeight)
42541702fa78437820bc601e604de6a490eb09513ddPeter Siket{
42641702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&						vkd						= m_context.getDeviceInterface();
42741702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDevice								vkDevice				= m_context.getDevice();
42841702fa78437820bc601e604de6a490eb09513ddPeter Siket	const deUint32								queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
42941702fa78437820bc601e604de6a490eb09513ddPeter Siket	Allocator&									allocator				= m_context.getDefaultAllocator();
43041702fa78437820bc601e604de6a490eb09513ddPeter Siket
43141702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Command Pool
432da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	m_commandPool = createCommandPool(vkd, vkDevice, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex);
43341702fa78437820bc601e604de6a490eb09513ddPeter Siket
43441702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Image
43541702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
43641702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkImageUsageFlags	imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
43741702fa78437820bc601e604de6a490eb09513ddPeter Siket		VkImageFormatProperties	properties;
43841702fa78437820bc601e604de6a490eb09513ddPeter Siket
43941702fa78437820bc601e604de6a490eb09513ddPeter Siket		if ((m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(),
44041702fa78437820bc601e604de6a490eb09513ddPeter Siket																					 m_imageFormat,
44141702fa78437820bc601e604de6a490eb09513ddPeter Siket																					 VK_IMAGE_TYPE_2D,
44241702fa78437820bc601e604de6a490eb09513ddPeter Siket																					 VK_IMAGE_TILING_OPTIMAL,
44341702fa78437820bc601e604de6a490eb09513ddPeter Siket																					 imageUsage,
44441702fa78437820bc601e604de6a490eb09513ddPeter Siket																					 0,
44541702fa78437820bc601e604de6a490eb09513ddPeter Siket																					 &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
44641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
44741702fa78437820bc601e604de6a490eb09513ddPeter Siket			TCU_THROW(NotSupportedError, "Format not supported");
44841702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
44941702fa78437820bc601e604de6a490eb09513ddPeter Siket
45041702fa78437820bc601e604de6a490eb09513ddPeter Siket		if ((properties.sampleCounts & m_sampleCount) != m_sampleCount)
45141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
45241702fa78437820bc601e604de6a490eb09513ddPeter Siket			TCU_THROW(NotSupportedError, "Format not supported");
45341702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
45441702fa78437820bc601e604de6a490eb09513ddPeter Siket
45541702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkImageCreateInfo					imageCreateInfo			=
45641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
45741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,		// VkStructureType			sType;
45841702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*				pNext;
45941702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkImageCreateFlags		flags;
46041702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_IMAGE_TYPE_2D,							// VkImageType				imageType;
46141702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_imageFormat,								// VkFormat					format;
46241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{ m_renderWidth, m_renderHeight, 1u },		// VkExtent3D				extent;
46341702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32					mipLevels;
46441702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32					arrayLayers;
46541702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_sampleCount,								// VkSampleCountFlagBits	samples;
46641702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_IMAGE_TILING_OPTIMAL,					// VkImageTiling			tiling;
46741702fa78437820bc601e604de6a490eb09513ddPeter Siket			imageUsage,									// VkImageUsageFlags		usage;
46841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode			sharingMode;
46941702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32					queueFamilyIndexCount;
47041702fa78437820bc601e604de6a490eb09513ddPeter Siket			&queueFamilyIndex,							// const deUint32*			pQueueFamilyIndices;
47141702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_IMAGE_LAYOUT_UNDEFINED					// VkImageLayout			initialLayout;
47241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
47341702fa78437820bc601e604de6a490eb09513ddPeter Siket
47441702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_image = vk::createImage(vkd, vkDevice, &imageCreateInfo, DE_NULL);
47541702fa78437820bc601e604de6a490eb09513ddPeter Siket
47641702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_imageMemory	= allocator.allocate(getImageMemoryRequirements(vkd, vkDevice, *m_image), MemoryRequirement::Any);
47741702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.bindImageMemory(vkDevice, *m_image, m_imageMemory->getMemory(), m_imageMemory->getOffset()));
47841702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
47941702fa78437820bc601e604de6a490eb09513ddPeter Siket
48041702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Image View
48141702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
48241702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkImageViewCreateInfo				imageViewCreateInfo		=
48341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
48441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType				sType;
48541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*					pNext;
48641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkImageViewCreateFlags		flags;
48741702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_image,									// VkImage						image;
48841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_IMAGE_VIEW_TYPE_2D,						// VkImageViewType				viewType;
48941702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_imageFormat,								// VkFormat						format;
49041702fa78437820bc601e604de6a490eb09513ddPeter Siket			makeComponentMappingRGBA(),					// VkComponentMapping			components;
49141702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
49241702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_ASPECT_COLOR_BIT,					// VkImageAspectFlags			aspectMask;
49341702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,											// deUint32						baseMipLevel;
49441702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,											// deUint32						mipLevels;
49541702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,											// deUint32						baseArrayLayer;
49641702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,											// deUint32						arraySize;
49741702fa78437820bc601e604de6a490eb09513ddPeter Siket			},											// VkImageSubresourceRange		subresourceRange;
49841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
49941702fa78437820bc601e604de6a490eb09513ddPeter Siket
50041702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_imageView = vk::createImageView(vkd, vkDevice, &imageViewCreateInfo, DE_NULL);
50141702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
50241702fa78437820bc601e604de6a490eb09513ddPeter Siket
50341702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (m_multisampling)
50441702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
50541702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
50641702fa78437820bc601e604de6a490eb09513ddPeter Siket			// Resolved Image
50741702fa78437820bc601e604de6a490eb09513ddPeter Siket			const VkImageUsageFlags	imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
50841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VkImageFormatProperties	properties;
50941702fa78437820bc601e604de6a490eb09513ddPeter Siket
51041702fa78437820bc601e604de6a490eb09513ddPeter Siket			if ((m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(),
51141702fa78437820bc601e604de6a490eb09513ddPeter Siket																						 m_imageFormat,
51241702fa78437820bc601e604de6a490eb09513ddPeter Siket																						 VK_IMAGE_TYPE_2D,
51341702fa78437820bc601e604de6a490eb09513ddPeter Siket																						 VK_IMAGE_TILING_OPTIMAL,
51441702fa78437820bc601e604de6a490eb09513ddPeter Siket																						 imageUsage,
51541702fa78437820bc601e604de6a490eb09513ddPeter Siket																						 0,
51641702fa78437820bc601e604de6a490eb09513ddPeter Siket																						 &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
51741702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
51841702fa78437820bc601e604de6a490eb09513ddPeter Siket				TCU_THROW(NotSupportedError, "Format not supported");
51941702fa78437820bc601e604de6a490eb09513ddPeter Siket			}
52041702fa78437820bc601e604de6a490eb09513ddPeter Siket
52141702fa78437820bc601e604de6a490eb09513ddPeter Siket			const VkImageCreateInfo					imageCreateInfo			=
52241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
52341702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,		// VkStructureType			sType;
52441702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL,									// const void*				pNext;
52541702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,											// VkImageCreateFlags		flags;
52641702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_TYPE_2D,							// VkImageType				imageType;
52741702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_imageFormat,								// VkFormat					format;
52841702fa78437820bc601e604de6a490eb09513ddPeter Siket				{ m_renderWidth, m_renderHeight, 1u },		// VkExtent3D				extent;
52941702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,											// deUint32					mipLevels;
53041702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,											// deUint32					arrayLayers;
53141702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_SAMPLE_COUNT_1_BIT,						// VkSampleCountFlagBits	samples;
53241702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_TILING_OPTIMAL,					// VkImageTiling			tiling;
53341702fa78437820bc601e604de6a490eb09513ddPeter Siket				imageUsage,									// VkImageUsageFlags		usage;
53441702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode			sharingMode;
53541702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,											// deUint32					queueFamilyIndexCount;
53641702fa78437820bc601e604de6a490eb09513ddPeter Siket				&queueFamilyIndex,							// const deUint32*			pQueueFamilyIndices;
53741702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_LAYOUT_UNDEFINED					// VkImageLayout			initialLayout;
53841702fa78437820bc601e604de6a490eb09513ddPeter Siket			};
53941702fa78437820bc601e604de6a490eb09513ddPeter Siket
54041702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_resolvedImage			= vk::createImage(vkd, vkDevice, &imageCreateInfo, DE_NULL);
54141702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_resolvedImageMemory	= allocator.allocate(getImageMemoryRequirements(vkd, vkDevice, *m_resolvedImage), MemoryRequirement::Any);
54241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_CHECK(vkd.bindImageMemory(vkDevice, *m_resolvedImage, m_resolvedImageMemory->getMemory(), m_resolvedImageMemory->getOffset()));
54341702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
54441702fa78437820bc601e604de6a490eb09513ddPeter Siket
54541702fa78437820bc601e604de6a490eb09513ddPeter Siket		// Resolved Image View
54641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
54741702fa78437820bc601e604de6a490eb09513ddPeter Siket			const VkImageViewCreateInfo				imageViewCreateInfo		=
54841702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
54941702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType				sType;
55041702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL,									// const void*					pNext;
55141702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,											// VkImageViewCreateFlags		flags;
55241702fa78437820bc601e604de6a490eb09513ddPeter Siket				*m_resolvedImage,							// VkImage						image;
55341702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_VIEW_TYPE_2D,						// VkImageViewType				viewType;
55441702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_imageFormat,								// VkFormat						format;
55541702fa78437820bc601e604de6a490eb09513ddPeter Siket				makeComponentMappingRGBA(),					// VkComponentMapping			components;
55641702fa78437820bc601e604de6a490eb09513ddPeter Siket				{
55741702fa78437820bc601e604de6a490eb09513ddPeter Siket					VK_IMAGE_ASPECT_COLOR_BIT,					// VkImageAspectFlags			aspectMask;
55841702fa78437820bc601e604de6a490eb09513ddPeter Siket					0u,											// deUint32						baseMipLevel;
55941702fa78437820bc601e604de6a490eb09513ddPeter Siket					1u,											// deUint32						mipLevels;
56041702fa78437820bc601e604de6a490eb09513ddPeter Siket					0u,											// deUint32						baseArrayLayer;
56141702fa78437820bc601e604de6a490eb09513ddPeter Siket					1u,											// deUint32						arraySize;
56241702fa78437820bc601e604de6a490eb09513ddPeter Siket				},											// VkImageSubresourceRange		subresourceRange;
56341702fa78437820bc601e604de6a490eb09513ddPeter Siket			};
56441702fa78437820bc601e604de6a490eb09513ddPeter Siket
56541702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_resolvedImageView = vk::createImageView(vkd, vkDevice, &imageViewCreateInfo, DE_NULL);
56641702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
56741702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
56841702fa78437820bc601e604de6a490eb09513ddPeter Siket
56941702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Render Pass
57041702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
57141702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkImageLayout						imageLayout				= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
57241702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkAttachmentDescription			attachmentDesc[]		=
57341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
57441702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
57541702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,													// VkAttachmentDescriptionFlags		flags;
57641702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_imageFormat,										// VkFormat							format;
57741702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_sampleCount,										// VkSampleCountFlagBits			samples;
57841702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_LOAD_OP_LOAD,												// VkAttachmentLoadOp				loadOp;
57941702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
58041702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
58141702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
58241702fa78437820bc601e604de6a490eb09513ddPeter Siket				imageLayout,										// VkImageLayout					initialLayout;
58341702fa78437820bc601e604de6a490eb09513ddPeter Siket				imageLayout,										// VkImageLayout					finalLayout;
58441702fa78437820bc601e604de6a490eb09513ddPeter Siket			},
58541702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
58641702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,													// VkAttachmentDescriptionFlags		flags;
58741702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_imageFormat,										// VkFormat							format;
58841702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits			samples;
58941702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				loadOp;
59041702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
59141702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
59241702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
59341702fa78437820bc601e604de6a490eb09513ddPeter Siket				imageLayout,										// VkImageLayout					initialLayout;
59441702fa78437820bc601e604de6a490eb09513ddPeter Siket				imageLayout,										// VkImageLayout					finalLayout;
59541702fa78437820bc601e604de6a490eb09513ddPeter Siket			}
59641702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
59741702fa78437820bc601e604de6a490eb09513ddPeter Siket
59841702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkAttachmentReference				attachmentRef			=
59941702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
60041702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// deUint32							attachment;
60141702fa78437820bc601e604de6a490eb09513ddPeter Siket			imageLayout,										// VkImageLayout					layout;
60241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
60341702fa78437820bc601e604de6a490eb09513ddPeter Siket
60441702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkAttachmentReference				resolveAttachmentRef	=
60541702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
60641702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,													// deUint32							attachment;
60741702fa78437820bc601e604de6a490eb09513ddPeter Siket			imageLayout,										// VkImageLayout					layout;
60841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
60941702fa78437820bc601e604de6a490eb09513ddPeter Siket
61041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkSubpassDescription				subpassDesc				=
61141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
61241702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// VkSubpassDescriptionFlags		flags;
61341702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint				pipelineBindPoint;
61441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// deUint32							inputAttachmentCount;
61541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkAttachmentReference*		pInputAttachments;
61641702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,													// deUint32							colorAttachmentCount;
61741702fa78437820bc601e604de6a490eb09513ddPeter Siket			&attachmentRef,										// const VkAttachmentReference*		pColorAttachments;
61841702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_multisampling ? &resolveAttachmentRef : DE_NULL,	// const VkAttachmentReference*		pResolveAttachments;
61941702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkAttachmentReference*		pDepthStencilAttachment;
62041702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// deUint32							preserveAttachmentCount;
62141702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkAttachmentReference*		pPreserveAttachments;
62241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
62341702fa78437820bc601e604de6a490eb09513ddPeter Siket
62441702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkRenderPassCreateInfo			renderPassCreateInfo	=
62541702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
62641702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
62741702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const void*						pNext;
62841702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// VkRenderPassCreateFlags			flags;
62941702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_multisampling ? 2u : 1u,							// deUint32							attachmentCount;
63041702fa78437820bc601e604de6a490eb09513ddPeter Siket			attachmentDesc,										// const VkAttachmentDescription*	pAttachments;
63141702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,													// deUint32							subpassCount;
63241702fa78437820bc601e604de6a490eb09513ddPeter Siket			&subpassDesc,										// const VkSubpassDescription*		pSubpasses;
63341702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// deUint32							dependencyCount;
63441702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkSubpassDependency*		pDependencies;
63541702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
63641702fa78437820bc601e604de6a490eb09513ddPeter Siket
63741702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_renderPass =  createRenderPass(vkd, vkDevice, &renderPassCreateInfo, DE_NULL);
63841702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
63941702fa78437820bc601e604de6a490eb09513ddPeter Siket
64041702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Vertex index buffer
64141702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
64241702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkBufferCreateInfo			indexBufferParams		=
64341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
64441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
64541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*			pNext;
64641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkBufferCreateFlags	flags;
64741702fa78437820bc601e604de6a490eb09513ddPeter Siket			s_vertexIndexBufferSize,					// VkDeviceSize			size;
64841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BUFFER_USAGE_INDEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
64941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
65041702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32				queueFamilyCount;
65141702fa78437820bc601e604de6a490eb09513ddPeter Siket			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
65241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
65341702fa78437820bc601e604de6a490eb09513ddPeter Siket
65441702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_vertexIndexBuffer			= createBuffer(vkd, vkDevice, &indexBufferParams);
65541702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_vertexIndexBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *m_vertexIndexBuffer), MemoryRequirement::HostVisible);
65641702fa78437820bc601e604de6a490eb09513ddPeter Siket
65741702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.bindBufferMemory(vkDevice, *m_vertexIndexBuffer, m_vertexIndexBufferMemory->getMemory(), m_vertexIndexBufferMemory->getOffset()));
65841702fa78437820bc601e604de6a490eb09513ddPeter Siket
65941702fa78437820bc601e604de6a490eb09513ddPeter Siket		// Load vertices into vertex buffer
66041702fa78437820bc601e604de6a490eb09513ddPeter Siket		deMemcpy(m_vertexIndexBufferMemory->getHostPtr(), s_vertexIndices, s_vertexIndexBufferSize);
66146abca75bab000788fcc6289adfd3e668203d20fMaciej Jesionowski		flushMappedMemoryRange(vkd, vkDevice, m_vertexIndexBufferMemory->getMemory(), m_vertexIndexBufferMemory->getOffset(), VK_WHOLE_SIZE);
66241702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
66341702fa78437820bc601e604de6a490eb09513ddPeter Siket
66441702fa78437820bc601e604de6a490eb09513ddPeter Siket	// FrameBuffer
66541702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
66641702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkImageView						attachments[]			=
66741702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
66841702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_imageView,
66941702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_resolvedImageView,
67041702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
67141702fa78437820bc601e604de6a490eb09513ddPeter Siket
67241702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkFramebufferCreateInfo			framebufferCreateInfo	=
67341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
67441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,	// VkStructureType			sType;
67541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*				pNext;
67641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkFramebufferCreateFlags	flags;
67741702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_renderPass,								// VkRenderPass				renderPass;
67841702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_multisampling ? 2u : 1u,					// deUint32					attachmentCount;
67941702fa78437820bc601e604de6a490eb09513ddPeter Siket			attachments,								// const VkImageView*		pAttachments;
68041702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_renderWidth,								// deUint32					width;
68141702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_renderHeight,								// deUint32					height;
68241702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32					layers;
68341702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
68441702fa78437820bc601e604de6a490eb09513ddPeter Siket
68541702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_frameBuffer = createFramebuffer(vkd, vkDevice, &framebufferCreateInfo, DE_NULL);
68641702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
68741702fa78437820bc601e604de6a490eb09513ddPeter Siket
68841702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Uniform Buffer
68941702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
69041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkBufferCreateInfo				bufferCreateInfo		=
69141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
69241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
69341702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*			pNext;
69441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkBufferCreateFlags	flags;
69541702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_uniformBufferSize,						// VkDeviceSize			size;
69641702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,			// VkBufferUsageFlags	usage;
69741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
69841702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32				queueFamilyIndexCount;
69941702fa78437820bc601e604de6a490eb09513ddPeter Siket			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
70041702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
70141702fa78437820bc601e604de6a490eb09513ddPeter Siket
70241702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_uniformBuffer			= createBuffer(vkd, vkDevice, &bufferCreateInfo);
70341702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_uniformBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *m_uniformBuffer), MemoryRequirement::HostVisible);
70441702fa78437820bc601e604de6a490eb09513ddPeter Siket
70541702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.bindBufferMemory(vkDevice, *m_uniformBuffer, m_uniformBufferMemory->getMemory(), m_uniformBufferMemory->getOffset()));
70641702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
70741702fa78437820bc601e604de6a490eb09513ddPeter Siket
70841702fa78437820bc601e604de6a490eb09513ddPeter Siket	// DescriptorPool
70941702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
71041702fa78437820bc601e604de6a490eb09513ddPeter Siket		DescriptorPoolBuilder					descriptorPoolBuilder;
71141702fa78437820bc601e604de6a490eb09513ddPeter Siket
71241702fa78437820bc601e604de6a490eb09513ddPeter Siket		descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
71341702fa78437820bc601e604de6a490eb09513ddPeter Siket		descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
71441702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_descriptorPool = descriptorPoolBuilder.build(vkd, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 2u);
71541702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
71641702fa78437820bc601e604de6a490eb09513ddPeter Siket
71741702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Fence
718da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	m_fence = createFence(vkd, vkDevice);
71941702fa78437820bc601e604de6a490eb09513ddPeter Siket
72041702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Result Buffer
72141702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
72241702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkBufferCreateInfo				bufferCreateInfo		=
72341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
72441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
72541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*			pNext;
72641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkBufferCreateFlags	flags;
72741702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_resultBufferSize,							// VkDeviceSize			size;
72841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BUFFER_USAGE_TRANSFER_DST_BIT,			// VkBufferUsageFlags	usage;
72941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
73041702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32				queueFamilyIndexCount;
73141702fa78437820bc601e604de6a490eb09513ddPeter Siket			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
73241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
73341702fa78437820bc601e604de6a490eb09513ddPeter Siket
73441702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_resultBuffer			= createBuffer(vkd, vkDevice, &bufferCreateInfo);
73541702fa78437820bc601e604de6a490eb09513ddPeter Siket		m_resultBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *m_resultBuffer), MemoryRequirement::HostVisible);
73641702fa78437820bc601e604de6a490eb09513ddPeter Siket
73741702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.bindBufferMemory(vkDevice, *m_resultBuffer, m_resultBufferMemory->getMemory(), m_resultBufferMemory->getOffset()));
73841702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
73941702fa78437820bc601e604de6a490eb09513ddPeter Siket
74041702fa78437820bc601e604de6a490eb09513ddPeter Siket	clearImage(*m_image);
74141702fa78437820bc601e604de6a490eb09513ddPeter Siket	if(m_multisampling)
74241702fa78437820bc601e604de6a490eb09513ddPeter Siket		clearImage(*m_resolvedImage);
74341702fa78437820bc601e604de6a490eb09513ddPeter Siket}
74441702fa78437820bc601e604de6a490eb09513ddPeter Siket
74541702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureRenderer::~TextureRenderer (void)
74641702fa78437820bc601e604de6a490eb09513ddPeter Siket{
74741702fa78437820bc601e604de6a490eb09513ddPeter Siket}
74841702fa78437820bc601e604de6a490eb09513ddPeter Siket
74941702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::clearImage(VkImage image)
75041702fa78437820bc601e604de6a490eb09513ddPeter Siket{
75141702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&			vkd					= m_context.getDeviceInterface();
75241702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDevice					vkDevice			= m_context.getDevice();
75341702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkCommandBuffer>			commandBuffer;
75441702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkQueue					queue				= m_context.getUniversalQueue();
75541702fa78437820bc601e604de6a490eb09513ddPeter Siket
75641702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageSubresourceRange	subResourcerange	=
75741702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
75841702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_IMAGE_ASPECT_COLOR_BIT,		// VkImageAspectFlags	aspectMask;
75941702fa78437820bc601e604de6a490eb09513ddPeter Siket		0,								// deUint32				baseMipLevel;
76041702fa78437820bc601e604de6a490eb09513ddPeter Siket		1,								// deUint32				levelCount;
76141702fa78437820bc601e604de6a490eb09513ddPeter Siket		0,								// deUint32				baseArrayLayer;
76241702fa78437820bc601e604de6a490eb09513ddPeter Siket		1								// deUint32				layerCount;
76341702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
76441702fa78437820bc601e604de6a490eb09513ddPeter Siket
765da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	commandBuffer = allocateCommandBuffer(vkd, vkDevice, *m_commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
76641702fa78437820bc601e604de6a490eb09513ddPeter Siket
76741702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkCommandBufferBeginInfo		cmdBufferBeginInfo		=
76841702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
76941702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType							sType;
77041702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,										// const void*								pNext;
77141702fa78437820bc601e604de6a490eb09513ddPeter Siket		0u,												// VkCmdBufferOptimizeFlags					flags;
77241702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL											// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
77341702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
77441702fa78437820bc601e604de6a490eb09513ddPeter Siket
77541702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &cmdBufferBeginInfo));
77641702fa78437820bc601e604de6a490eb09513ddPeter Siket
77741702fa78437820bc601e604de6a490eb09513ddPeter Siket	addImageTransitionBarrier(*commandBuffer, image,
77841702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,				// VkPipelineStageFlags		srcStageMask
77941702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,				// VkPipelineStageFlags		dstStageMask
78041702fa78437820bc601e604de6a490eb09513ddPeter Siket							  0,												// VkAccessFlags			srcAccessMask
78141702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_ACCESS_TRANSFER_WRITE_BIT,						// VkAccessFlags			dstAccessMask
78241702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_IMAGE_LAYOUT_UNDEFINED,						// VkImageLayout			oldLayout;
78341702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);			// VkImageLayout			newLayout;
78441702fa78437820bc601e604de6a490eb09513ddPeter Siket
78541702fa78437820bc601e604de6a490eb09513ddPeter Siket	VkClearColorValue color = makeClearValueColorF32(0.0f, 0.0f, 0.0f, 1.0f).color;
78641702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdClearColorImage(*commandBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &subResourcerange);
78741702fa78437820bc601e604de6a490eb09513ddPeter Siket
78841702fa78437820bc601e604de6a490eb09513ddPeter Siket	addImageTransitionBarrier(*commandBuffer, image,
78941702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,				// VkPipelineStageFlags		srcStageMask
79041702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,				// VkPipelineStageFlags		dstStageMask
79141702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_ACCESS_TRANSFER_WRITE_BIT,						// VkAccessFlags			srcAccessMask
79241702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,				// VkAccessFlags			dstAccessMask
79341702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,				// VkImageLayout			oldLayout;
79441702fa78437820bc601e604de6a490eb09513ddPeter Siket							  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);		// VkImageLayout			newLayout;
79541702fa78437820bc601e604de6a490eb09513ddPeter Siket
79641702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.endCommandBuffer(*commandBuffer));
79741702fa78437820bc601e604de6a490eb09513ddPeter Siket
79841702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkSubmitInfo					submitInfo				=
79941702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
80041702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_STRUCTURE_TYPE_SUBMIT_INFO,			// VkStructureType				sType;
80141702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,								// const void*					pNext;
80241702fa78437820bc601e604de6a490eb09513ddPeter Siket		0u,										// deUint32						waitSemaphoreCount;
80341702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,								// const VkSemaphore*			pWaitSemaphores;
80441702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,								// const VkPipelineStageFlags*	pWaitDstStageMask;
80541702fa78437820bc601e604de6a490eb09513ddPeter Siket		1u,										// deUint32						commandBufferCount;
80641702fa78437820bc601e604de6a490eb09513ddPeter Siket		&commandBuffer.get(),					// const VkCommandBuffer*		pCommandBuffers;
80741702fa78437820bc601e604de6a490eb09513ddPeter Siket		0u,										// deUint32						signalSemaphoreCount;
80841702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,								// const VkSemaphore*			pSignalSemaphores;
80941702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
81041702fa78437820bc601e604de6a490eb09513ddPeter Siket
81141702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.resetFences(vkDevice, 1, &m_fence.get()));
81241702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.queueSubmit(queue, 1, &submitInfo, *m_fence));
81341702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
81441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
81541702fa78437820bc601e604de6a490eb09513ddPeter Siket
81641702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::add2DTexture (const TestTexture2DSp& texture)
81741702fa78437820bc601e604de6a490eb09513ddPeter Siket{
81841702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_2D)));
81941702fa78437820bc601e604de6a490eb09513ddPeter Siket}
82041702fa78437820bc601e604de6a490eb09513ddPeter Siket
82141702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::addCubeTexture (const TestTextureCubeSp& texture)
82241702fa78437820bc601e604de6a490eb09513ddPeter Siket{
82341702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_CUBE_MAP)));
82441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
82541702fa78437820bc601e604de6a490eb09513ddPeter Siket
82641702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::add2DArrayTexture (const TestTexture2DArraySp& texture)
82741702fa78437820bc601e604de6a490eb09513ddPeter Siket{
82841702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_2D_ARRAY)));
82941702fa78437820bc601e604de6a490eb09513ddPeter Siket}
83041702fa78437820bc601e604de6a490eb09513ddPeter Siket
83141702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::add3DTexture (const TestTexture3DSp& texture)
83241702fa78437820bc601e604de6a490eb09513ddPeter Siket{
83341702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_3D)));
83441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
83541702fa78437820bc601e604de6a490eb09513ddPeter Siket
83641702fa78437820bc601e604de6a490eb09513ddPeter Siketconst pipeline::TestTexture2D& TextureRenderer::get2DTexture (int textureIndex) const
83741702fa78437820bc601e604de6a490eb09513ddPeter Siket{
83841702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
83941702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_2D);
84041702fa78437820bc601e604de6a490eb09513ddPeter Siket
84141702fa78437820bc601e604de6a490eb09513ddPeter Siket	return dynamic_cast<const pipeline::TestTexture2D&>(m_textureBindings[textureIndex]->getTestTexture());
84241702fa78437820bc601e604de6a490eb09513ddPeter Siket}
84341702fa78437820bc601e604de6a490eb09513ddPeter Siket
84441702fa78437820bc601e604de6a490eb09513ddPeter Siketconst pipeline::TestTextureCube& TextureRenderer::getCubeTexture (int textureIndex) const
84541702fa78437820bc601e604de6a490eb09513ddPeter Siket{
84641702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
84741702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_CUBE_MAP);
84841702fa78437820bc601e604de6a490eb09513ddPeter Siket
84941702fa78437820bc601e604de6a490eb09513ddPeter Siket	return dynamic_cast<const pipeline::TestTextureCube&>(m_textureBindings[textureIndex]->getTestTexture());
85041702fa78437820bc601e604de6a490eb09513ddPeter Siket}
85141702fa78437820bc601e604de6a490eb09513ddPeter Siket
85241702fa78437820bc601e604de6a490eb09513ddPeter Siketconst pipeline::TestTexture2DArray& TextureRenderer::get2DArrayTexture (int textureIndex) const
85341702fa78437820bc601e604de6a490eb09513ddPeter Siket{
85441702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
85541702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_2D_ARRAY);
85641702fa78437820bc601e604de6a490eb09513ddPeter Siket
85741702fa78437820bc601e604de6a490eb09513ddPeter Siket	return dynamic_cast<const pipeline::TestTexture2DArray&>(m_textureBindings[textureIndex]->getTestTexture());
85841702fa78437820bc601e604de6a490eb09513ddPeter Siket}
85941702fa78437820bc601e604de6a490eb09513ddPeter Siket
86041702fa78437820bc601e604de6a490eb09513ddPeter Siketconst pipeline::TestTexture3D& TextureRenderer::get3DTexture (int textureIndex) const
86141702fa78437820bc601e604de6a490eb09513ddPeter Siket{
86241702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
86341702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_3D);
86441702fa78437820bc601e604de6a490eb09513ddPeter Siket
86541702fa78437820bc601e604de6a490eb09513ddPeter Siket	return dynamic_cast<const pipeline::TestTexture3D&>(m_textureBindings[textureIndex]->getTestTexture());
86641702fa78437820bc601e604de6a490eb09513ddPeter Siket}
86741702fa78437820bc601e604de6a490eb09513ddPeter Siket
86841702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::setViewport (float viewportX, float viewportY, float viewportW, float viewportH)
86941702fa78437820bc601e604de6a490eb09513ddPeter Siket{
87041702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_viewportHeight = viewportH;
87141702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_viewportWidth = viewportW;
87241702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_viewportOffsetX = viewportX;
87341702fa78437820bc601e604de6a490eb09513ddPeter Siket	m_viewportOffsetY = viewportY;
87441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
87541702fa78437820bc601e604de6a490eb09513ddPeter Siket
87641702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureBinding* TextureRenderer::getTextureBinding (int textureIndex) const
87741702fa78437820bc601e604de6a490eb09513ddPeter Siket{
87841702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
87941702fa78437820bc601e604de6a490eb09513ddPeter Siket	return m_textureBindings[textureIndex].get();
88041702fa78437820bc601e604de6a490eb09513ddPeter Siket}
88141702fa78437820bc601e604de6a490eb09513ddPeter Siket
88241702fa78437820bc601e604de6a490eb09513ddPeter SiketdeUint32 TextureRenderer::getRenderWidth (void) const
88341702fa78437820bc601e604de6a490eb09513ddPeter Siket{
88441702fa78437820bc601e604de6a490eb09513ddPeter Siket	return m_renderWidth;
88541702fa78437820bc601e604de6a490eb09513ddPeter Siket}
88641702fa78437820bc601e604de6a490eb09513ddPeter Siket
88741702fa78437820bc601e604de6a490eb09513ddPeter SiketdeUint32 TextureRenderer::getRenderHeight (void) const
88841702fa78437820bc601e604de6a490eb09513ddPeter Siket{
88941702fa78437820bc601e604de6a490eb09513ddPeter Siket	return m_renderHeight;
89041702fa78437820bc601e604de6a490eb09513ddPeter Siket}
89141702fa78437820bc601e604de6a490eb09513ddPeter Siket
89241702fa78437820bc601e604de6a490eb09513ddPeter SiketMove<VkDescriptorSet> TextureRenderer::makeDescriptorSet (const VkDescriptorPool descriptorPool, const VkDescriptorSetLayout setLayout) const
89341702fa78437820bc601e604de6a490eb09513ddPeter Siket{
89441702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&						vkd						= m_context.getDeviceInterface();
89541702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDevice								vkDevice				= m_context.getDevice();
89641702fa78437820bc601e604de6a490eb09513ddPeter Siket
89741702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDescriptorSetAllocateInfo			allocateParams			=
89841702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
89941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,		// VkStructureType					sType
90041702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const void*						pNext
90141702fa78437820bc601e604de6a490eb09513ddPeter Siket			descriptorPool,										// VkDescriptorPool					descriptorPool
90241702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,													// deUint32							descriptorSetCount
90341702fa78437820bc601e604de6a490eb09513ddPeter Siket			&setLayout,											// const VkDescriptorSetLayout*		pSetLayouts
90441702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
90541702fa78437820bc601e604de6a490eb09513ddPeter Siket	return allocateDescriptorSet(vkd, vkDevice, &allocateParams);
90641702fa78437820bc601e604de6a490eb09513ddPeter Siket}
90741702fa78437820bc601e604de6a490eb09513ddPeter Siket
90841702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::addImageTransitionBarrier(VkCommandBuffer commandBuffer, VkImage image, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const
90941702fa78437820bc601e604de6a490eb09513ddPeter Siket{
91041702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&			vkd					= m_context.getDeviceInterface();
91141702fa78437820bc601e604de6a490eb09513ddPeter Siket
91241702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageSubresourceRange	subResourcerange	=
91341702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
91441702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_IMAGE_ASPECT_COLOR_BIT,		// VkImageAspectFlags	aspectMask;
91541702fa78437820bc601e604de6a490eb09513ddPeter Siket		0,								// deUint32				baseMipLevel;
91641702fa78437820bc601e604de6a490eb09513ddPeter Siket		1,								// deUint32				levelCount;
91741702fa78437820bc601e604de6a490eb09513ddPeter Siket		0,								// deUint32				baseArrayLayer;
91841702fa78437820bc601e604de6a490eb09513ddPeter Siket		1								// deUint32				layerCount;
91941702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
92041702fa78437820bc601e604de6a490eb09513ddPeter Siket
92141702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkImageMemoryBarrier		imageBarrier		=
92241702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
92341702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// VkStructureType			sType;
92441702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_NULL,									// const void*				pNext;
92541702fa78437820bc601e604de6a490eb09513ddPeter Siket		srcAccessMask,								// VkAccessFlags			srcAccessMask;
92641702fa78437820bc601e604de6a490eb09513ddPeter Siket		dstAccessMask,								// VkAccessFlags			dstAccessMask;
92741702fa78437820bc601e604de6a490eb09513ddPeter Siket		oldLayout,									// VkImageLayout			oldLayout;
92841702fa78437820bc601e604de6a490eb09513ddPeter Siket		newLayout,									// VkImageLayout			newLayout;
92941702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_QUEUE_FAMILY_IGNORED,					// deUint32					srcQueueFamilyIndex;
93041702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_QUEUE_FAMILY_IGNORED,					// deUint32					destQueueFamilyIndex;
93141702fa78437820bc601e604de6a490eb09513ddPeter Siket		image,										// VkImage					image;
93241702fa78437820bc601e604de6a490eb09513ddPeter Siket		subResourcerange							// VkImageSubresourceRange	subresourceRange;
93341702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
93441702fa78437820bc601e604de6a490eb09513ddPeter Siket
93541702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, 0, 0, DE_NULL, 0, DE_NULL, 1, &imageBarrier);
93641702fa78437820bc601e604de6a490eb09513ddPeter Siket}
93741702fa78437820bc601e604de6a490eb09513ddPeter Siket
93841702fa78437820bc601e604de6a490eb09513ddPeter Siket
93941702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, TextureType texType)
94041702fa78437820bc601e604de6a490eb09513ddPeter Siket{
94141702fa78437820bc601e604de6a490eb09513ddPeter Siket	renderQuad(result, texUnit, texCoord, ReferenceParams(texType));
94241702fa78437820bc601e604de6a490eb09513ddPeter Siket}
94341702fa78437820bc601e604de6a490eb09513ddPeter Siket
94441702fa78437820bc601e604de6a490eb09513ddPeter Siketvoid TextureRenderer::renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, const ReferenceParams& params)
94541702fa78437820bc601e604de6a490eb09513ddPeter Siket{
946b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa	const float	maxAnisotropy = 1.0f;
947b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa	float		positions[]	=
948b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa	{
949b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		-1.0,	-1.0f,	0.0f,	1.0f,
950b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		-1.0f,	+1.0f,	0.0f,	1.0f,
951b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		+1.0f,	-1.0f,	0.0f,	1.0f,
952b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		+1.0f,	+1.0f,	0.0f,	1.0f
953b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa	};
954b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa	renderQuad(result, positions, texUnit, texCoord, params, maxAnisotropy);
955b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa}
956b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa
957b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwavoid TextureRenderer::renderQuad (tcu::Surface&									result,
958b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa								  const float*									positions,
959b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa								  int											texUnit,
960b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa								  const float*									texCoord,
961b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa								  const glu::TextureTestUtil::ReferenceParams&	params,
962b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa								  const float									maxAnisotropy)
963b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa{
96441702fa78437820bc601e604de6a490eb09513ddPeter Siket	const DeviceInterface&		vkd						= m_context.getDeviceInterface();
96541702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkDevice				vkDevice				= m_context.getDevice();
96641702fa78437820bc601e604de6a490eb09513ddPeter Siket	const VkQueue				queue					= m_context.getUniversalQueue();
96741702fa78437820bc601e604de6a490eb09513ddPeter Siket	const deUint32				queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
96841702fa78437820bc601e604de6a490eb09513ddPeter Siket	Allocator&					allocator				= m_context.getDefaultAllocator();
96941702fa78437820bc601e604de6a490eb09513ddPeter Siket
97041702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::Vec4					wCoord					= params.flags & RenderParams::PROJECTED ? params.w : tcu::Vec4(1.0f);
97141702fa78437820bc601e604de6a490eb09513ddPeter Siket	bool						useBias					= !!(params.flags & RenderParams::USE_BIAS);
97241702fa78437820bc601e604de6a490eb09513ddPeter Siket	bool						logUniforms				= !!(params.flags & RenderParams::LOG_UNIFORMS);
97341702fa78437820bc601e604de6a490eb09513ddPeter Siket
97441702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Render quad with texture.
97541702fa78437820bc601e604de6a490eb09513ddPeter Siket	float						position[]				=
97641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
977b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		positions[0]*wCoord.x(),	positions[1]*wCoord.x(),	positions[2],	positions[3]*wCoord.x(),
978b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		positions[4]*wCoord.y(),	positions[5]*wCoord.y(),	positions[6],	positions[7]*wCoord.y(),
979b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		positions[8]*wCoord.z(),	positions[9]*wCoord.z(),	positions[10],	positions[11]*wCoord.z(),
980b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		positions[12]*wCoord.w(),	positions[13]*wCoord.w(),	positions[14],	positions[15]*wCoord.w()
98141702fa78437820bc601e604de6a490eb09513ddPeter Siket	};
98241702fa78437820bc601e604de6a490eb09513ddPeter Siket
98341702fa78437820bc601e604de6a490eb09513ddPeter Siket	Program						progSpec				= PROGRAM_LAST;
98441702fa78437820bc601e604de6a490eb09513ddPeter Siket	int							numComps				= 0;
98541702fa78437820bc601e604de6a490eb09513ddPeter Siket
98641702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (params.texType == TEXTURETYPE_2D)
98741702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
98841702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 2;
98941702fa78437820bc601e604de6a490eb09513ddPeter Siket
99041702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
99141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
99241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = useBias ? PROGRAM_2D_FLOAT_BIAS	: PROGRAM_2D_FLOAT;		break;
99341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = useBias ? PROGRAM_2D_INT_BIAS	: PROGRAM_2D_INT;		break;
99441702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = useBias ? PROGRAM_2D_UINT_BIAS	: PROGRAM_2D_UINT;		break;
99541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_SHADOW:	progSpec = useBias ? PROGRAM_2D_SHADOW_BIAS	: PROGRAM_2D_SHADOW;	break;
99641702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
99741702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
99841702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
99941702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_1D)
100041702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
100141702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 1;
100241702fa78437820bc601e604de6a490eb09513ddPeter Siket
100341702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
100441702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
100541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = useBias ? PROGRAM_1D_FLOAT_BIAS	: PROGRAM_1D_FLOAT;		break;
100641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = useBias ? PROGRAM_1D_INT_BIAS	: PROGRAM_1D_INT;		break;
100741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = useBias ? PROGRAM_1D_UINT_BIAS	: PROGRAM_1D_UINT;		break;
100841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_SHADOW:	progSpec = useBias ? PROGRAM_1D_SHADOW_BIAS	: PROGRAM_1D_SHADOW;	break;
100941702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
101041702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
101141702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
101241702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_CUBE)
101341702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
101441702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 3;
101541702fa78437820bc601e604de6a490eb09513ddPeter Siket
101641702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
101741702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
101841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = useBias ? PROGRAM_CUBE_FLOAT_BIAS	: PROGRAM_CUBE_FLOAT;	break;
101941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = useBias ? PROGRAM_CUBE_INT_BIAS		: PROGRAM_CUBE_INT;		break;
102041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = useBias ? PROGRAM_CUBE_UINT_BIAS		: PROGRAM_CUBE_UINT;	break;
102141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_SHADOW:	progSpec = useBias ? PROGRAM_CUBE_SHADOW_BIAS	: PROGRAM_CUBE_SHADOW;	break;
102241702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
102341702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
102441702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
102541702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_3D)
102641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
102741702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 3;
102841702fa78437820bc601e604de6a490eb09513ddPeter Siket
102941702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
103041702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
103141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = useBias ? PROGRAM_3D_FLOAT_BIAS	: PROGRAM_3D_FLOAT;		break;
103241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = useBias ? PROGRAM_3D_INT_BIAS	: PROGRAM_3D_INT;		break;
103341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = useBias ? PROGRAM_3D_UINT_BIAS	: PROGRAM_3D_UINT;		break;
103441702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
103541702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
103641702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
103741702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_2D_ARRAY)
103841702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
103941702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_ASSERT(!useBias); // \todo [2012-02-17 pyry] Support bias.
104041702fa78437820bc601e604de6a490eb09513ddPeter Siket
104141702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 3;
104241702fa78437820bc601e604de6a490eb09513ddPeter Siket
104341702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
104441702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
104541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = PROGRAM_2D_ARRAY_FLOAT;	break;
104641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = PROGRAM_2D_ARRAY_INT;	break;
104741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = PROGRAM_2D_ARRAY_UINT;	break;
104841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_SHADOW:	progSpec = PROGRAM_2D_ARRAY_SHADOW;	break;
104941702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
105041702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
105141702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
105241702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_CUBE_ARRAY)
105341702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
105441702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_ASSERT(!useBias);
105541702fa78437820bc601e604de6a490eb09513ddPeter Siket
105641702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 4;
105741702fa78437820bc601e604de6a490eb09513ddPeter Siket
105841702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
105941702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
106041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = PROGRAM_CUBE_ARRAY_FLOAT;	break;
106141702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = PROGRAM_CUBE_ARRAY_INT;		break;
106241702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = PROGRAM_CUBE_ARRAY_UINT;		break;
106341702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_SHADOW:	progSpec = PROGRAM_CUBE_ARRAY_SHADOW;	break;
106441702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
106541702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
106641702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
106741702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_1D_ARRAY)
106841702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
106941702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_ASSERT(!useBias); // \todo [2012-02-17 pyry] Support bias.
107041702fa78437820bc601e604de6a490eb09513ddPeter Siket
107141702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 2;
107241702fa78437820bc601e604de6a490eb09513ddPeter Siket
107341702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
107441702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
107541702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FLOAT:		progSpec = PROGRAM_1D_ARRAY_FLOAT;	break;
107641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_INT:		progSpec = PROGRAM_1D_ARRAY_INT;	break;
107741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_UINT:		progSpec = PROGRAM_1D_ARRAY_UINT;	break;
107841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_SHADOW:	progSpec = PROGRAM_1D_ARRAY_SHADOW;	break;
107941702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:					DE_ASSERT(false);
108041702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
108141702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
108241702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (params.texType == TEXTURETYPE_BUFFER)
108341702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
108441702fa78437820bc601e604de6a490eb09513ddPeter Siket		numComps = 1;
108541702fa78437820bc601e604de6a490eb09513ddPeter Siket
108641702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (params.samplerType)
108741702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
108841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FETCH_FLOAT:	progSpec = PROGRAM_BUFFER_FLOAT;	break;
108941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FETCH_INT:		progSpec = PROGRAM_BUFFER_INT;		break;
109041702fa78437820bc601e604de6a490eb09513ddPeter Siket			case SAMPLERTYPE_FETCH_UINT:	progSpec = PROGRAM_BUFFER_UINT;		break;
109141702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:						DE_ASSERT(false);
109241702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
109341702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
109441702fa78437820bc601e604de6a490eb09513ddPeter Siket	else
109541702fa78437820bc601e604de6a490eb09513ddPeter Siket		DE_ASSERT(DE_FALSE);
109641702fa78437820bc601e604de6a490eb09513ddPeter Siket
109750c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	Unique<VkShaderModule>					vertexShaderModule			(createShaderModule(vkd, vkDevice, m_context.getBinaryCollection().get("vertext_" + std::string(getProgramName(progSpec))), 0));
109850c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	Unique<VkShaderModule>					fragmentShaderModule		(createShaderModule(vkd, vkDevice, m_context.getBinaryCollection().get("fragment_" + std::string(getProgramName(progSpec))), 0));
109941702fa78437820bc601e604de6a490eb09513ddPeter Siket
110041702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkSampler>							sampler;
110141702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkDescriptorSet>					descriptorSet[2];
110241702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkDescriptorSetLayout>				descriptorSetLayout[2];
110341702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkPipelineLayout>					pipelineLayout;
110441702fa78437820bc601e604de6a490eb09513ddPeter Siket
110541702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkCommandBuffer>					commandBuffer;
110641702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkPipeline>						graphicsPipeline;
110741702fa78437820bc601e604de6a490eb09513ddPeter Siket	Move<VkBuffer>							vertexBuffer;
110841702fa78437820bc601e604de6a490eb09513ddPeter Siket	de::MovePtr<Allocation>					vertexBufferMemory;
110941702fa78437820bc601e604de6a490eb09513ddPeter Siket
111050c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	const VkDeviceSize						vertexBufferOffset			= 0;
111150c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	const deUint32							vertexPositionStrideSize	= deUint32(sizeof(tcu::Vec4));
111250c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	const deUint32							vertexTextureStrideSize		= deUint32(numComps * sizeof(float));
111350c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	const deUint32							positionDataSize			= vertexPositionStrideSize * 4u;
111450c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	const deUint32							textureCoordDataSize		= vertexTextureStrideSize * 4u;
111550c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks
111650c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks	const VkPhysicalDeviceProperties		properties					= m_context.getDeviceProperties();
111741702fa78437820bc601e604de6a490eb09513ddPeter Siket
111841702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (positionDataSize > properties.limits.maxVertexInputAttributeOffset)
111941702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
112041702fa78437820bc601e604de6a490eb09513ddPeter Siket		std::stringstream message;
112141702fa78437820bc601e604de6a490eb09513ddPeter Siket		message << "Larger vertex input attribute offset is needed (" << positionDataSize << ") than the available maximum (" << properties.limits.maxVertexInputAttributeOffset << ").";
112241702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_THROW(NotSupportedError, message.str().c_str());
112341702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
112441702fa78437820bc601e604de6a490eb09513ddPeter Siket
112541702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Create Graphics Pipeline
112641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
112741702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineShaderStageCreateInfo	shaderStageParams[2]	=
112841702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
112941702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
113041702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType					sType;
113141702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL,													// const void*						pNext;
113241702fa78437820bc601e604de6a490eb09513ddPeter Siket				0,															// VkPipelineShaderStageCreateFlags flags;
113341702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStage					stage;
113441702fa78437820bc601e604de6a490eb09513ddPeter Siket				*vertexShaderModule,										// VkShaderModule					shader;
113541702fa78437820bc601e604de6a490eb09513ddPeter Siket				"main",														// const char*						pName;
113641702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL														// const VkSpecializationInfo*		pSpecializationInfo;
113741702fa78437820bc601e604de6a490eb09513ddPeter Siket			},
113841702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
113941702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType					sType;
114041702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL,													// const void*						pNext;
114141702fa78437820bc601e604de6a490eb09513ddPeter Siket				0,															// VkPipelineShaderStageCreateFlags flags;
114241702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStage					stage;
114341702fa78437820bc601e604de6a490eb09513ddPeter Siket				*fragmentShaderModule,										// VkShaderModule					shader;
114441702fa78437820bc601e604de6a490eb09513ddPeter Siket				"main",														// const char*						pName;
114541702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL														// const VkSpecializationInfo*		pSpecializationInfo;
114641702fa78437820bc601e604de6a490eb09513ddPeter Siket			}
114741702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
114841702fa78437820bc601e604de6a490eb09513ddPeter Siket
114941702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkVertexInputBindingDescription	vertexInputBindingDescription[2]	=
115041702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
115141702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
115241702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,								// deUint32					binding;
115341702fa78437820bc601e604de6a490eb09513ddPeter Siket				vertexPositionStrideSize,		// deUint32					strideInBytes;
115441702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_VERTEX_INPUT_RATE_VERTEX		// VkVertexInputStepRate	stepRate;
115541702fa78437820bc601e604de6a490eb09513ddPeter Siket			},
115641702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
115741702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,								// deUint32					binding;
115841702fa78437820bc601e604de6a490eb09513ddPeter Siket				vertexTextureStrideSize,		// deUint32					strideInBytes;
115941702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_VERTEX_INPUT_RATE_VERTEX		// VkVertexInputStepRate	stepRate;
116041702fa78437820bc601e604de6a490eb09513ddPeter Siket			}
116141702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
116241702fa78437820bc601e604de6a490eb09513ddPeter Siket
116341702fa78437820bc601e604de6a490eb09513ddPeter Siket		VkFormat								textureCoordinateFormat			= VK_FORMAT_R32G32B32A32_SFLOAT;
116441702fa78437820bc601e604de6a490eb09513ddPeter Siket
116541702fa78437820bc601e604de6a490eb09513ddPeter Siket		switch (numComps) {
116641702fa78437820bc601e604de6a490eb09513ddPeter Siket			case 1: textureCoordinateFormat = VK_FORMAT_R32_SFLOAT;				break;
116741702fa78437820bc601e604de6a490eb09513ddPeter Siket			case 2: textureCoordinateFormat = VK_FORMAT_R32G32_SFLOAT;			break;
116841702fa78437820bc601e604de6a490eb09513ddPeter Siket			case 3: textureCoordinateFormat = VK_FORMAT_R32G32B32_SFLOAT;		break;
116941702fa78437820bc601e604de6a490eb09513ddPeter Siket			case 4: textureCoordinateFormat = VK_FORMAT_R32G32B32A32_SFLOAT;	break;
117041702fa78437820bc601e604de6a490eb09513ddPeter Siket			default:
117141702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_ASSERT(false);
117241702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
117341702fa78437820bc601e604de6a490eb09513ddPeter Siket
117441702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkVertexInputAttributeDescription	vertexInputAttributeDescriptions[2] =
117541702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
117641702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
117741702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,									// deUint32	location;
117841702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,									// deUint32	binding;
117941702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
118041702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u									// deUint32	offsetInBytes;
118141702fa78437820bc601e604de6a490eb09513ddPeter Siket			},
118241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
118341702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,									// deUint32	location;
118441702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u,									// deUint32	binding;
118541702fa78437820bc601e604de6a490eb09513ddPeter Siket				textureCoordinateFormat,			// VkFormat	format;
118641702fa78437820bc601e604de6a490eb09513ddPeter Siket				positionDataSize					// deUint32	offsetInBytes;
118741702fa78437820bc601e604de6a490eb09513ddPeter Siket			}
118841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
118941702fa78437820bc601e604de6a490eb09513ddPeter Siket
119041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineVertexInputStateCreateInfo	vertexInputStateParams =
119141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
119241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
119341702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,														// const void*								pNext;
119441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0,																// VkPipelineVertexInputStateCreateFlags	flags;
119541702fa78437820bc601e604de6a490eb09513ddPeter Siket			2u,																// deUint32									bindingCount;
119641702fa78437820bc601e604de6a490eb09513ddPeter Siket			vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
119741702fa78437820bc601e604de6a490eb09513ddPeter Siket			2u,																// deUint32									attributeCount;
119841702fa78437820bc601e604de6a490eb09513ddPeter Siket			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
119941702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
120041702fa78437820bc601e604de6a490eb09513ddPeter Siket
120141702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyStateParams =
120241702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
120341702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
120441702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,														// const void*								pNext;
120541702fa78437820bc601e604de6a490eb09513ddPeter Siket			0,																// VkPipelineInputAssemblyStateCreateFlags	flags;
120641702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology						topology;
120741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE														// VkBool32									primitiveRestartEnable;
120841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
120941702fa78437820bc601e604de6a490eb09513ddPeter Siket
121041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkViewport						viewport =
121141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
121241702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_viewportOffsetX,			// float	originX;
121341702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_viewportOffsetY,			// float	originY;
121441702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_viewportWidth,			// float	width;
121541702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_viewportHeight,			// float	height;
121641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0.0f,						// float	minDepth;
121741702fa78437820bc601e604de6a490eb09513ddPeter Siket			1.0f						// float	maxDepth;
121841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
121941702fa78437820bc601e604de6a490eb09513ddPeter Siket
122041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkRect2D							scissor =
122141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
122241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{ 0, 0 },														// VkOffset2D  offset;
122341702fa78437820bc601e604de6a490eb09513ddPeter Siket			{ m_renderWidth, m_renderHeight }								// VkExtent2D  extent;
122441702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
122541702fa78437820bc601e604de6a490eb09513ddPeter Siket
122641702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineViewportStateCreateInfo	viewportStateParams =
122741702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
122841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType						sType;
122941702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,														// const void*							pNext;
123041702fa78437820bc601e604de6a490eb09513ddPeter Siket			0,																// VkPipelineViewportStateCreateFlags	flags;
123141702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,																// deUint32								viewportCount;
123241702fa78437820bc601e604de6a490eb09513ddPeter Siket			&viewport,														// const VkViewport*					pViewports;
123341702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,																// deUint32								scissorCount;
123441702fa78437820bc601e604de6a490eb09513ddPeter Siket			&scissor														// const VkRect2D*						pScissors;
123541702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
123641702fa78437820bc601e604de6a490eb09513ddPeter Siket
123741702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
123841702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
123941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
124041702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,														// const void*								pNext;
124141702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,																// VkPipelineMultisampleStateCreateFlags	flags;
124241702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_sampleCount,													// VkSampleCountFlagBits					rasterizationSamples;
124341702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,														// VkBool32									sampleShadingEnable;
124441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0.0f,															// float									minSampleShading;
124541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,														// const VkSampleMask*						pSampleMask;
124641702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,														// VkBool32									alphaToCoverageEnable;
124741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE														// VkBool32									alphaToOneEnable;
124841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
124941702fa78437820bc601e604de6a490eb09513ddPeter Siket
125041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineRasterizationStateCreateInfo	rasterizationStateCreateInfo	=
125141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
125241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType							sType;
125341702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,														// const void*								pNext;
125441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0,																// VkPipelineRasterizationStateCreateFlags	flags;
125541702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,														// VkBool32									depthClipEnable;
125641702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,														// VkBool32									rasterizerDiscardEnable;
125741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_POLYGON_MODE_FILL,											// VkFillMode								fillMode;
125841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_CULL_MODE_NONE,												// VkCullMode								cullMode;
125941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
126041702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,														// VkBool32									depthBiasEnable;
126141702fa78437820bc601e604de6a490eb09513ddPeter Siket			0.0f,															// float									depthBias;
126241702fa78437820bc601e604de6a490eb09513ddPeter Siket			0.0f,															// float									depthBiasClamp;
126341702fa78437820bc601e604de6a490eb09513ddPeter Siket			0.0f,															// float									slopeScaledDepthBias;
126441702fa78437820bc601e604de6a490eb09513ddPeter Siket			1.0f,															// float									lineWidth;
126541702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
126641702fa78437820bc601e604de6a490eb09513ddPeter Siket
126741702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineColorBlendAttachmentState	colorBlendAttachmentState	=
126841702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
126941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,													// VkBool32			blendEnable;
127041702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BLEND_FACTOR_ONE,										// VkBlend			srcBlendColor;
127141702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BLEND_FACTOR_ZERO,										// VkBlend			destBlendColor;
127241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BLEND_OP_ADD,											// VkBlendOp		blendOpColor;
127341702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BLEND_FACTOR_ONE,										// VkBlend			srcBlendAlpha;
127441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BLEND_FACTOR_ZERO,										// VkBlend			destBlendAlpha;
127541702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BLEND_OP_ADD,											// VkBlendOp		blendOpAlpha;
127641702fa78437820bc601e604de6a490eb09513ddPeter Siket			(VK_COLOR_COMPONENT_R_BIT |
127741702fa78437820bc601e604de6a490eb09513ddPeter Siket			 VK_COLOR_COMPONENT_G_BIT |
127841702fa78437820bc601e604de6a490eb09513ddPeter Siket			 VK_COLOR_COMPONENT_B_BIT |
127941702fa78437820bc601e604de6a490eb09513ddPeter Siket			 VK_COLOR_COMPONENT_A_BIT)									// VkChannelFlags	channelWriteMask;
128041702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
128141702fa78437820bc601e604de6a490eb09513ddPeter Siket
128241702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkPipelineColorBlendStateCreateInfo	colorBlendStateParams		=
128341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
128441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
128541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,													// const void*									pNext;
128641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0,															// VkPipelineColorBlendStateCreateFlags			flags;
128741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_FALSE,													// VkBool32										logicOpEnable;
128841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
128941702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,															// deUint32										attachmentCount;
129041702fa78437820bc601e604de6a490eb09513ddPeter Siket			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
129141702fa78437820bc601e604de6a490eb09513ddPeter Siket			{ 0.0f, 0.0f, 0.0f, 0.0f },									// float										blendConst[4];
129241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
129341702fa78437820bc601e604de6a490eb09513ddPeter Siket
1294b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		VkSamplerCreateInfo					samplerCreateInfo			= mapSampler(params.sampler, m_textureBindings[texUnit]->getTestTexture().getTextureFormat(), params.minLod, params.maxLod);
1295b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa
1296b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		if (maxAnisotropy > 1.0f)
1297b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		{
1298b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa			samplerCreateInfo.anisotropyEnable = VK_TRUE;
1299b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa			samplerCreateInfo.maxAnisotropy = maxAnisotropy;
1300b53c2e6f85be0ce0c789ad557cfe9d0732162204Arkadiusz Sarwa		}
130141702fa78437820bc601e604de6a490eb09513ddPeter Siket
130241702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (samplerCreateInfo.magFilter == VK_FILTER_LINEAR || samplerCreateInfo.minFilter == VK_FILTER_LINEAR || samplerCreateInfo.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR)
130341702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
1304044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan			const pipeline::TestTexture&	testTexture			= m_textureBindings[texUnit]->getTestTexture();
1305044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan			const VkFormat					textureFormat		= testTexture.isCompressed() ? mapCompressedTextureFormat(testTexture.getCompressedLevel(0, 0).getFormat())
1306044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan																							 : mapTextureFormat          (testTexture.getTextureFormat());
1307044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan			const VkFormatProperties		formatProperties	= getPhysicalDeviceFormatProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), textureFormat);
1308044cdcc8c124e9b75d36e6a62d8ff42086017037Szilard Ledan
130941702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT))
131041702fa78437820bc601e604de6a490eb09513ddPeter Siket				TCU_THROW(NotSupportedError, "Linear filtering for this image format is not supported");
131141702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
131241702fa78437820bc601e604de6a490eb09513ddPeter Siket
131341702fa78437820bc601e604de6a490eb09513ddPeter Siket		sampler = createSampler(vkd, vkDevice, &samplerCreateInfo);
131441702fa78437820bc601e604de6a490eb09513ddPeter Siket
131541702fa78437820bc601e604de6a490eb09513ddPeter Siket		descriptorSetLayout[0] = DescriptorSetLayoutBuilder()
131641702fa78437820bc601e604de6a490eb09513ddPeter Siket											.addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_FRAGMENT_BIT)
131741702fa78437820bc601e604de6a490eb09513ddPeter Siket												.build(vkd, vkDevice);
131841702fa78437820bc601e604de6a490eb09513ddPeter Siket
131941702fa78437820bc601e604de6a490eb09513ddPeter Siket		descriptorSetLayout[1] = DescriptorSetLayoutBuilder()
132041702fa78437820bc601e604de6a490eb09513ddPeter Siket											.addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, &sampler.get())
132141702fa78437820bc601e604de6a490eb09513ddPeter Siket											.build(vkd, vkDevice);
132241702fa78437820bc601e604de6a490eb09513ddPeter Siket
132341702fa78437820bc601e604de6a490eb09513ddPeter Siket
132441702fa78437820bc601e604de6a490eb09513ddPeter Siket		descriptorSet[0] = makeDescriptorSet(*m_descriptorPool, *descriptorSetLayout[0]);
132541702fa78437820bc601e604de6a490eb09513ddPeter Siket		descriptorSet[1] = makeDescriptorSet(*m_descriptorPool, *descriptorSetLayout[1]);
132641702fa78437820bc601e604de6a490eb09513ddPeter Siket
132741702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
132841702fa78437820bc601e604de6a490eb09513ddPeter Siket			const VkDescriptorBufferInfo			descriptorBufferInfo	=
132941702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
133041702fa78437820bc601e604de6a490eb09513ddPeter Siket				*m_uniformBuffer,							// VkBuffer		buffer;
133141702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,											// VkDeviceSize	offset;
133241702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_WHOLE_SIZE								// VkDeviceSize	range;
133341702fa78437820bc601e604de6a490eb09513ddPeter Siket			};
133441702fa78437820bc601e604de6a490eb09513ddPeter Siket
133541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DescriptorSetUpdateBuilder()
133641702fa78437820bc601e604de6a490eb09513ddPeter Siket				.writeSingle(*descriptorSet[0], DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descriptorBufferInfo)
133741702fa78437820bc601e604de6a490eb09513ddPeter Siket				.update(vkd, vkDevice);
133841702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
133941702fa78437820bc601e604de6a490eb09513ddPeter Siket
134041702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
134141702fa78437820bc601e604de6a490eb09513ddPeter Siket			VkDescriptorImageInfo					descriptorImageInfo		=
134241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
134341702fa78437820bc601e604de6a490eb09513ddPeter Siket				*sampler,										// VkSampler		sampler;
134441702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_textureBindings[texUnit]->getImageView(),		// VkImageView		imageView;
134541702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL		// VkImageLayout	imageLayout;
134641702fa78437820bc601e604de6a490eb09513ddPeter Siket			};
134741702fa78437820bc601e604de6a490eb09513ddPeter Siket
134841702fa78437820bc601e604de6a490eb09513ddPeter Siket			DescriptorSetUpdateBuilder()
134941702fa78437820bc601e604de6a490eb09513ddPeter Siket				.writeSingle(*descriptorSet[1], DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorImageInfo)
135041702fa78437820bc601e604de6a490eb09513ddPeter Siket				.update(vkd, vkDevice);
135141702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
135241702fa78437820bc601e604de6a490eb09513ddPeter Siket
135341702fa78437820bc601e604de6a490eb09513ddPeter Siket		// Pipeline Layout
135441702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
135541702fa78437820bc601e604de6a490eb09513ddPeter Siket			VkDescriptorSetLayout					descriptorSetLayouts[2]		=
135641702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
135741702fa78437820bc601e604de6a490eb09513ddPeter Siket				*descriptorSetLayout[0],
135841702fa78437820bc601e604de6a490eb09513ddPeter Siket				*descriptorSetLayout[1]
135941702fa78437820bc601e604de6a490eb09513ddPeter Siket			};
136041702fa78437820bc601e604de6a490eb09513ddPeter Siket
136141702fa78437820bc601e604de6a490eb09513ddPeter Siket			const VkPipelineLayoutCreateInfo		pipelineLayoutCreateInfo	=
136241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
136341702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
136441702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL,											// const void*					pNext;
136541702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,													// VkPipelineLayoutCreateFlags	flags;
136641702fa78437820bc601e604de6a490eb09513ddPeter Siket				2u,													// deUint32						descriptorSetCount;
136741702fa78437820bc601e604de6a490eb09513ddPeter Siket				descriptorSetLayouts,								// const VkDescriptorSetLayout*	pSetLayouts;
136841702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,													// deUint32						pushConstantRangeCount;
136941702fa78437820bc601e604de6a490eb09513ddPeter Siket				DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
137041702fa78437820bc601e604de6a490eb09513ddPeter Siket			};
137141702fa78437820bc601e604de6a490eb09513ddPeter Siket
137241702fa78437820bc601e604de6a490eb09513ddPeter Siket			pipelineLayout = createPipelineLayout(vkd, vkDevice, &pipelineLayoutCreateInfo);
137341702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
137441702fa78437820bc601e604de6a490eb09513ddPeter Siket
137541702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
137641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
137741702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
137841702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const void*										pNext;
137941702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// VkPipelineCreateFlags							flags;
138041702fa78437820bc601e604de6a490eb09513ddPeter Siket			2u,													// deUint32											stageCount;
138141702fa78437820bc601e604de6a490eb09513ddPeter Siket			shaderStageParams,									// const VkPipelineShaderStageCreateInfo*			pStages;
138241702fa78437820bc601e604de6a490eb09513ddPeter Siket			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
138341702fa78437820bc601e604de6a490eb09513ddPeter Siket			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
138441702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
138541702fa78437820bc601e604de6a490eb09513ddPeter Siket			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
138641702fa78437820bc601e604de6a490eb09513ddPeter Siket			&rasterizationStateCreateInfo,						// const VkPipelineRasterStateCreateInfo*			pRasterizationState;
138741702fa78437820bc601e604de6a490eb09513ddPeter Siket			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
138841702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
138941702fa78437820bc601e604de6a490eb09513ddPeter Siket			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
139041702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,											// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
139141702fa78437820bc601e604de6a490eb09513ddPeter Siket			*pipelineLayout,									// VkPipelineLayout									layout;
139241702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_renderPass,										// VkRenderPass										renderPass;
139341702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// deUint32											subpass;
139441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,													// VkPipeline										basePipelineHandle;
139541702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u													// deInt32											basePipelineIndex;
139641702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
139741702fa78437820bc601e604de6a490eb09513ddPeter Siket
139841702fa78437820bc601e604de6a490eb09513ddPeter Siket		graphicsPipeline		= createGraphicsPipeline(vkd, vkDevice, DE_NULL, &graphicsPipelineParams);
139941702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
140041702fa78437820bc601e604de6a490eb09513ddPeter Siket
140141702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Create Vertex Buffer
140241702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
140350c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks		VkDeviceSize bufferSize = positionDataSize + textureCoordDataSize;
140450c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks
140550c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks		// Pad the buffer size to a stride multiple for the last element so that it isn't out of bounds
140650c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks		bufferSize += vertexTextureStrideSize - ((bufferSize - vertexBufferOffset) % vertexTextureStrideSize);
140750c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks
140841702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkBufferCreateInfo			vertexBufferParams		=
140941702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
141041702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
141141702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*			pNext;
141241702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkBufferCreateFlags	flags;
141350c0544ec8c2e99158bf8a375eacfc9baf364a91Noah Fredriks			bufferSize,									// VkDeviceSize			size;
141441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
141541702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
141641702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,											// deUint32				queueFamilyCount;
141741702fa78437820bc601e604de6a490eb09513ddPeter Siket			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
141841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
141941702fa78437820bc601e604de6a490eb09513ddPeter Siket
142041702fa78437820bc601e604de6a490eb09513ddPeter Siket		vertexBuffer		= createBuffer(vkd, vkDevice, &vertexBufferParams);
142141702fa78437820bc601e604de6a490eb09513ddPeter Siket		vertexBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible);
142241702fa78437820bc601e604de6a490eb09513ddPeter Siket
142341702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
142441702fa78437820bc601e604de6a490eb09513ddPeter Siket
142541702fa78437820bc601e604de6a490eb09513ddPeter Siket		// Load vertices into vertex buffer
142641702fa78437820bc601e604de6a490eb09513ddPeter Siket		deMemcpy(vertexBufferMemory->getHostPtr(), position, positionDataSize);
142741702fa78437820bc601e604de6a490eb09513ddPeter Siket		deMemcpy(reinterpret_cast<deUint8*>(vertexBufferMemory->getHostPtr()) +  positionDataSize, texCoord, textureCoordDataSize);
142846abca75bab000788fcc6289adfd3e668203d20fMaciej Jesionowski		flushMappedMemoryRange(vkd, vkDevice, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset(), VK_WHOLE_SIZE);
142941702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
143041702fa78437820bc601e604de6a490eb09513ddPeter Siket
143141702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Create Command Buffer
1432da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	commandBuffer = allocateCommandBuffer(vkd, vkDevice, *m_commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
143341702fa78437820bc601e604de6a490eb09513ddPeter Siket
143441702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Begin Command Buffer
143541702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
143641702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkCommandBufferBeginInfo		cmdBufferBeginInfo		=
143741702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
143841702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType							sType;
143941702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,										// const void*								pNext;
144041702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,												// VkCmdBufferOptimizeFlags					flags;
144141702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL											// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
144241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
144341702fa78437820bc601e604de6a490eb09513ddPeter Siket
144441702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &cmdBufferBeginInfo));
144541702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
144641702fa78437820bc601e604de6a490eb09513ddPeter Siket
144741702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Begin Render Pass
144841702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
144941702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkRenderPassBeginInfo			renderPassBeginInfo		=
145041702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
145141702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
145241702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,												// const void*			pNext;
145341702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_renderPass,											// VkRenderPass			renderPass;
145441702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_frameBuffer,											// VkFramebuffer		framebuffer;
145541702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
145641702fa78437820bc601e604de6a490eb09513ddPeter Siket				{ 0, 0 },
145741702fa78437820bc601e604de6a490eb09513ddPeter Siket				{ m_renderWidth, m_renderHeight }
145841702fa78437820bc601e604de6a490eb09513ddPeter Siket			},														// VkRect2D				renderArea;
145941702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,														// deUint32				clearValueCount;
146041702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL													// const VkClearValue*	pClearValues;
146141702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
146241702fa78437820bc601e604de6a490eb09513ddPeter Siket
146341702fa78437820bc601e604de6a490eb09513ddPeter Siket		vkd.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
146441702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
146541702fa78437820bc601e604de6a490eb09513ddPeter Siket
146641702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
146741702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1, &descriptorSet[0].get(), 0u, DE_NULL);
146841702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 1u, 1, &descriptorSet[1].get(), 0u, DE_NULL);
146941702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdBindVertexBuffers(*commandBuffer, 0, 1, &vertexBuffer.get(), &vertexBufferOffset);
147041702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdBindVertexBuffers(*commandBuffer, 1, 1, &vertexBuffer.get(), &vertexBufferOffset);
147141702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdBindIndexBuffer(*commandBuffer, *m_vertexIndexBuffer, 0, VK_INDEX_TYPE_UINT16);
147241702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdDrawIndexed(*commandBuffer, 6, 1, 0, 0, 0);
147341702fa78437820bc601e604de6a490eb09513ddPeter Siket	vkd.cmdEndRenderPass(*commandBuffer);
147441702fa78437820bc601e604de6a490eb09513ddPeter Siket
147541702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Copy Image
147641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
147741702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkBufferMemoryBarrier			bufferBarrier			=
147841702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
147941702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType		sType;
148041702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,									// const void*			pNext;
148141702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_ACCESS_TRANSFER_WRITE_BIT,				// VkMemoryOutputFlags	outputMask;
148241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_ACCESS_HOST_READ_BIT,					// VkMemoryInputFlags	inputMask;
148341702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_QUEUE_FAMILY_IGNORED,					// deUint32				srcQueueFamilyIndex;
148441702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_QUEUE_FAMILY_IGNORED,					// deUint32				destQueueFamilyIndex;
148541702fa78437820bc601e604de6a490eb09513ddPeter Siket			*m_resultBuffer,							// VkBuffer				buffer;
148641702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkDeviceSize			offset;
148741702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_resultBufferSize							// VkDeviceSize			size;
148841702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
148941702fa78437820bc601e604de6a490eb09513ddPeter Siket
149041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkBufferImageCopy				copyRegion				=
149141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
149241702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,											// VkDeviceSize				bufferOffset;
149341702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_renderWidth,								// deUint32					bufferRowLength;
149441702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_renderHeight,								// deUint32					bufferImageHeight;
149541702fa78437820bc601e604de6a490eb09513ddPeter Siket			{
149641702fa78437820bc601e604de6a490eb09513ddPeter Siket				VK_IMAGE_ASPECT_COLOR_BIT,
149741702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,
149841702fa78437820bc601e604de6a490eb09513ddPeter Siket				0u,
149941702fa78437820bc601e604de6a490eb09513ddPeter Siket				1u
150041702fa78437820bc601e604de6a490eb09513ddPeter Siket			},											// VkImageSubresourceCopy	imageSubresource;
150141702fa78437820bc601e604de6a490eb09513ddPeter Siket			{ 0, 0, 0 },								// VkOffset3D				imageOffset;
150241702fa78437820bc601e604de6a490eb09513ddPeter Siket			{ m_renderWidth, m_renderHeight, 1u }		// VkExtent3D				imageExtent;
150341702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
150441702fa78437820bc601e604de6a490eb09513ddPeter Siket
150541702fa78437820bc601e604de6a490eb09513ddPeter Siket		addImageTransitionBarrier(*commandBuffer,
150641702fa78437820bc601e604de6a490eb09513ddPeter Siket								  m_multisampling ? *m_resolvedImage : *m_image,
150741702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,		// VkPipelineStageFlags		srcStageMask
150841702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_PIPELINE_STAGE_TRANSFER_BIT,						// VkPipelineStageFlags		dstStageMask
150941702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,					// VkAccessFlags			srcAccessMask
151041702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_ACCESS_TRANSFER_READ_BIT,							// VkAccessFlags			dstAccessMask
151141702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,				// VkImageLayout			oldLayout;
151241702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);				// VkImageLayout			newLayout;
151341702fa78437820bc601e604de6a490eb09513ddPeter Siket
151441702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (m_multisampling)
151541702fa78437820bc601e604de6a490eb09513ddPeter Siket			vkd.cmdCopyImageToBuffer(*commandBuffer, *m_resolvedImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *m_resultBuffer, 1, &copyRegion);
151641702fa78437820bc601e604de6a490eb09513ddPeter Siket		else
151741702fa78437820bc601e604de6a490eb09513ddPeter Siket			vkd.cmdCopyImageToBuffer(*commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *m_resultBuffer, 1, &copyRegion);
151841702fa78437820bc601e604de6a490eb09513ddPeter Siket
151941702fa78437820bc601e604de6a490eb09513ddPeter Siket		vkd.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
152041702fa78437820bc601e604de6a490eb09513ddPeter Siket
152141702fa78437820bc601e604de6a490eb09513ddPeter Siket		addImageTransitionBarrier(*commandBuffer,
152241702fa78437820bc601e604de6a490eb09513ddPeter Siket								  m_multisampling ? *m_resolvedImage : *m_image,
152341702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_PIPELINE_STAGE_TRANSFER_BIT,					// VkPipelineStageFlags		srcStageMask
152441702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,	// VkPipelineStageFlags		dstStageMask
152541702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_ACCESS_TRANSFER_READ_BIT,						// VkAccessFlags			srcAccessMask
152641702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,				// VkAccessFlags			dstAccessMask
152741702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,				// VkImageLayout			oldLayout;
152841702fa78437820bc601e604de6a490eb09513ddPeter Siket								  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);		// VkImageLayout			newLayout;
152941702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
153041702fa78437820bc601e604de6a490eb09513ddPeter Siket
153141702fa78437820bc601e604de6a490eb09513ddPeter Siket	VK_CHECK(vkd.endCommandBuffer(*commandBuffer));
153241702fa78437820bc601e604de6a490eb09513ddPeter Siket
153341702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Upload uniform buffer data
153441702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
153541702fa78437820bc601e604de6a490eb09513ddPeter Siket		const ShaderParameters	shaderParameters	=
153641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
153741702fa78437820bc601e604de6a490eb09513ddPeter Siket			params.bias,			// float		bias;				//!< User-supplied bias.
153841702fa78437820bc601e604de6a490eb09513ddPeter Siket			params.ref,				// float		ref;				//!< Reference value for shadow lookups.
153941702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::Vec2(),			// tcu::Vec2	padding;			//!< Shader uniform padding.
154041702fa78437820bc601e604de6a490eb09513ddPeter Siket			params.colorScale,		// tcu::Vec4	colorScale;			//!< Scale for texture color values.
154141702fa78437820bc601e604de6a490eb09513ddPeter Siket			params.colorBias		// tcu::Vec4	colorBias;			//!< Bias for texture color values.
154241702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
154346abca75bab000788fcc6289adfd3e668203d20fMaciej Jesionowski		deMemcpy(m_uniformBufferMemory->getHostPtr(), &shaderParameters, sizeof(shaderParameters));
154446abca75bab000788fcc6289adfd3e668203d20fMaciej Jesionowski		flushMappedMemoryRange(vkd, vkDevice, m_uniformBufferMemory->getMemory(), m_uniformBufferMemory->getOffset(), VK_WHOLE_SIZE);
154541702fa78437820bc601e604de6a490eb09513ddPeter Siket
154641702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (logUniforms)
154741702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_log << TestLog::Message << "u_sampler = " << texUnit << TestLog::EndMessage;
154841702fa78437820bc601e604de6a490eb09513ddPeter Siket
154941702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (useBias)
155041702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
155141702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (logUniforms)
155241702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_log << TestLog::Message << "u_bias = " << shaderParameters.bias << TestLog::EndMessage;
155341702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
155441702fa78437820bc601e604de6a490eb09513ddPeter Siket
155541702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (params.samplerType == SAMPLERTYPE_SHADOW)
155641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
155741702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (logUniforms)
155841702fa78437820bc601e604de6a490eb09513ddPeter Siket				m_log << TestLog::Message << "u_ref = " << shaderParameters.ref << TestLog::EndMessage;
155941702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
156041702fa78437820bc601e604de6a490eb09513ddPeter Siket
156141702fa78437820bc601e604de6a490eb09513ddPeter Siket		if (logUniforms)
156241702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
156341702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_log << TestLog::Message << "u_colorScale = " << shaderParameters.colorScale << TestLog::EndMessage;
156441702fa78437820bc601e604de6a490eb09513ddPeter Siket			m_log << TestLog::Message << "u_colorBias = " << shaderParameters.colorBias << TestLog::EndMessage;
156541702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
156641702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
156741702fa78437820bc601e604de6a490eb09513ddPeter Siket
156841702fa78437820bc601e604de6a490eb09513ddPeter Siket	// Submit
156941702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
157041702fa78437820bc601e604de6a490eb09513ddPeter Siket		const VkSubmitInfo					submitInfo				=
157141702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
157241702fa78437820bc601e604de6a490eb09513ddPeter Siket			VK_STRUCTURE_TYPE_SUBMIT_INFO,			// VkStructureType				sType;
157341702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,								// const void*					pNext;
157441702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,										// deUint32						waitSemaphoreCount;
157541702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,								// const VkSemaphore*			pWaitSemaphores;
157641702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,								// const VkPipelineStageFlags*	pWaitDstStageMask;
157741702fa78437820bc601e604de6a490eb09513ddPeter Siket			1u,										// deUint32						commandBufferCount;
157841702fa78437820bc601e604de6a490eb09513ddPeter Siket			&commandBuffer.get(),					// const VkCommandBuffer*		pCommandBuffers;
157941702fa78437820bc601e604de6a490eb09513ddPeter Siket			0u,										// deUint32						signalSemaphoreCount;
158041702fa78437820bc601e604de6a490eb09513ddPeter Siket			DE_NULL,								// const VkSemaphore*			pSignalSemaphores;
158141702fa78437820bc601e604de6a490eb09513ddPeter Siket		};
158241702fa78437820bc601e604de6a490eb09513ddPeter Siket
158341702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.resetFences(vkDevice, 1, &m_fence.get()));
158441702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.queueSubmit(queue, 1, &submitInfo, *m_fence));
158541702fa78437820bc601e604de6a490eb09513ddPeter Siket		VK_CHECK(vkd.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
158641702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
158741702fa78437820bc601e604de6a490eb09513ddPeter Siket
158846abca75bab000788fcc6289adfd3e668203d20fMaciej Jesionowski	invalidateMappedMemoryRange(vkd, vkDevice, m_resultBufferMemory->getMemory(), m_resultBufferMemory->getOffset(), VK_WHOLE_SIZE);
158941702fa78437820bc601e604de6a490eb09513ddPeter Siket
159041702fa78437820bc601e604de6a490eb09513ddPeter Siket	tcu::copy(result.getAccess(), tcu::ConstPixelBufferAccess(m_textureFormat, tcu::IVec3(m_renderWidth, m_renderHeight, 1u), m_resultBufferMemory->getHostPtr()));
159141702fa78437820bc601e604de6a490eb09513ddPeter Siket}
159241702fa78437820bc601e604de6a490eb09513ddPeter Siket
159341702fa78437820bc601e604de6a490eb09513ddPeter Siket/*--------------------------------------------------------------------*//*!
159441702fa78437820bc601e604de6a490eb09513ddPeter Siket * \brief Map Vulkan sampler parameters to tcu::Sampler.
159541702fa78437820bc601e604de6a490eb09513ddPeter Siket *
159641702fa78437820bc601e604de6a490eb09513ddPeter Siket * If no mapping is found, throws tcu::InternalError.
159741702fa78437820bc601e604de6a490eb09513ddPeter Siket *
159841702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param wrapU			U-component wrap mode
159941702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param wrapV			V-component wrap mode
160041702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param wrapW			W-component wrap mode
160141702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param minFilterMode	Minification filter mode
160241702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param magFilterMode	Magnification filter mode
160341702fa78437820bc601e604de6a490eb09513ddPeter Siket * \return Sampler description.
160441702fa78437820bc601e604de6a490eb09513ddPeter Siket *//*--------------------------------------------------------------------*/
160541702fa78437820bc601e604de6a490eb09513ddPeter Sikettcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::WrapMode wrapW, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode)
160641702fa78437820bc601e604de6a490eb09513ddPeter Siket{
160741702fa78437820bc601e604de6a490eb09513ddPeter Siket	return tcu::Sampler(wrapU, wrapV, wrapW,
160841702fa78437820bc601e604de6a490eb09513ddPeter Siket						minFilterMode, magFilterMode,
160941702fa78437820bc601e604de6a490eb09513ddPeter Siket						0.0f /* lod threshold */,
161041702fa78437820bc601e604de6a490eb09513ddPeter Siket						true /* normalized coords */,
161141702fa78437820bc601e604de6a490eb09513ddPeter Siket						tcu::Sampler::COMPAREMODE_NONE /* no compare */,
161241702fa78437820bc601e604de6a490eb09513ddPeter Siket						0 /* compare channel */,
161341702fa78437820bc601e604de6a490eb09513ddPeter Siket						tcu::Vec4(0.0f) /* border color, not used */);
161441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
161541702fa78437820bc601e604de6a490eb09513ddPeter Siket
161641702fa78437820bc601e604de6a490eb09513ddPeter Siket/*--------------------------------------------------------------------*//*!
161741702fa78437820bc601e604de6a490eb09513ddPeter Siket * \brief Map Vulkan sampler parameters to tcu::Sampler.
161841702fa78437820bc601e604de6a490eb09513ddPeter Siket *
161941702fa78437820bc601e604de6a490eb09513ddPeter Siket * If no mapping is found, throws tcu::InternalError.
162041702fa78437820bc601e604de6a490eb09513ddPeter Siket *
162141702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param wrapU			U-component wrap mode
162241702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param wrapV			V-component wrap mode
162341702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param minFilterMode	Minification filter mode
162441702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param minFilterMode	Magnification filter mode
162541702fa78437820bc601e604de6a490eb09513ddPeter Siket * \return Sampler description.
162641702fa78437820bc601e604de6a490eb09513ddPeter Siket *//*--------------------------------------------------------------------*/
162741702fa78437820bc601e604de6a490eb09513ddPeter Sikettcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode)
162841702fa78437820bc601e604de6a490eb09513ddPeter Siket{
162941702fa78437820bc601e604de6a490eb09513ddPeter Siket	return createSampler(wrapU, wrapV, wrapU, minFilterMode, magFilterMode);
163041702fa78437820bc601e604de6a490eb09513ddPeter Siket}
163141702fa78437820bc601e604de6a490eb09513ddPeter Siket
163241702fa78437820bc601e604de6a490eb09513ddPeter Siket/*--------------------------------------------------------------------*//*!
163341702fa78437820bc601e604de6a490eb09513ddPeter Siket * \brief Map Vulkan sampler parameters to tcu::Sampler.
163441702fa78437820bc601e604de6a490eb09513ddPeter Siket *
163541702fa78437820bc601e604de6a490eb09513ddPeter Siket * If no mapping is found, throws tcu::InternalError.
163641702fa78437820bc601e604de6a490eb09513ddPeter Siket *
163741702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param wrapU			U-component wrap mode
163841702fa78437820bc601e604de6a490eb09513ddPeter Siket * \param minFilterMode	Minification filter mode
163941702fa78437820bc601e604de6a490eb09513ddPeter Siket * \return Sampler description.
164041702fa78437820bc601e604de6a490eb09513ddPeter Siket *//*--------------------------------------------------------------------*/
164141702fa78437820bc601e604de6a490eb09513ddPeter Sikettcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode)
164241702fa78437820bc601e604de6a490eb09513ddPeter Siket{
164341702fa78437820bc601e604de6a490eb09513ddPeter Siket	return createSampler(wrapU, wrapU, wrapU, minFilterMode, magFilterMode);
164441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
164541702fa78437820bc601e604de6a490eb09513ddPeter Siket
164641702fa78437820bc601e604de6a490eb09513ddPeter SiketTestTexture2DSp loadTexture2D (const tcu::Archive& archive, const std::vector<std::string>& filenames)
164741702fa78437820bc601e604de6a490eb09513ddPeter Siket{
164841702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(filenames.size() > 0);
164941702fa78437820bc601e604de6a490eb09513ddPeter Siket
165041702fa78437820bc601e604de6a490eb09513ddPeter Siket	TestTexture2DSp texture;
165141702fa78437820bc601e604de6a490eb09513ddPeter Siket
165241702fa78437820bc601e604de6a490eb09513ddPeter Siket	std::string ext = de::FilePath(filenames[0]).getFileExtension();
165341702fa78437820bc601e604de6a490eb09513ddPeter Siket
165441702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (ext == "png")
165541702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
165641702fa78437820bc601e604de6a490eb09513ddPeter Siket
165741702fa78437820bc601e604de6a490eb09513ddPeter Siket		for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
165841702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
165941702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::TextureLevel level;
166041702fa78437820bc601e604de6a490eb09513ddPeter Siket
166141702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::ImageIO::loadImage(level, archive, filenames[fileIndex].c_str());
166241702fa78437820bc601e604de6a490eb09513ddPeter Siket
166341702fa78437820bc601e604de6a490eb09513ddPeter Siket			TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
166441702fa78437820bc601e604de6a490eb09513ddPeter Siket											   level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
166541702fa78437820bc601e604de6a490eb09513ddPeter Siket
166641702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (fileIndex == 0)
166741702fa78437820bc601e604de6a490eb09513ddPeter Siket				texture = TestTexture2DSp(new pipeline::TestTexture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight()));
166841702fa78437820bc601e604de6a490eb09513ddPeter Siket
166941702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::copy(texture->getLevel((int)fileIndex, 0), level.getAccess());
167041702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
167141702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
167241702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (ext == "pkm")
167341702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
167441702fa78437820bc601e604de6a490eb09513ddPeter Siket
167541702fa78437820bc601e604de6a490eb09513ddPeter Siket		for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
167641702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
167741702fa78437820bc601e604de6a490eb09513ddPeter Siket			// Compressed texture.
167841702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::CompressedTexture	level;
167941702fa78437820bc601e604de6a490eb09513ddPeter Siket
168041702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::ImageIO::loadPKM(level, archive, filenames[fileIndex].c_str());
168141702fa78437820bc601e604de6a490eb09513ddPeter Siket
168241702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::TextureFormat		uncompressedFormat		= tcu::getUncompressedFormat(level.getFormat());
168341702fa78437820bc601e604de6a490eb09513ddPeter Siket			std::vector<deUint8>	uncompressedData		(uncompressedFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
168441702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::PixelBufferAccess	decompressedBuffer		(uncompressedFormat, level.getWidth(), level.getHeight(), 1, uncompressedData.data());
168541702fa78437820bc601e604de6a490eb09513ddPeter Siket
168641702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::TextureFormat		commonFormat			= tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
168741702fa78437820bc601e604de6a490eb09513ddPeter Siket			std::vector<deUint8>	commonFromatData		(commonFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
168841702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::PixelBufferAccess	commonFormatBuffer		(commonFormat, level.getWidth(), level.getHeight(), 1, commonFromatData.data());
168941702fa78437820bc601e604de6a490eb09513ddPeter Siket
169041702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (fileIndex == 0)
169141702fa78437820bc601e604de6a490eb09513ddPeter Siket				texture = TestTexture2DSp(new pipeline::TestTexture2D(commonFormat, level.getWidth(), level.getHeight()));
169241702fa78437820bc601e604de6a490eb09513ddPeter Siket
169341702fa78437820bc601e604de6a490eb09513ddPeter Siket			level.decompress(decompressedBuffer, tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR));
169441702fa78437820bc601e604de6a490eb09513ddPeter Siket
169541702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::copy(commonFormatBuffer, decompressedBuffer);
169641702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::copy(texture->getLevel((int)fileIndex, 0), commonFormatBuffer);
169741702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
169841702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
169941702fa78437820bc601e604de6a490eb09513ddPeter Siket	else
170041702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_FAIL("Unsupported file format");
170141702fa78437820bc601e604de6a490eb09513ddPeter Siket
170241702fa78437820bc601e604de6a490eb09513ddPeter Siket	return texture;
170341702fa78437820bc601e604de6a490eb09513ddPeter Siket}
170441702fa78437820bc601e604de6a490eb09513ddPeter Siket
170541702fa78437820bc601e604de6a490eb09513ddPeter SiketTestTextureCubeSp loadTextureCube (const tcu::Archive& archive, const std::vector<std::string>& filenames)
170641702fa78437820bc601e604de6a490eb09513ddPeter Siket{
170741702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_ASSERT(filenames.size() > 0);
170841702fa78437820bc601e604de6a490eb09513ddPeter Siket	DE_STATIC_ASSERT(tcu::CUBEFACE_LAST == 6);
170941702fa78437820bc601e604de6a490eb09513ddPeter Siket	TCU_CHECK((int)filenames.size() % tcu::CUBEFACE_LAST == 0);
171041702fa78437820bc601e604de6a490eb09513ddPeter Siket
171141702fa78437820bc601e604de6a490eb09513ddPeter Siket	TestTextureCubeSp texture;
171241702fa78437820bc601e604de6a490eb09513ddPeter Siket
171341702fa78437820bc601e604de6a490eb09513ddPeter Siket	std::string ext = de::FilePath(filenames[0]).getFileExtension();
171441702fa78437820bc601e604de6a490eb09513ddPeter Siket
171541702fa78437820bc601e604de6a490eb09513ddPeter Siket	if (ext == "png")
171641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
171741702fa78437820bc601e604de6a490eb09513ddPeter Siket
171841702fa78437820bc601e604de6a490eb09513ddPeter Siket		for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
171941702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
172041702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::TextureLevel level;
172141702fa78437820bc601e604de6a490eb09513ddPeter Siket
172241702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::ImageIO::loadImage(level, archive, filenames[fileIndex].c_str());
172341702fa78437820bc601e604de6a490eb09513ddPeter Siket
172441702fa78437820bc601e604de6a490eb09513ddPeter Siket			TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
172541702fa78437820bc601e604de6a490eb09513ddPeter Siket											   level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
172641702fa78437820bc601e604de6a490eb09513ddPeter Siket
172741702fa78437820bc601e604de6a490eb09513ddPeter Siket			TCU_CHECK( level.getWidth() == level.getHeight());
172841702fa78437820bc601e604de6a490eb09513ddPeter Siket
172941702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (fileIndex == 0)
173041702fa78437820bc601e604de6a490eb09513ddPeter Siket				texture = TestTextureCubeSp(new pipeline::TestTextureCube(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth()));
173141702fa78437820bc601e604de6a490eb09513ddPeter Siket
173241702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::copy(texture->getLevel((int)fileIndex / 6, (int)fileIndex % 6), level.getAccess());
173341702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
173441702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
173541702fa78437820bc601e604de6a490eb09513ddPeter Siket	else if (ext == "pkm")
173641702fa78437820bc601e604de6a490eb09513ddPeter Siket	{
173741702fa78437820bc601e604de6a490eb09513ddPeter Siket		for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
173841702fa78437820bc601e604de6a490eb09513ddPeter Siket		{
173941702fa78437820bc601e604de6a490eb09513ddPeter Siket			// Compressed texture.
174041702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::CompressedTexture	level;
174141702fa78437820bc601e604de6a490eb09513ddPeter Siket
174241702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::ImageIO::loadPKM(level, archive, filenames[fileIndex].c_str());
174341702fa78437820bc601e604de6a490eb09513ddPeter Siket
174441702fa78437820bc601e604de6a490eb09513ddPeter Siket			TCU_CHECK( level.getWidth() == level.getHeight());
174541702fa78437820bc601e604de6a490eb09513ddPeter Siket
174641702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::TextureFormat		uncompressedFormat				= tcu::getUncompressedFormat(level.getFormat());
174741702fa78437820bc601e604de6a490eb09513ddPeter Siket			std::vector<deUint8>	uncompressedData				(uncompressedFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
174841702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::PixelBufferAccess	decompressedBuffer				(uncompressedFormat, level.getWidth(), level.getHeight(), 1, uncompressedData.data());
174941702fa78437820bc601e604de6a490eb09513ddPeter Siket
175041702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::TextureFormat		commonFormat					= tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
175141702fa78437820bc601e604de6a490eb09513ddPeter Siket			std::vector<deUint8>	commonFromatData				(commonFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
175241702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::PixelBufferAccess	commonFormatBuffer				(commonFormat, level.getWidth(), level.getHeight(), 1, commonFromatData.data());
175341702fa78437820bc601e604de6a490eb09513ddPeter Siket
175441702fa78437820bc601e604de6a490eb09513ddPeter Siket			if (fileIndex == 0)
175541702fa78437820bc601e604de6a490eb09513ddPeter Siket				texture = TestTextureCubeSp(new pipeline::TestTextureCube(commonFormat, level.getWidth()));
175641702fa78437820bc601e604de6a490eb09513ddPeter Siket
175741702fa78437820bc601e604de6a490eb09513ddPeter Siket			level.decompress(decompressedBuffer, tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR));
175841702fa78437820bc601e604de6a490eb09513ddPeter Siket
175941702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::copy(commonFormatBuffer, decompressedBuffer);
176041702fa78437820bc601e604de6a490eb09513ddPeter Siket			tcu::copy(texture->getLevel((int)fileIndex / 6, (int)fileIndex % 6), commonFormatBuffer);
176141702fa78437820bc601e604de6a490eb09513ddPeter Siket		}
176241702fa78437820bc601e604de6a490eb09513ddPeter Siket	}
176341702fa78437820bc601e604de6a490eb09513ddPeter Siket	else
176441702fa78437820bc601e604de6a490eb09513ddPeter Siket		TCU_FAIL("Unsupported file format");
176541702fa78437820bc601e604de6a490eb09513ddPeter Siket
176641702fa78437820bc601e604de6a490eb09513ddPeter Siket	return texture;
176741702fa78437820bc601e604de6a490eb09513ddPeter Siket}
176841702fa78437820bc601e604de6a490eb09513ddPeter Siket
176941702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureCommonTestCaseParameters::TextureCommonTestCaseParameters (void)
177041702fa78437820bc601e604de6a490eb09513ddPeter Siket	: sampleCount			(VK_SAMPLE_COUNT_1_BIT)
177141702fa78437820bc601e604de6a490eb09513ddPeter Siket	, texCoordPrecision		(glu::PRECISION_HIGHP)
177241702fa78437820bc601e604de6a490eb09513ddPeter Siket	, minFilter				(tcu::Sampler::LINEAR)
177341702fa78437820bc601e604de6a490eb09513ddPeter Siket	, magFilter				(tcu::Sampler::LINEAR)
177441702fa78437820bc601e604de6a490eb09513ddPeter Siket	, wrapS					(tcu::Sampler::REPEAT_GL)
177541702fa78437820bc601e604de6a490eb09513ddPeter Siket	, wrapT					(tcu::Sampler::REPEAT_GL)
177641702fa78437820bc601e604de6a490eb09513ddPeter Siket	, format				(VK_FORMAT_R8G8B8A8_UNORM)
177741702fa78437820bc601e604de6a490eb09513ddPeter Siket{
177841702fa78437820bc601e604de6a490eb09513ddPeter Siket}
177941702fa78437820bc601e604de6a490eb09513ddPeter Siket
178041702fa78437820bc601e604de6a490eb09513ddPeter SiketTexture2DTestCaseParameters::Texture2DTestCaseParameters (void)
178141702fa78437820bc601e604de6a490eb09513ddPeter Siket	: width					(64)
178241702fa78437820bc601e604de6a490eb09513ddPeter Siket	, height				(64)
178341702fa78437820bc601e604de6a490eb09513ddPeter Siket{
178441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
178541702fa78437820bc601e604de6a490eb09513ddPeter Siket
178641702fa78437820bc601e604de6a490eb09513ddPeter SiketTextureCubeTestCaseParameters::TextureCubeTestCaseParameters (void)
178741702fa78437820bc601e604de6a490eb09513ddPeter Siket	: size					(64)
178841702fa78437820bc601e604de6a490eb09513ddPeter Siket{
178941702fa78437820bc601e604de6a490eb09513ddPeter Siket}
179041702fa78437820bc601e604de6a490eb09513ddPeter Siket
179141702fa78437820bc601e604de6a490eb09513ddPeter SiketTexture2DArrayTestCaseParameters::Texture2DArrayTestCaseParameters (void)
179241702fa78437820bc601e604de6a490eb09513ddPeter Siket	: numLayers				(8)
179341702fa78437820bc601e604de6a490eb09513ddPeter Siket{
179441702fa78437820bc601e604de6a490eb09513ddPeter Siket}
179541702fa78437820bc601e604de6a490eb09513ddPeter Siket
179641702fa78437820bc601e604de6a490eb09513ddPeter SiketTexture3DTestCaseParameters::Texture3DTestCaseParameters (void)
179741702fa78437820bc601e604de6a490eb09513ddPeter Siket	: wrapR					(tcu::Sampler::REPEAT_GL)
179841702fa78437820bc601e604de6a490eb09513ddPeter Siket	, depth					(64)
179941702fa78437820bc601e604de6a490eb09513ddPeter Siket{
180041702fa78437820bc601e604de6a490eb09513ddPeter Siket}
180141702fa78437820bc601e604de6a490eb09513ddPeter Siket
180241702fa78437820bc601e604de6a490eb09513ddPeter Siket} // util
180341702fa78437820bc601e604de6a490eb09513ddPeter Siket} // texture
180441702fa78437820bc601e604de6a490eb09513ddPeter Siket} // vkt
1805