1f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal/*------------------------------------------------------------------------
23c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * Vulkan Conformance Tests
33c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * ------------------------
43c17bc60af5c131488c834c64851a00449e4ef59Peter Gal *
5f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * Copyright (c) 2015 The Khronos Group Inc.
6f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7c05b7f1437e619205c96eaa31c0b79ec97a0d47dPyry Haulos * Copyright (c) 2016 The Android Open Source Project
8f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
12f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
14f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
20f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *
21f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *//*!
22f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * \file
23f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * \brief Vulkan ShaderRenderCase
24f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *//*--------------------------------------------------------------------*/
25f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
26c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal#include "vktShaderRender.hpp"
27f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
28e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal#include "tcuImageCompare.hpp"
29baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal#include "tcuImageIO.hpp"
30f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include "tcuTestLog.hpp"
31ee06c6e532c43240a33f7f75e4762af6e179421aPeter Gal#include "tcuTextureUtil.hpp"
328e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "tcuSurface.hpp"
338e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "tcuVector.hpp"
34f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
35baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal#include "deFilePath.hpp"
368e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "deMath.h"
378bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "deUniquePtr.hpp"
388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
398e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkDeviceUtil.hpp"
408e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkImageUtil.hpp"
418bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkPlatform.hpp"
428e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkQueryUtil.hpp"
438bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkRef.hpp"
448bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkRefUtil.hpp"
458e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkStrUtil.hpp"
46e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos#include "vkTypeUtil.hpp"
478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
48f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include <vector>
49f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include <string>
50f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
51f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galnamespace vkt
52f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
53c5a432af8404a1620230c8b0f31bc9a469196726Peter Galnamespace sr
54f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
55f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
568bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Galusing namespace vk;
57e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
58e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Galnamespace
59e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal{
60e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal
61689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const int		GRID_SIZE			= 2;
62689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const deUint32	MAX_RENDER_WIDTH	= 128;
63689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const deUint32	MAX_RENDER_HEIGHT	= 128;
64689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const tcu::Vec4	DEFAULT_CLEAR_COLOR	= tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f);
65e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
660d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galstatic bool isSupportedLinearTilingFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format)
670d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{
680d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VkFormatProperties formatProps;
690d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
7068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps);
710d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
720d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	return (formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0u;
730d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal}
740d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
750d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galstatic bool isSupportedOptimalTilingFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format)
760d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{
770d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VkFormatProperties formatProps;
780d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
7968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps);
800d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
81af0ed8fd53c287873e7cbbc9ad582529c62b4805Pyry Haulos	return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0u;
820d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal}
830d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosstatic VkImageMemoryBarrier createImageMemoryBarrier (const VkImage&	image,
8568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													  VkAccessFlags		srcAccessMask,
8668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													  VkAccessFlags		dstAccessMask,
8768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													  VkImageLayout		oldLayout,
8868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													  VkImageLayout		newLayout)
890d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{
900d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VkImageMemoryBarrier imageMemoryBarrier	=
910d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
920d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// VkStructureType				sType;
930d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		DE_NULL,									// const void*					pNext;
9468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		srcAccessMask,								// VkAccessFlags				srcAccessMask;
9568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		dstAccessMask,								// VkAccessFlags				dstAccessMask;
960d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		oldLayout,									// VkImageLayout				oldLayout;
970d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		newLayout,									// VkImageLayout				newLayout;
980d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		VK_QUEUE_FAMILY_IGNORED,					// deUint32						srcQueueFamilyIndex;
990d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		VK_QUEUE_FAMILY_IGNORED,					// deUint32						dstQueueFamilyIndex;
1000d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		image,										// VkImage						image;
1010d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		{
1020d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			VK_IMAGE_ASPECT_COLOR_BIT,	// VkImageAspectFlags	aspectMask;
1030d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0,							// deUint32				baseMipLevel;
1040d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			1,							// deUint32				mipLevels;
1050d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0,							// deUint32				baseArrayLayer;
1060d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			1							// deUint32				arraySize;
1070d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		}											// VkImageSubresourceRange		subresourceRange;
1080d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	};
1090d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	return imageMemoryBarrier;
1100d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal}
1110d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
112e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal} // anonymous
113e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal
114f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// QuadGrid.
115f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
116f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass QuadGrid
117f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
118f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galpublic:
1193038af220852000e643054412d14679c61d58838Peter Gal											QuadGrid				(int									gridSize,
1203038af220852000e643054412d14679c61d58838Peter Gal																	 int									screenWidth,
1213038af220852000e643054412d14679c61d58838Peter Gal																	 int									screenHeight,
1223038af220852000e643054412d14679c61d58838Peter Gal																	 const tcu::Vec4&						constCoords,
1233038af220852000e643054412d14679c61d58838Peter Gal																	 const std::vector<tcu::Mat4>&			userAttribTransforms,
1243038af220852000e643054412d14679c61d58838Peter Gal																	 const std::vector<TextureBindingSp>&	textures);
1253038af220852000e643054412d14679c61d58838Peter Gal											~QuadGrid				(void);
1263038af220852000e643054412d14679c61d58838Peter Gal
1273038af220852000e643054412d14679c61d58838Peter Gal	int										getGridSize				(void) const { return m_gridSize; }
1283038af220852000e643054412d14679c61d58838Peter Gal	int										getNumVertices			(void) const { return m_numVertices; }
1293038af220852000e643054412d14679c61d58838Peter Gal	int										getNumTriangles			(void) const { return m_numTriangles; }
1303038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Vec4&						getConstCoords			(void) const { return m_constCoords; }
1313038af220852000e643054412d14679c61d58838Peter Gal	const std::vector<tcu::Mat4>			getUserAttribTransforms	(void) const { return m_userAttribTransforms; }
1323038af220852000e643054412d14679c61d58838Peter Gal	const std::vector<TextureBindingSp>&	getTextures				(void) const { return m_textures; }
1333038af220852000e643054412d14679c61d58838Peter Gal
1343038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Vec4*						getPositions			(void) const { return &m_positions[0]; }
1353038af220852000e643054412d14679c61d58838Peter Gal	const float*							getAttribOne			(void) const { return &m_attribOne[0]; }
1363038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Vec4*						getCoords				(void) const { return &m_coords[0]; }
1373038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Vec4*						getUnitCoords			(void) const { return &m_unitCoords[0]; }
1383038af220852000e643054412d14679c61d58838Peter Gal
1393038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Vec4*						getUserAttrib			(int attribNdx) const { return &m_userAttribs[attribNdx][0]; }
1403038af220852000e643054412d14679c61d58838Peter Gal	const deUint16*							getIndices				(void) const { return &m_indices[0]; }
1413038af220852000e643054412d14679c61d58838Peter Gal
1423038af220852000e643054412d14679c61d58838Peter Gal	tcu::Vec4								getCoords				(float sx, float sy) const;
1433038af220852000e643054412d14679c61d58838Peter Gal	tcu::Vec4								getUnitCoords			(float sx, float sy) const;
1443038af220852000e643054412d14679c61d58838Peter Gal
1453038af220852000e643054412d14679c61d58838Peter Gal	int										getNumUserAttribs		(void) const { return (int)m_userAttribTransforms.size(); }
1463038af220852000e643054412d14679c61d58838Peter Gal	tcu::Vec4								getUserAttrib			(int attribNdx, float sx, float sy) const;
147f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
148f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galprivate:
1493038af220852000e643054412d14679c61d58838Peter Gal	const int								m_gridSize;
1503038af220852000e643054412d14679c61d58838Peter Gal	const int								m_numVertices;
1513038af220852000e643054412d14679c61d58838Peter Gal	const int								m_numTriangles;
1523038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Vec4							m_constCoords;
1533038af220852000e643054412d14679c61d58838Peter Gal	const std::vector<tcu::Mat4>			m_userAttribTransforms;
1543038af220852000e643054412d14679c61d58838Peter Gal
1553038af220852000e643054412d14679c61d58838Peter Gal	const std::vector<TextureBindingSp>&	m_textures;
1563038af220852000e643054412d14679c61d58838Peter Gal
1573038af220852000e643054412d14679c61d58838Peter Gal	std::vector<tcu::Vec4>					m_screenPos;
1583038af220852000e643054412d14679c61d58838Peter Gal	std::vector<tcu::Vec4>					m_positions;
1593038af220852000e643054412d14679c61d58838Peter Gal	std::vector<tcu::Vec4>					m_coords;		//!< Near-unit coordinates, roughly [-2.0 .. 2.0].
1603038af220852000e643054412d14679c61d58838Peter Gal	std::vector<tcu::Vec4>					m_unitCoords;	//!< Positive-only coordinates [0.0 .. 1.5].
1613038af220852000e643054412d14679c61d58838Peter Gal	std::vector<float>						m_attribOne;
1623038af220852000e643054412d14679c61d58838Peter Gal	std::vector<tcu::Vec4>					m_userAttribs[ShaderEvalContext::MAX_TEXTURES];
1633038af220852000e643054412d14679c61d58838Peter Gal	std::vector<deUint16>					m_indices;
164f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal};
165f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
1663038af220852000e643054412d14679c61d58838Peter GalQuadGrid::QuadGrid (int										gridSize,
1673038af220852000e643054412d14679c61d58838Peter Gal					int										width,
1683038af220852000e643054412d14679c61d58838Peter Gal					int										height,
1693038af220852000e643054412d14679c61d58838Peter Gal					const tcu::Vec4&						constCoords,
1703038af220852000e643054412d14679c61d58838Peter Gal					const std::vector<tcu::Mat4>&			userAttribTransforms,
1713038af220852000e643054412d14679c61d58838Peter Gal					const std::vector<TextureBindingSp>&	textures)
172e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	: m_gridSize				(gridSize)
173e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	, m_numVertices				((gridSize + 1) * (gridSize + 1))
174e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	, m_numTriangles			(gridSize * gridSize * 2)
175e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	, m_constCoords				(constCoords)
176e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	, m_userAttribTransforms	(userAttribTransforms)
177e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	, m_textures				(textures)
178f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
179fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const tcu::Vec4 viewportScale	((float)width, (float)height, 0.0f, 0.0f);
180f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
181e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Compute vertices.
182e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	m_screenPos.resize(m_numVertices);
183c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	m_positions.resize(m_numVertices);
184c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	m_coords.resize(m_numVertices);
185c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	m_unitCoords.resize(m_numVertices);
186c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	m_attribOne.resize(m_numVertices);
187f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
188e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// User attributes.
1893c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	for (int attrNdx = 0; attrNdx < DE_LENGTH_OF_ARRAY(m_userAttribs); attrNdx++)
1903c17bc60af5c131488c834c64851a00449e4ef59Peter Gal		m_userAttribs[attrNdx].resize(m_numVertices);
191f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
192e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	for (int y = 0; y < gridSize+1; y++)
193e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	for (int x = 0; x < gridSize+1; x++)
194e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	{
195e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		float		sx			= (float)x / (float)gridSize;
196e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		float		sy			= (float)y / (float)gridSize;
197e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		float		fx			= 2.0f * sx - 1.0f;
198e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		float		fy			= 2.0f * sy - 1.0f;
199e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		int			vtxNdx		= ((y * (gridSize+1)) + x);
200f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
20194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		m_positions[vtxNdx]		= tcu::Vec4(fx, fy, 0.0f, 1.0f);
20294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		m_coords[vtxNdx]		= getCoords(sx, sy);
203c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		m_unitCoords[vtxNdx]	= getUnitCoords(sx, sy);
20494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		m_attribOne[vtxNdx]		= 1.0f;
205107dd14dc168c363321247d56044f5037e9a51d1Peter Gal
206e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_screenPos[vtxNdx]		= tcu::Vec4(sx, sy, 0.0f, 1.0f) * viewportScale;
207e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
208e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		for (int attribNdx = 0; attribNdx < getNumUserAttribs(); attribNdx++)
209e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			m_userAttribs[attribNdx][vtxNdx] = getUserAttrib(attribNdx, sx, sy);
210e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	}
211e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
212e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Compute indices.
213e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	m_indices.resize(3 * m_numTriangles);
214e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	for (int y = 0; y < gridSize; y++)
215e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	for (int x = 0; x < gridSize; x++)
216e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	{
21794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		int stride				= gridSize + 1;
21894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		int v00					= (y * stride) + x;
21994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		int v01					= (y * stride) + x + 1;
22094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		int v10					= ((y+1) * stride) + x;
22194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		int v11					= ((y+1) * stride) + x + 1;
222e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
22394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		int baseNdx				= ((y * gridSize) + x) * 6;
224e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_indices[baseNdx + 0]	= (deUint16)v10;
225e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_indices[baseNdx + 1]	= (deUint16)v00;
226e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_indices[baseNdx + 2]	= (deUint16)v01;
227e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
228e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_indices[baseNdx + 3]	= (deUint16)v10;
229e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_indices[baseNdx + 4]	= (deUint16)v01;
230e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_indices[baseNdx + 5]	= (deUint16)v11;
231e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	}
232f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
233f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
234f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalQuadGrid::~QuadGrid (void)
235f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
236f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
237f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
238e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline tcu::Vec4 QuadGrid::getCoords (float sx, float sy) const
239f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
240fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const float fx = 2.0f * sx - 1.0f;
241fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const float fy = 2.0f * sy - 1.0f;
242e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	return tcu::Vec4(fx, fy, -fx + 0.33f*fy, -0.275f*fx - fy);
243f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
244f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
245e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline tcu::Vec4 QuadGrid::getUnitCoords (float sx, float sy) const
246f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
247e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	return tcu::Vec4(sx, sy, 0.33f*sx + 0.5f*sy, 0.5f*sx + 0.25f*sy);
248f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
249f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
250e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline tcu::Vec4 QuadGrid::getUserAttrib (int attribNdx, float sx, float sy) const
251f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
252e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// homogeneous normalized screen-space coordinates
253e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	return m_userAttribTransforms[attribNdx] * tcu::Vec4(sx, sy, 0.0f, 1.0f);
254f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
255f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
256fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal// TextureBinding
257fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
258baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter GalTextureBinding::TextureBinding (const tcu::Archive&	archive,
259baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal								const char*			filename,
260baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal								const Type			type,
261baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal								const tcu::Sampler&	sampler)
262baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	: m_type	(type)
263fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	, m_sampler	(sampler)
264fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal{
265baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	switch(m_type)
266baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	{
2673038af220852000e643054412d14679c61d58838Peter Gal		case TYPE_2D: m_binding.tex2D = loadTexture2D(archive, filename).release(); break;
268baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		default:
269e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal			DE_FATAL("Unsupported texture type");
270baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	}
271baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal}
272baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
2733038af220852000e643054412d14679c61d58838Peter GalTextureBinding::~TextureBinding (void)
274baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal{
2753038af220852000e643054412d14679c61d58838Peter Gal	switch(m_type)
276baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	{
2773038af220852000e643054412d14679c61d58838Peter Gal		case TYPE_2D: delete m_binding.tex2D; break;
2783038af220852000e643054412d14679c61d58838Peter Gal		default: break;
2793038af220852000e643054412d14679c61d58838Peter Gal	}
2803038af220852000e643054412d14679c61d58838Peter Gal}
281baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
282baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
2833038af220852000e643054412d14679c61d58838Peter Galde::MovePtr<tcu::Texture2D> TextureBinding::loadTexture2D (const tcu::Archive& archive, const char* filename)
2843038af220852000e643054412d14679c61d58838Peter Gal{
2853038af220852000e643054412d14679c61d58838Peter Gal	tcu::TextureLevel level;
2863038af220852000e643054412d14679c61d58838Peter Gal	tcu::ImageIO::loadImage(level, archive, filename);
287baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
2883038af220852000e643054412d14679c61d58838Peter Gal	TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
2893038af220852000e643054412d14679c61d58838Peter Gal					   level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
290baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
2913038af220852000e643054412d14679c61d58838Peter Gal	// \todo [2015-10-08 elecro] for some reason we get better when using RGBA texture even in RGB case, this needs to be investigated
2923038af220852000e643054412d14679c61d58838Peter Gal	de::MovePtr<tcu::Texture2D> texture(new tcu::Texture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight()));
293baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
2943038af220852000e643054412d14679c61d58838Peter Gal	// Fill level 0.
2953038af220852000e643054412d14679c61d58838Peter Gal	texture->allocLevel(0);
2963038af220852000e643054412d14679c61d58838Peter Gal	tcu::copy(texture->getLevel(0), level.getAccess());
2973038af220852000e643054412d14679c61d58838Peter Gal
2983038af220852000e643054412d14679c61d58838Peter Gal	return texture;
299fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal}
300fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
301f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderEvalContext.
302f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
3033c17bc60af5c131488c834c64851a00449e4ef59Peter GalShaderEvalContext::ShaderEvalContext (const QuadGrid& quadGrid)
3043c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	: constCoords	(quadGrid.getConstCoords())
3053c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, isDiscarded	(false)
3063c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_quadGrid	(quadGrid)
307f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
3083038af220852000e643054412d14679c61d58838Peter Gal	const std::vector<TextureBindingSp>& bindings = m_quadGrid.getTextures();
309e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	DE_ASSERT((int)bindings.size() <= MAX_TEXTURES);
310f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
311e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Fill in texture array.
312e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	for (int ndx = 0; ndx < (int)bindings.size(); ndx++)
313e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	{
3143038af220852000e643054412d14679c61d58838Peter Gal		const TextureBinding& binding = *bindings[ndx];
315f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
316e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		if (binding.getType() == TextureBinding::TYPE_NONE)
317e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			continue;
318f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
319e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		textures[ndx].sampler = binding.getSampler();
320f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
321e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		switch (binding.getType())
322e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		{
3233038af220852000e643054412d14679c61d58838Peter Gal			case TextureBinding::TYPE_2D:		textures[ndx].tex2D			= &binding.get2D();		break;
324ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal			// \todo [2015-09-07 elecro] Add support for the other binding types
325ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal			/*
3268e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal			case TextureBinding::TYPE_CUBE_MAP:	textures[ndx].texCube		= binding.getCube();	break;
3278e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal			case TextureBinding::TYPE_2D_ARRAY:	textures[ndx].tex2DArray	= binding.get2DArray();	break;
3288e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal			case TextureBinding::TYPE_3D:		textures[ndx].tex3D			= binding.get3D();		break;
329ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal			*/
330e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			default:
331ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal				TCU_THROW(InternalError, "Handling of texture binding type not implemented");
332e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		}
333e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	}
334f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
335f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
336e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter GalShaderEvalContext::~ShaderEvalContext (void)
337e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
338e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
339e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
340f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galvoid ShaderEvalContext::reset (float sx, float sy)
341f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
342e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Clear old values
343e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	color		= tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
344e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	isDiscarded	= false;
345e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
346e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Compute coords
3473c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	coords		= m_quadGrid.getCoords(sx, sy);
3483c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	unitCoords	= m_quadGrid.getUnitCoords(sx, sy);
349e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
350e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	// Compute user attributes.
351fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int numAttribs = m_quadGrid.getNumUserAttribs();
352e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	DE_ASSERT(numAttribs <= MAX_USER_ATTRIBS);
353e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	for (int attribNdx = 0; attribNdx < numAttribs; attribNdx++)
3543c17bc60af5c131488c834c64851a00449e4ef59Peter Gal		in[attribNdx] = m_quadGrid.getUserAttrib(attribNdx, sx, sy);
355f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
356f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
357fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Galtcu::Vec4 ShaderEvalContext::texture2D (int unitNdx, const tcu::Vec2& texCoords)
358f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
359e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	if (textures[unitNdx].tex2D)
360e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		return textures[unitNdx].tex2D->sample(textures[unitNdx].sampler, texCoords.x(), texCoords.y(), 0.0f);
361e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	else
3628e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		return tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
363f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
364f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
365f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderEvaluator.
366f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
367f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderEvaluator::ShaderEvaluator (void)
368e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	: m_evalFunc(DE_NULL)
369f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
370f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
371f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
372f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderEvaluator::ShaderEvaluator (ShaderEvalFunc evalFunc)
373e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	: m_evalFunc(evalFunc)
374f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
375f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
376f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
377f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderEvaluator::~ShaderEvaluator (void)
378f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
379f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
380f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
381fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Galvoid ShaderEvaluator::evaluate (ShaderEvalContext& ctx) const
382f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
383e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	DE_ASSERT(m_evalFunc);
384e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	m_evalFunc(ctx);
385f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
386f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
38702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal// UniformSetup.
38802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
38902297b806657cc6311a7ff5f5cc4976e91abbb83Peter GalUniformSetup::UniformSetup (void)
39002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	: m_setupFunc(DE_NULL)
39102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{
39202297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal}
39302297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
39402297b806657cc6311a7ff5f5cc4976e91abbb83Peter GalUniformSetup::UniformSetup (UniformSetupFunc setupFunc)
39502297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	: m_setupFunc(setupFunc)
39602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{
39702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal}
39802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
39902297b806657cc6311a7ff5f5cc4976e91abbb83Peter GalUniformSetup::~UniformSetup (void)
40002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{
40102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal}
40202297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
403fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Galvoid UniformSetup::setup (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) const
40402297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{
40502297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	if (m_setupFunc)
40602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal		m_setupFunc(instance, constCoords);
40702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal}
40802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
4093bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal// ShaderRenderCase.
4103bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal
411fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderRenderCase::ShaderRenderCase (tcu::TestContext&			testCtx,
412fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const std::string&			name,
413fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const std::string&			description,
414fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const bool					isVertexCase,
415fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const ShaderEvalFunc		evalFunc,
416fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const UniformSetup*			uniformSetup,
417fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const AttributeSetupFunc	attribFunc)
4183c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	: vkt::TestCase		(testCtx, name, description)
4193c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_isVertexCase	(isVertexCase)
4203c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_evaluator		(new ShaderEvaluator(evalFunc))
4213c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_uniformSetup	(uniformSetup ? uniformSetup : new UniformSetup())
4223c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_attribFunc		(attribFunc)
4233bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{}
4243bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal
425fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderRenderCase::ShaderRenderCase (tcu::TestContext&			testCtx,
426fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const std::string&			name,
427fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const std::string&			description,
428fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const bool					isVertexCase,
429fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const ShaderEvaluator*		evaluator,
430fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const UniformSetup*			uniformSetup,
431fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									const AttributeSetupFunc	attribFunc)
4323c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	: vkt::TestCase		(testCtx, name, description)
4333c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_isVertexCase	(isVertexCase)
4343c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_evaluator		(evaluator)
4353c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_uniformSetup	(uniformSetup ? uniformSetup : new UniformSetup())
4363c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_attribFunc		(attribFunc)
4373bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{}
4383bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal
4393bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter GalShaderRenderCase::~ShaderRenderCase (void)
4403bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{
4413bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal}
4423bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal
4435f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Galvoid ShaderRenderCase::initPrograms (vk::SourceCollections& programCollection) const
4443bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{
4455f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal	programCollection.glslSources.add("vert") << glu::VertexSource(m_vertShaderSource);
4465f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal	programCollection.glslSources.add("frag") << glu::FragmentSource(m_fragShaderSource);
4473bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal}
4483bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal
4493bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter GalTestInstance* ShaderRenderCase::createInstance (Context& context) const
4503bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{
4513bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal	DE_ASSERT(m_evaluator != DE_NULL);
4523bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal	DE_ASSERT(m_uniformSetup != DE_NULL);
4533bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal	return new ShaderRenderCaseInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_attribFunc);
4543bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal}
4553bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal
456f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderRenderCaseInstance.
457f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
458fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderRenderCaseInstance::ShaderRenderCaseInstance (Context&					context,
459fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal													const bool					isVertexCase,
460fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal													const ShaderEvaluator&		evaluator,
461fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal													const UniformSetup&			uniformSetup,
462fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal													const AttributeSetupFunc	attribFunc)
4633c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	: vkt::TestInstance	(context)
464689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	, m_clearColor		(DEFAULT_CLEAR_COLOR)
465db2888538b477baf488001c9c0ab294c848183ebPeter Gal	, m_memAlloc		(context.getDefaultAllocator())
4663c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_isVertexCase	(isVertexCase)
4673c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_evaluator		(evaluator)
4683c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_uniformSetup	(uniformSetup)
4693c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_attribFunc		(attribFunc)
4703bc29b613dfc3842a5a90d7deb0b062869033230Jeff Bolz	, m_renderSize		(128, 128)
4713c17bc60af5c131488c834c64851a00449e4ef59Peter Gal	, m_colorFormat		(VK_FORMAT_R8G8B8A8_UNORM)
472f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
473f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
474f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
475f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderRenderCaseInstance::~ShaderRenderCaseInstance (void)
476f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
477f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
478f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
479f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galtcu::TestStatus ShaderRenderCaseInstance::iterate (void)
480f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{
481fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	setup();
482fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
483e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Create quad grid.
484689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const tcu::UVec2	viewportSize	= getViewportSize();
485fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int			width			= viewportSize.x();
48694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const int			height			= viewportSize.y();
487e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
488689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	QuadGrid			quadGrid		(m_isVertexCase ? GRID_SIZE : 4, width, height, tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f), m_userAttribTransforms, m_textures);
489e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
490e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Render result.
491fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	tcu::Surface		resImage		(width, height);
492e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	render(resImage, quadGrid);
493e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
494e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Compute reference.
495fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	tcu::Surface		refImage		(width, height);
496e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	if (m_isVertexCase)
497e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		computeVertexReference(refImage, quadGrid);
498e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	else
499e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		computeFragmentReference(refImage, quadGrid);
500e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
501e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Compare.
50294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const bool			compareOk		= compareImages(resImage, refImage, 0.05f);
503e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
504e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	if (compareOk)
505e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		return tcu::TestStatus::pass("Result image matches reference");
506e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	else
507e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		return tcu::TestStatus::fail("Image mismatch");
508e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
509e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
5102fefaff91934f41ff34328c6e6b95ed24892b5a4Pyry Haulosvoid ShaderRenderCaseInstance::setupUniformData (deUint32 bindingLocation, size_t size, const void* dataPtr)
511da90931967434116522be552f82c8bc164a835bfPeter Gal{
512e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const VkDevice					vkDevice			= m_context.getDevice();
513e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const DeviceInterface&			vk					= m_context.getDeviceInterface();
514e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const deUint32					queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
515da90931967434116522be552f82c8bc164a835bfPeter Gal
51694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const VkBufferCreateInfo		uniformBufferParams	=
517da90931967434116522be552f82c8bc164a835bfPeter Gal	{
518da90931967434116522be552f82c8bc164a835bfPeter Gal		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
519da90931967434116522be552f82c8bc164a835bfPeter Gal		DE_NULL,									// const void*			pNext;
52068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,											// VkBufferCreateFlags	flags;
521da90931967434116522be552f82c8bc164a835bfPeter Gal		size,										// VkDeviceSize			size;
522da90931967434116522be552f82c8bc164a835bfPeter Gal		VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,			// VkBufferUsageFlags	usage;
523da90931967434116522be552f82c8bc164a835bfPeter Gal		VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
524da90931967434116522be552f82c8bc164a835bfPeter Gal		1u,											// deUint32				queueFamilyCount;
525da90931967434116522be552f82c8bc164a835bfPeter Gal		&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
526da90931967434116522be552f82c8bc164a835bfPeter Gal	};
527da90931967434116522be552f82c8bc164a835bfPeter Gal
528e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	Move<VkBuffer>					buffer				= createBuffer(vk, vkDevice, &uniformBufferParams);
52994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	de::MovePtr<Allocation>			alloc				= m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
5308e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal	VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, alloc->getMemory(), alloc->getOffset()));
531da90931967434116522be552f82c8bc164a835bfPeter Gal
532d76e073d542f11e430b3c1884f0777272d61291aPeter Gal	deMemcpy(alloc->getHostPtr(), dataPtr, size);
5330d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	flushMappedMemoryRange(vk, vkDevice, alloc->getMemory(), alloc->getOffset(), size);
534da90931967434116522be552f82c8bc164a835bfPeter Gal
5354ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	de::MovePtr<BufferUniform> uniformInfo(new BufferUniform());
5364ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniformInfo->type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5370bf51e2a309ddd9ba301fa96248d3889ed1600a7Gabor Abraham	uniformInfo->descriptor = makeDescriptorBufferInfo(*buffer, 0u, size);
5384ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniformInfo->location = bindingLocation;
5394ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniformInfo->buffer = VkBufferSp(new vk::Unique<VkBuffer>(buffer));
5400a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	uniformInfo->alloc = AllocationSp(alloc.release());
541da90931967434116522be552f82c8bc164a835bfPeter Gal
5424ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	m_uniformInfos.push_back(UniformInfoSp(new de::UniquePtr<UniformInfo>(uniformInfo)));
543da90931967434116522be552f82c8bc164a835bfPeter Gal}
544da90931967434116522be552f82c8bc164a835bfPeter Gal
5452fefaff91934f41ff34328c6e6b95ed24892b5a4Pyry Haulosvoid ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescriptorType descriptorType, size_t dataSize, const void* data)
54602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{
547d32acc9c110ed77b5aac8583f1d3b9ab3ebe05a9Peter Gal	m_descriptorSetLayoutBuilder.addSingleBinding(descriptorType, vk::VK_SHADER_STAGE_ALL);
54802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	m_descriptorPoolBuilder.addType(descriptorType);
54902297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal
55002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	setupUniformData(bindingLocation, dataSize, data);
55102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal}
552da90931967434116522be552f82c8bc164a835bfPeter Gal
5538e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Galvoid ShaderRenderCaseInstance::addAttribute (deUint32		bindingLocation,
5548e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal											 vk::VkFormat	format,
5558e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal											 deUint32		sizePerElement,
5568e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal											 deUint32		count,
55794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos											 const void*	dataPtr)
558c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal{
559c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	// Add binding specification
56094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const deUint32							binding					= (deUint32)m_vertexBindingDescription.size();
561e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const VkVertexInputBindingDescription	bindingDescription		=
562c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	{
56394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		binding,							// deUint32				binding;
56468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		sizePerElement,						// deUint32				stride;
56568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_VERTEX_INPUT_RATE_VERTEX			// VkVertexInputRate	stepRate;
566c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	};
567c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
568c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	m_vertexBindingDescription.push_back(bindingDescription);
569c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
570c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	// Add location and format specification
571e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const VkVertexInputAttributeDescription	attributeDescription	=
572c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	{
573c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		bindingLocation,			// deUint32	location;
574c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		binding,					// deUint32	binding;
575c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		format,						// VkFormat	format;
57668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,							// deUint32	offset;
577c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	};
578c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
579c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	m_vertexattributeDescription.push_back(attributeDescription);
580c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
581c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	// Upload data to buffer
582e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const VkDevice							vkDevice				= m_context.getDevice();
583e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const DeviceInterface&					vk						= m_context.getDeviceInterface();
584e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const deUint32							queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
585c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
58694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const VkDeviceSize						inputSize				= sizePerElement * count;
587e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	const VkBufferCreateInfo				vertexBufferParams		=
588c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	{
589c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
590c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		DE_NULL,									// const void*			pNext;
59168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,											// VkBufferCreateFlags	flags;
592c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		inputSize,									// VkDeviceSize			size;
593c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
594c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
595c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		1u,											// deUint32				queueFamilyCount;
596c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
597c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	};
598c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
59994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	Move<VkBuffer>							buffer					= createBuffer(vk, vkDevice, &vertexBufferParams);
6000d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	de::MovePtr<vk::Allocation>				alloc					= m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
6018e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal	VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, alloc->getMemory(), alloc->getOffset()));
602c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
6037617e1896b93e92cce0214dfbdcd864b8cfbe144Pyry Haulos	deMemcpy(alloc->getHostPtr(), dataPtr, (size_t)inputSize);
6040d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	flushMappedMemoryRange(vk, vkDevice, alloc->getMemory(), alloc->getOffset(), inputSize);
605c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
606fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal	m_vertexBuffers.push_back(VkBufferSp(new vk::Unique<VkBuffer>(buffer)));
6070a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	m_vertexBufferAllocs.push_back(AllocationSp(alloc.release()));
608c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal}
609c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
61023597067ccf919c019f237c49dd153d1ea502efcPeter Galvoid ShaderRenderCaseInstance::useAttribute (deUint32 bindingLocation, BaseAttributeType type)
61123597067ccf919c019f237c49dd153d1ea502efcPeter Gal{
61223597067ccf919c019f237c49dd153d1ea502efcPeter Gal	const EnabledBaseAttribute attribute =
61323597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
6148e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		bindingLocation,	// deUint32				location;
6158e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		type				// BaseAttributeType	type;
61623597067ccf919c019f237c49dd153d1ea502efcPeter Gal	};
61723597067ccf919c019f237c49dd153d1ea502efcPeter Gal	m_enabledBaseAttributes.push_back(attribute);
61823597067ccf919c019f237c49dd153d1ea502efcPeter Gal}
61923597067ccf919c019f237c49dd153d1ea502efcPeter Gal
620e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Galvoid ShaderRenderCaseInstance::setup (void)
621e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
622e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
623e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
624e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::setupUniforms (const tcu::Vec4& constCoords)
625e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
62602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal	m_uniformSetup.setup(*this, constCoords);
627e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
628e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
629657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Galvoid ShaderRenderCaseInstance::useUniform (deUint32 bindingLocation, BaseUniformType type)
630657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal{
631e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	#define UNIFORM_CASE(type, value) case type: addUniform(bindingLocation, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, value); break
632657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
633657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	switch(type)
634657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	{
635657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// Bool
636e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UB_FALSE,	0);
637e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UB_TRUE,	1);
638657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
639657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// BVec4
640e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UB4_FALSE,	tcu::Vec4(0));
641e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UB4_TRUE,	tcu::Vec4(1));
642657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
643657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// Integer
64494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_ZERO,	0);
64594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_ONE,	1);
64694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_TWO,	2);
64794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_THREE,	3);
64894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_FOUR,	4);
64994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_FIVE,	5);
65094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_SIX,	6);
65194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_SEVEN,	7);
65294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI_EIGHT,	8);
653e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI_ONEHUNDREDONE, 101);
654657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
655657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// IVec2
65694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		UNIFORM_CASE(UI2_MINUS_ONE,	tcu::IVec2(-1));
657e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI2_ZERO,		tcu::IVec2(0));
658e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI2_ONE,		tcu::IVec2(1));
659e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI2_TWO,		tcu::IVec2(2));
660e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI2_THREE,		tcu::IVec2(3));
661e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI2_FOUR,		tcu::IVec2(4));
662e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI2_FIVE,		tcu::IVec2(5));
663657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
664657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// IVec3
665e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_MINUS_ONE,	tcu::IVec3(-1));
666e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_ZERO,		tcu::IVec3(0));
667e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_ONE,		tcu::IVec3(1));
668e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_TWO,		tcu::IVec3(2));
669e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_THREE,		tcu::IVec3(3));
670e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_FOUR,		tcu::IVec3(4));
671e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI3_FIVE,		tcu::IVec3(5));
672657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
673657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// IVec4
674e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_MINUS_ONE, tcu::IVec4(-1));
675e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_ZERO,		tcu::IVec4(0));
676e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_ONE,		tcu::IVec4(1));
677e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_TWO,		tcu::IVec4(2));
678e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_THREE,		tcu::IVec4(3));
679e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_FOUR,		tcu::IVec4(4));
680e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UI4_FIVE,		tcu::IVec4(5));
681657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
682657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// Float
683e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_ZERO,		0.0f);
684e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_ONE,		1.0f);
685e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_TWO,		2.0f);
686e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_THREE,		3.0f);
687e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_FOUR,		4.0f);
688e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_FIVE,		5.0f);
689e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_SIX,		6.0f);
690e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_SEVEN,		7.0f);
6918de9729b70dce1afe01b302d07daee35a25baec7Peter Gal		UNIFORM_CASE(UF_EIGHT,		8.0f);
692e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal
693e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_HALF,		1.0f / 2.0f);
694e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_THIRD,		1.0f / 3.0f);
695e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_FOURTH,		1.0f / 4.0f);
696e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_FIFTH,		1.0f / 5.0f);
697e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_SIXTH,		1.0f / 6.0f);
698e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_SEVENTH,	1.0f / 7.0f);
699e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UF_EIGHTH,		1.0f / 8.0f);
700657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
701657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// Vec2
702e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV2_MINUS_ONE,	tcu::Vec2(-1.0f));
703e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV2_ZERO,		tcu::Vec2(0.0f));
704e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV2_ONE,		tcu::Vec2(1.0f));
705e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV2_TWO,		tcu::Vec2(2.0f));
706e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV2_THREE,		tcu::Vec2(3.0f));
707657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
708e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV2_HALF,		tcu::Vec2(1.0f / 2.0f));
709657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
710657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// Vec3
711e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV3_MINUS_ONE,	tcu::Vec3(-1.0f));
712e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV3_ZERO,		tcu::Vec3(0.0f));
713e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV3_ONE,		tcu::Vec3(1.0f));
714e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV3_TWO,		tcu::Vec3(2.0f));
715e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV3_THREE,		tcu::Vec3(3.0f));
716657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
717e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV3_HALF,		tcu::Vec3(1.0f / 2.0f));
718657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
719657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		// Vec4
720e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_MINUS_ONE,	tcu::Vec4(-1.0f));
721e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_ZERO,		tcu::Vec4(0.0f));
722e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_ONE,		tcu::Vec4(1.0f));
723e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_TWO,		tcu::Vec4(2.0f));
724e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_THREE,		tcu::Vec4(3.0f));
725657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
726e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_HALF,		tcu::Vec4(1.0f / 2.0f));
727657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
728e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_BLACK,		tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
729e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_GRAY,		tcu::Vec4(0.5f, 0.5f, 0.5f, 1.0f));
730e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		UNIFORM_CASE(UV4_WHITE,		tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
731657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
732657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal		default:
733e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Unknown Uniform type: " << type << tcu::TestLog::EndMessage;
734657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal			break;
735657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal	}
736657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
737e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	#undef UNIFORM_CASE
738657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal}
739657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal
740689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosconst tcu::UVec2 ShaderRenderCaseInstance::getViewportSize (void) const
741e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
742689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	return tcu::UVec2(de::min(m_renderSize.x(), MAX_RENDER_WIDTH),
743689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos					  de::min(m_renderSize.y(), MAX_RENDER_HEIGHT));
744e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
745e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
7460d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter GalMove<VkImage> ShaderRenderCaseInstance::createImage2D (const tcu::Texture2D&	texture,
7470d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal													   const VkFormat			format,
7480d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal													   const VkImageUsageFlags	usage,
7490d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal													   const VkImageTiling		tiling)
750baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal{
751baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	const VkDevice			vkDevice			= m_context.getDevice();
752baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	const DeviceInterface&	vk					= m_context.getDeviceInterface();
753baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	const deUint32			queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
754baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
7550298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const VkImageCreateInfo	imageCreateInfo		=
756baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	{
757baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,						// VkStructureType			sType;
75868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// const void*				pNext;
75968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0,															// VkImageCreateFlags		flags;
760baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		VK_IMAGE_TYPE_2D,											// VkImageType				imageType;
761baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		format,														// VkFormat					format;
762689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		{
763689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)texture.getWidth(),
764689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)texture.getHeight(),
765689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			1u
766689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		},															// VkExtend3D				extent;
767baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		1u,															// deUint32					mipLevels;
768baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		1u,															// deUint32					arraySize;
76968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,										// deUint32					samples;
7700d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		tiling,														// VkImageTiling			tiling;
7710d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		usage,														// VkImageUsageFlags		usage;
772baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		VK_SHARING_MODE_EXCLUSIVE,									// VkSharingMode			sharingMode;
773baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		1,															// deuint32					queueFamilyCount;
7745f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		&queueFamilyIndex,											// const deUint32*			pQueueFamilyIndices;
7758e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		VK_IMAGE_LAYOUT_UNDEFINED,									// VkImageLayout			initialLayout;
776baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	};
777baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
7780298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	Move<VkImage>			vkTexture			= createImage(vk, vkDevice, &imageCreateInfo);
779baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	return vkTexture;
780baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal}
781baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
7820d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galde::MovePtr<Allocation> ShaderRenderCaseInstance::uploadImage2D (const tcu::Texture2D&	refTexture,
7830d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal																 const VkImage&			vkTexture)
784fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal{
7850298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const VkDevice				vkDevice	= m_context.getDevice();
7860298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const DeviceInterface&		vk			= m_context.getDeviceInterface();
787baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
7880298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	de::MovePtr<Allocation>		allocation	= m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, vkTexture), MemoryRequirement::HostVisible);
7890d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VK_CHECK(vk.bindImageMemory(vkDevice, vkTexture, allocation->getMemory(), allocation->getOffset()));
790baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
7918e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal	const VkImageSubresource	subres				=
792baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	{
79368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_ASPECT_COLOR_BIT,	// VkImageAspectFlags	aspectMask;
79468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,							// deUint32				mipLevel;
79568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u							// deUint32				arraySlice
796baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	};
797baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
798baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	VkSubresourceLayout layout;
79968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vk.getImageSubresourceLayout(vkDevice, vkTexture, &subres, &layout);
800baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
80194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	tcu::ConstPixelBufferAccess	access		= refTexture.getLevel(0);
8020298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	tcu::PixelBufferAccess		destAccess	(refTexture.getFormat(), refTexture.getWidth(), refTexture.getHeight(), 1, allocation->getHostPtr());
803baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
804baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	tcu::copy(destAccess, access);
805baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
8069931d9632ce1e900213ddd41ebd25a36cc93536eMark Adams	flushMappedMemoryRange(vk, vkDevice, allocation->getMemory(), allocation->getOffset(), layout.size);
8070d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8080d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	return allocation;
8090d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal}
8100d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8110d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galvoid ShaderRenderCaseInstance::copyTilingImageToOptimal	(const vk::VkImage&	srcImage,
8120d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal														 const vk::VkImage&	dstImage,
813689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos														 deUint32			width,
814689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos														 deUint32			height)
8150d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{
81668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkDevice						vkDevice			= m_context.getDevice();
81768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const DeviceInterface&				vk					= m_context.getDeviceInterface();
81868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkQueue						queue				= m_context.getUniversalQueue();
81968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
8200d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8210d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Create command pool
82268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandPoolCreateInfo		cmdPoolParams		=
823baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	{
82468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,	// VkStructureType		sType;
8250d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		DE_NULL,									// const void*			pNext;
82668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,		// VkCmdPoolCreateFlags	flags;
8270d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		queueFamilyIndex,							// deUint32				queueFamilyIndex;
828baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	};
829baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
83068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Move<VkCommandPool>					cmdPool				= createCommandPool(vk, vkDevice, &cmdPoolParams);
8310d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8320d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Create command buffer
83394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const VkCommandBufferAllocateInfo	cmdBufferParams		=
8340d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
83568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
83668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// const void*				pNext;
83768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*cmdPool,										// VkCommandPool			commandPool;
83868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel		level;
839ee90522bd5381c8444ef615f5350d8fd50c34a4bMika Isojärvi		1u												// deUint32					bufferCount;
8400d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	};
8410d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
84268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandBufferUsageFlags		usageFlags			= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
84368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandBufferBeginInfo		cmdBufferBeginInfo	=
8440d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
84568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType				sType;
84668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// const void*					pNext;
84768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		usageFlags,										// VkCommandBufferUsageFlags	flags;
848689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkCommandBufferInheritanceInfo*)DE_NULL,
8490d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	};
8500d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
85168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Move<VkCommandBuffer>				cmdBuffer			= allocateCommandBuffer(vk, vkDevice, &cmdBufferParams);
8520d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8530d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
8540d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8550d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Add image barriers
85668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkImageMemoryBarrier			layoutBarriers[2]	=
8570d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
85868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		createImageMemoryBarrier(srcImage, (VkAccessFlags)0u, (VkAccessFlags)0u, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
85968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		createImageMemoryBarrier(dstImage, (VkAccessFlags)0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
8600d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	};
8610d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
862689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
863689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						  0, (const VkMemoryBarrier*)DE_NULL,
864689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						  0, (const VkBufferMemoryBarrier*)DE_NULL,
865689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						  DE_LENGTH_OF_ARRAY(layoutBarriers), layoutBarriers);
8660d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
8670d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Add image copy
8680d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	const VkImageCopy				imageCopy			=
8690d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
8700d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		{
87168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_ASPECT_COLOR_BIT,		// VkImageAspect	aspect;
8720d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0u,								// deUint32			mipLevel;
8730d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0u,								// deUint32			arrayLayer;
8740d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			1u								// deUint32			arraySize;
8750d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		},											// VkImageSubresourceCopy	srcSubresource;
8760d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		{
8770d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0,								// int32			x;
8780d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0,								// int32			y;
8790d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0								// int32			z;
8800d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		},											// VkOffset3D				srcOffset;
8810d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		{
88268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_ASPECT_COLOR_BIT,		// VkImageAspect	aspect;
8830d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0u,								// deUint32			mipLevel;
8840d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0u,								// deUint32			arrayLayer;
8850d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			1u								// deUint32			arraySize;
8860d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		},											// VkImageSubresourceCopy	destSubResource;
8870d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		{
8880d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0,								// int32			x;
8890d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0,								// int32			y;
8900d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			0								// int32			z;
8910d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		},											// VkOffset3D				dstOffset;
8920d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		{
8930d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			width,							// int32			width;
8940d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			height,							// int32			height;
8950d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal			1,								// int32			depth
8960d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		}	// VkExtent3D					extent;
8970d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	};
8980d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
89968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vk.cmdCopyImage(*cmdBuffer, srcImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &imageCopy);
9000d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9010d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Add destination barrier
9020d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	const VkImageMemoryBarrier		dstBarrier			=
90368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			createImageMemoryBarrier(dstImage, VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, 0u, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
9040d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
905689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
906689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						  0, (const VkMemoryBarrier*)DE_NULL,
907689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						  0, (const VkBufferMemoryBarrier*)DE_NULL,
908689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						  1, &dstBarrier);
9090d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9100d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
9110d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9120d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	const VkFenceCreateInfo			fenceParams			=
9130d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
9140d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
9150d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		DE_NULL,								// const void*			pNext;
9160d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		0u										// VkFenceCreateFlags	flags;
9170d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	};
91868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkFence>			fence				(createFence(vk, vkDevice, &fenceParams));
91968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkSubmitInfo				submitInfo			=
92068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	{
92168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_SUBMIT_INFO,
92268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,
92368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,
92468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,
925689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
92668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,
92768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&cmdBuffer.get(),
92868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,
92968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,
93068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	};
93168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
9320d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9330d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Execute copy
9340d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VK_CHECK(vk.resetFences(vkDevice, 1, &fence.get()));
93568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
9360d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity*/));
9370d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal}
9380d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9390d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galvoid ShaderRenderCaseInstance::useSampler2D (deUint32 bindingLocation, deUint32 textureID)
9400d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{
9410d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	DE_ASSERT(textureID < m_textures.size());
9420d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9430d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	const VkDevice					vkDevice		= m_context.getDevice();
9440d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	const DeviceInterface&			vk				= m_context.getDeviceInterface();
9453038af220852000e643054412d14679c61d58838Peter Gal	const TextureBinding&			textureBinding	= *m_textures[textureID];
9463038af220852000e643054412d14679c61d58838Peter Gal	const tcu::Texture2D&			refTexture		= textureBinding.get2D();
9470d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	const tcu::Sampler&				refSampler		= textureBinding.getSampler();
9483038af220852000e643054412d14679c61d58838Peter Gal	const VkFormat					format			= refTexture.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8)
9490d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal														? VK_FORMAT_R8G8B8A8_UNORM
9500d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal														: VK_FORMAT_R8G8B8_UNORM;
9510d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9520d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	// Create & alloc the image
9530d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	Move<VkImage>					vkTexture;
95494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	de::MovePtr<Allocation>			allocation;
9550d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9560d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	if (isSupportedLinearTilingFormat(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), format))
9570d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
9583038af220852000e643054412d14679c61d58838Peter Gal		vkTexture = createImage2D(refTexture, format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR);
9593038af220852000e643054412d14679c61d58838Peter Gal		allocation = uploadImage2D(refTexture, *vkTexture);
9600d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	}
9610d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	else if (isSupportedOptimalTilingFormat(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), format))
9620d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
96368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		Move<VkImage>				stagingTexture	(createImage2D(refTexture, format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR));
9643038af220852000e643054412d14679c61d58838Peter Gal		de::MovePtr<Allocation>		stagingAlloc	(uploadImage2D(refTexture, *stagingTexture));
9650d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
96668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkImageUsageFlags		dstUsageFlags	= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
9673038af220852000e643054412d14679c61d58838Peter Gal		vkTexture = createImage2D(refTexture, format, dstUsageFlags, VK_IMAGE_TILING_OPTIMAL);
9680d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		allocation = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *vkTexture), MemoryRequirement::Any);
9690d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		VK_CHECK(vk.bindImageMemory(vkDevice, *vkTexture, allocation->getMemory(), allocation->getOffset()));
9700d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal
9713038af220852000e643054412d14679c61d58838Peter Gal		copyTilingImageToOptimal(*stagingTexture, *vkTexture, refTexture.getWidth(), refTexture.getHeight());
9720d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	}
9730d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	else
9740d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	{
9750d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		TCU_THROW(InternalError, "Unable to create 2D image");
9760d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal	}
977baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
978fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	// Create sampler
979689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const VkSamplerCreateInfo		samplerParams	= mapSampler(refSampler, refTexture.getFormat());
9808e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal	Move<VkSampler>					sampler			= createSampler(vk, vkDevice, &samplerParams);
981fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
9828e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal	const VkImageViewCreateInfo		viewParams		=
983fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	{
9845caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType			sType;
98568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		NULL,										// const voide*				pNext;
98668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,											// VkImageViewCreateFlags	flags;
987baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		*vkTexture,									// VkImage					image;
9885caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal		VK_IMAGE_VIEW_TYPE_2D,						// VkImageViewType			viewType;
989baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		format,										// VkFormat					format;
9905caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal		{
99168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_R,			// VkChannelSwizzle		r;
99268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_G,			// VkChannelSwizzle		g;
99368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_B,			// VkChannelSwizzle		b;
99468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_A			// VkChannelSwizzle		a;
9955caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal		},											// VkChannelMapping			channels;
9965caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal		{
9975f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_IMAGE_ASPECT_COLOR_BIT,		// VkImageAspectFlags	aspectMask;
9985f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0,								// deUint32				baseMipLevel;
9995f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			1,								// deUint32				mipLevels;
10005f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0,								// deUint32				baseArraySlice;
10015f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			1								// deUint32				arraySize;
10025caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal		},											// VkImageSubresourceRange	subresourceRange;
1003fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	};
1004fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
10058e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal	Move<VkImageView>				imageView		= createImageView(vk, vkDevice, &viewParams);
1006fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
100768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const vk::VkDescriptorImageInfo	descriptor		=
1008fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	{
10095f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		sampler.get(),								// VkSampler				sampler;
10105f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		imageView.get(),							// VkImageView				imageView;
10115f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		VK_IMAGE_LAYOUT_GENERAL,					// VkImageLayout			imageLayout;
1012fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	};
1013fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
10144ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	de::MovePtr<SamplerUniform> uniform(new SamplerUniform());
10154ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniform->type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10164ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniform->descriptor = descriptor;
10174ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniform->location = bindingLocation;
1018baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	uniform->image = VkImageSp(new vk::Unique<VkImage>(vkTexture));
10194ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniform->imageView = VkImageViewSp(new vk::Unique<VkImageView>(imageView));
10204ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	uniform->sampler = VkSamplerSp(new vk::Unique<VkSampler>(sampler));
10210a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal	uniform->alloc = AllocationSp(allocation.release());
1022fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
1023d32acc9c110ed77b5aac8583f1d3b9ab3ebe05a9Peter Gal	m_descriptorSetLayoutBuilder.addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, vk::VK_SHADER_STAGE_ALL, &uniform->descriptor.sampler);
1024fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal	m_descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
10254ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal
10264ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal	m_uniformInfos.push_back(UniformInfoSp(new de::UniquePtr<UniformInfo>(uniform)));
1027fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal}
1028fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
1029c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Galvoid ShaderRenderCaseInstance::setupDefaultInputs (const QuadGrid& quadGrid)
1030e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
1031c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	/* Configuration of the vertex input attributes:
1032c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		a_position   is at location 0
1033c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		a_coords     is at location 1
1034c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		a_unitCoords is at location 2
1035c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		a_one        is at location 3
1036c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
1037c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	  User attributes starts from at the location 4.
1038c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	*/
1039e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	addAttribute(0u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getPositions());
1040e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	addAttribute(1u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getCoords());
1041e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	addAttribute(2u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getUnitCoords());
1042c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal	addAttribute(3u, VK_FORMAT_R32_SFLOAT, sizeof(float), quadGrid.getNumVertices(), quadGrid.getAttribOne());
104323597067ccf919c019f237c49dd153d1ea502efcPeter Gal
104423597067ccf919c019f237c49dd153d1ea502efcPeter Gal	static const struct
104523597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
104623597067ccf919c019f237c49dd153d1ea502efcPeter Gal		BaseAttributeType	type;
104723597067ccf919c019f237c49dd153d1ea502efcPeter Gal		int					userNdx;
104823597067ccf919c019f237c49dd153d1ea502efcPeter Gal	} userAttributes[] =
104923597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
105023597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ A_IN0, 0 },
105123597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ A_IN1, 1 },
105223597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ A_IN2, 2 },
105323597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ A_IN3, 3 }
105423597067ccf919c019f237c49dd153d1ea502efcPeter Gal	};
105523597067ccf919c019f237c49dd153d1ea502efcPeter Gal
105623597067ccf919c019f237c49dd153d1ea502efcPeter Gal	static const struct
105723597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
105823597067ccf919c019f237c49dd153d1ea502efcPeter Gal		BaseAttributeType	matrixType;
105923597067ccf919c019f237c49dd153d1ea502efcPeter Gal		int					numCols;
106023597067ccf919c019f237c49dd153d1ea502efcPeter Gal		int					numRows;
106123597067ccf919c019f237c49dd153d1ea502efcPeter Gal	} matrices[] =
106223597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
106323597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT2,		2, 2 },
106423597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT2x3,	2, 3 },
106523597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT2x4,	2, 4 },
10663c17bc60af5c131488c834c64851a00449e4ef59Peter Gal		{ MAT3x2,	3, 2 },
106723597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT3,		3, 3 },
106823597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT3x4,	3, 4 },
106923597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT4x2,	4, 2 },
107023597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT4x3,	4, 3 },
107123597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{ MAT4,		4, 4 }
107223597067ccf919c019f237c49dd153d1ea502efcPeter Gal	};
107323597067ccf919c019f237c49dd153d1ea502efcPeter Gal
1074fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	for (size_t attrNdx = 0; attrNdx < m_enabledBaseAttributes.size(); attrNdx++)
107523597067ccf919c019f237c49dd153d1ea502efcPeter Gal	{
107623597067ccf919c019f237c49dd153d1ea502efcPeter Gal		for (int userNdx = 0; userNdx < DE_LENGTH_OF_ARRAY(userAttributes); userNdx++)
107723597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{
1078fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			if (userAttributes[userNdx].type != m_enabledBaseAttributes[attrNdx].type)
107923597067ccf919c019f237c49dd153d1ea502efcPeter Gal				continue;
108023597067ccf919c019f237c49dd153d1ea502efcPeter Gal
1081fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			addAttribute(m_enabledBaseAttributes[attrNdx].location, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getUserAttrib(userNdx));
108223597067ccf919c019f237c49dd153d1ea502efcPeter Gal		}
108323597067ccf919c019f237c49dd153d1ea502efcPeter Gal
108423597067ccf919c019f237c49dd153d1ea502efcPeter Gal		for (int matNdx = 0; matNdx < DE_LENGTH_OF_ARRAY(matrices); matNdx++)
108523597067ccf919c019f237c49dd153d1ea502efcPeter Gal		{
108623597067ccf919c019f237c49dd153d1ea502efcPeter Gal
1087fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			if (matrices[matNdx].matrixType != m_enabledBaseAttributes[attrNdx].type)
108823597067ccf919c019f237c49dd153d1ea502efcPeter Gal				continue;
108923597067ccf919c019f237c49dd153d1ea502efcPeter Gal
1090fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const int numCols = matrices[matNdx].numCols;
109123597067ccf919c019f237c49dd153d1ea502efcPeter Gal
109223597067ccf919c019f237c49dd153d1ea502efcPeter Gal			for (int colNdx = 0; colNdx < numCols; colNdx++)
109323597067ccf919c019f237c49dd153d1ea502efcPeter Gal			{
10947617e1896b93e92cce0214dfbdcd864b8cfbe144Pyry Haulos				addAttribute(m_enabledBaseAttributes[attrNdx].location + colNdx, VK_FORMAT_R32G32B32A32_SFLOAT, (deUint32)(4 * sizeof(float)), quadGrid.getNumVertices(), quadGrid.getUserAttrib(colNdx));
109523597067ccf919c019f237c49dd153d1ea502efcPeter Gal			}
109623597067ccf919c019f237c49dd153d1ea502efcPeter Gal		}
109723597067ccf919c019f237c49dd153d1ea502efcPeter Gal	}
1098f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}
1099f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal
1100e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::render (tcu::Surface& result, const QuadGrid& quadGrid)
1101e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
11020298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const VkDevice										vkDevice					= m_context.getDevice();
11030298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const DeviceInterface&								vk							= m_context.getDeviceInterface();
11040298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const VkQueue										queue						= m_context.getUniversalQueue();
11050298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal	const deUint32										queueFamilyIndex			= m_context.getUniversalQueueFamilyIndex();
11068bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11078bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create color image
11088bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
11090298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkImageCreateInfo							colorImageParams			=
11108bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
11118bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,										// VkStructureType		sType;
11128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,																	// const void*			pNext;
111368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,																			// VkImageCreateFlags	flags;
11148bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_IMAGE_TYPE_2D,															// VkImageType			imageType;
11158bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			m_colorFormat,																// VkFormat				format;
11168bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			{ m_renderSize.x(), m_renderSize.y(), 1u },									// VkExtent3D			extent;
11178bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,																			// deUint32				mipLevels;
11188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,																			// deUint32				arraySize;
111968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SAMPLE_COUNT_1_BIT,														// deUint32				samples;
11208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_IMAGE_TILING_OPTIMAL,													// VkImageTiling		tiling;
112168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,		// VkImageUsageFlags	usage;
11228bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_SHARING_MODE_EXCLUSIVE,													// VkSharingMode		sharingMode;
11238bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,																			// deUint32				queueFamilyCount;
11245f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			&queueFamilyIndex,															// const deUint32*		pQueueFamilyIndices;
11255f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_IMAGE_LAYOUT_UNDEFINED,													// VkImageLayout		initialLayout;
11268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
11278bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1128e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		m_colorImage = createImage(vk, vkDevice, &colorImageParams);
11298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		// Allocate and bind color image memory
11318e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		m_colorImageAlloc = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any);
11328e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset()));
11338bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
11348bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11358bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create color attachment view
11368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
11370298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkImageViewCreateInfo						colorImageViewParams		=
11388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
11395f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
11405f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			DE_NULL,											// const void*				pNext;
114168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,													// VkImageViewCreateFlags	flags;
11425f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			*m_colorImage,										// VkImage					image;
11435f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
11445f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			m_colorFormat,										// VkFormat					format;
11455f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			{
114668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COMPONENT_SWIZZLE_R,			// VkChannelSwizzle		r;
114768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COMPONENT_SWIZZLE_G,			// VkChannelSwizzle		g;
114868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COMPONENT_SWIZZLE_B,			// VkChannelSwizzle		b;
114968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COMPONENT_SWIZZLE_A			// VkChannelSwizzle		a;
11505f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			},													// VkChannelMapping			channels;
11515f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			{
11525f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				VK_IMAGE_ASPECT_COLOR_BIT,		// VkImageAspectFlags	aspectMask;
11535f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				0,								// deUint32				baseMipLevel;
11545f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				1,								// deUint32				mipLevels;
11555f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				0,								// deUint32				baseArraySlice;
11565f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				1								// deUint32				arraySize;
11575f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			},													// VkImageSubresourceRange	subresourceRange;
11588bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
11598bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11605f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		m_colorImageView = createImageView(vk, vkDevice, &colorImageViewParams);
11618bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
11628bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11638bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create render pass
11648bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
11650298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkAttachmentDescription					attachmentDescription		=
11668bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
116768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkAttachmentDescriptionFlags)0,
11685f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			m_colorFormat,										// VkFormat						format;
116968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SAMPLE_COUNT_1_BIT,								// deUint32						samples;
11705f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
11715f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp			storeOp;
11725f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp			stencilLoadOp;
11735f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
11743d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout				initialLayout;
11755f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				finalLayout;
11768bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
11778bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11780298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkAttachmentReference						attachmentReference			=
11798bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
11808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// deUint32			attachment;
11818bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
11828bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
11838bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11840298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkSubpassDescription						subpassDescription			=
11858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
11868bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// VkSubpassDescriptionFlags	flags;
118768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
11888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// deUint32						inputCount;
11895f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			DE_NULL,											// constVkAttachmentReference*	pInputAttachments;
11908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,													// deUint32						colorCount;
11910298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal			&attachmentReference,								// constVkAttachmentReference*	pColorAttachments;
11925f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			DE_NULL,											// constVkAttachmentReference*	pResolveAttachments;
119368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,											// VkAttachmentReference		depthStencilAttachment;
11948bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// deUint32						preserveCount;
11955f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			DE_NULL												// constVkAttachmentReference*	pPreserveAttachments;
11968bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
11978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
11980298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkRenderPassCreateInfo					renderPassParams			=
11998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
12008bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
12018bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,											// const void*						pNext;
120268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkRenderPassCreateFlags)0,
12038bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,													// deUint32							attachmentCount;
12040298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal			&attachmentDescription,								// const VkAttachmentDescription*	pAttachments;
12058bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,													// deUint32							subpassCount;
12068bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
12078bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// deUint32							dependencyCount;
12088bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL												// const VkSubpassDependency*		pDependencies;
12098bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
12108bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12118bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
12128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
12138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12148bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create framebuffer
12158bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
12160298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkFramebufferCreateInfo					framebufferParams			=
12178bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
12188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType				sType;
12198bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,											// const void*					pNext;
122068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkFramebufferCreateFlags)0,
12218bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			*m_renderPass,										// VkRenderPass					renderPass;
12228bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,													// deUint32						attachmentCount;
12235f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			&*m_colorImageView,									// const VkImageView*			pAttachments;
12248bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			(deUint32)m_renderSize.x(),							// deUint32						width;
12258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			(deUint32)m_renderSize.y(),							// deUint32						height;
12268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u													// deUint32						layers;
12278bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
12288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
12308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
12318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12328c371469948c4b289e8c0af949026e3be894d294Peter Gal	// Create descriptors
12338c371469948c4b289e8c0af949026e3be894d294Peter Gal	{
1234da90931967434116522be552f82c8bc164a835bfPeter Gal		setupUniforms(quadGrid.getConstCoords());
12358c371469948c4b289e8c0af949026e3be894d294Peter Gal
1236da90931967434116522be552f82c8bc164a835bfPeter Gal		m_descriptorSetLayout = m_descriptorSetLayoutBuilder.build(vk, vkDevice);
1237eec2930556edeec10ef243488843b42a91dff9dbbpkowali		if (!m_uniformInfos.empty())
123868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
1239eec2930556edeec10ef243488843b42a91dff9dbbpkowali			m_descriptorPool 								= m_descriptorPoolBuilder.build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
124068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkDescriptorSetAllocateInfo	allocInfo	=
124168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			{
124268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
124368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				DE_NULL,
124468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				*m_descriptorPool,
124568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,
124668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				&m_descriptorSetLayout.get(),
124768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			};
124868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
124968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_descriptorSet = allocateDescriptorSet(vk, vkDevice, &allocInfo);
125068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		}
125168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
125268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		for (deUint32 i = 0; i < m_uniformInfos.size(); i++)
12538c371469948c4b289e8c0af949026e3be894d294Peter Gal		{
12544ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal			const UniformInfo* uniformInfo = m_uniformInfos[i].get()->get();
12554ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal			deUint32 location = uniformInfo->location;
125668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
125768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			if (uniformInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)
125868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			{
125968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const BufferUniform*	bufferInfo	= dynamic_cast<const BufferUniform*>(uniformInfo);
126068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
126168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_descriptorSetUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), uniformInfo->type, &bufferInfo->descriptor);
126268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			}
126368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			else if (uniformInfo->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
126468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			{
126568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const SamplerUniform*	samplerInfo	= dynamic_cast<const SamplerUniform*>(uniformInfo);
126668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
126768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_descriptorSetUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), uniformInfo->type, &samplerInfo->descriptor);
126868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			}
126968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			else
127068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				DE_FATAL("Impossible");
1271da90931967434116522be552f82c8bc164a835bfPeter Gal		}
12728c371469948c4b289e8c0af949026e3be894d294Peter Gal
1273da90931967434116522be552f82c8bc164a835bfPeter Gal		m_descriptorSetUpdateBuilder.update(vk, vkDevice);
12748c371469948c4b289e8c0af949026e3be894d294Peter Gal	}
12758c371469948c4b289e8c0af949026e3be894d294Peter Gal
12768bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create pipeline layout
12778bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
12780298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineLayoutCreateInfo				pipelineLayoutParams		=
12798bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
12808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
12818bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,											// const void*					pNext;
128268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineLayoutCreateFlags)0,
12838c371469948c4b289e8c0af949026e3be894d294Peter Gal			1u,													// deUint32						descriptorSetCount;
12848c371469948c4b289e8c0af949026e3be894d294Peter Gal			&*m_descriptorSetLayout,							// const VkDescriptorSetLayout*	pSetLayouts;
12858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// deUint32						pushConstantRangeCount;
12868bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
12878bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
12888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12898bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
12908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
12918bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12928bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create shaders
12938bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
1294546e25812b194adf4e7c4caa3173c3698fa8c418Peter Gal		m_vertexShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("vert"), 0);
1295546e25812b194adf4e7c4caa3173c3698fa8c418Peter Gal		m_fragmentShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("frag"), 0);
12968bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
12978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
12988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create pipeline
12998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
13000298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineShaderStageCreateInfo			shaderStageParams[2]		=
13018bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
13028bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			{
13038bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType				sType;
13048bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal				DE_NULL,													// const void*					pNext;
130568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				(VkPipelineShaderStageCreateFlags)0,
130668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStage				stage;
130768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				*m_vertexShaderModule,										// VkShader						shader;
130868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				"main",
13098bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal				DE_NULL														// const VkSpecializationInfo*	pSpecializationInfo;
13108bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			},
13118bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			{
13128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType				sType;
13138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal				DE_NULL,													// const void*					pNext;
131468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				(VkPipelineShaderStageCreateFlags)0,
131568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStage				stage;
131668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				*m_fragmentShaderModule,									// VkShader						shader;
131768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				"main",
13188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal				DE_NULL														// const VkSpecializationInfo*	pSpecializationInfo;
13198bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			}
13208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
13218bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1322c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		// Add test case specific attributes
1323c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal		if (m_attribFunc)
1324c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal			m_attribFunc(*this, quadGrid.getNumVertices());
1325107dd14dc168c363321247d56044f5037e9a51d1Peter Gal
13268e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		// Add base attributes
132723597067ccf919c019f237c49dd153d1ea502efcPeter Gal		setupDefaultInputs(quadGrid);
13288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
13290298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineVertexInputStateCreateInfo		vertexInputStateParams		=
13308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
13318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
13328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,														// const void*								pNext;
133368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineVertexInputStateCreateFlags)0,
1334c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal			(deUint32)m_vertexBindingDescription.size(),					// deUint32									bindingCount;
1335c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal			&m_vertexBindingDescription[0],									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
1336c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal			(deUint32)m_vertexattributeDescription.size(),					// deUint32									attributeCount;
1337c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal			&m_vertexattributeDescription[0],								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
13388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
13398bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
13400298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyStateParams	=
13418bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
13428bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType		sType;
13438bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,														// const void*			pNext;
134468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineInputAssemblyStateCreateFlags)0,
13458bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology	topology;
13468bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			false															// VkBool32				primitiveRestartEnable;
13478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
13488bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
13490298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkViewport								viewport					=
13505f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		{
13515f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0.0f,						// float	originX;
13525f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0.0f,						// float	originY;
13535f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			(float)m_renderSize.x(),	// float	width;
13545f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			(float)m_renderSize.y(),	// float	height;
13555f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0.0f,						// float	minDepth;
13565f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			1.0f						// float	maxDepth;
13575f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		};
13585f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal
13590298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkRect2D									scissor						=
13605f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		{
13615f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			{
13625f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				0u,					// deUint32	x;
13635f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				0u,					// deUint32	y;
13645f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			},							// VkOffset2D	offset;
13655f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			{
13665f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				m_renderSize.x(),	// deUint32	width;
13675f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				m_renderSize.y(),	// deUint32	height;
13685f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			},							// VkExtent2D	extent;
13695f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		};
13705f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal
13710298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineViewportStateCreateInfo			viewportStateParams			=
13728bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
13735f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType		sType;
13745f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			DE_NULL,														// const void*			pNext;
137568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineViewportStateCreateFlags)0,
13765f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			1u,																// deUint32				viewportCount;
13775f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			&viewport,														// const VkViewport*	pViewports;
13785f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			1u,																// deUint32				scissorsCount;
13795f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			&scissor,														// const VkRect2D*		pScissors;
13808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
13818bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
138268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkPipelineRasterizationStateCreateInfo	rasterStateParams			=
13838bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
138468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType	sType;
13858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,														// const void*		pNext;
138668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineRasterizationStateCreateFlags)0,
13878bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			false,															// VkBool32			depthClipEnable;
13888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			false,															// VkBool32			rasterizerDiscardEnable;
138968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_POLYGON_MODE_FILL,											// VkFillMode		fillMode;
13908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_CULL_MODE_NONE,												// VkCullMode		cullMode;
13911d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace		frontFace;
13925f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			false,															// VkBool32			depthBiasEnable;
13935f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0.0f,															// float			depthBias;
13945f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0.0f,															// float			depthBiasClamp;
13955f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			0.0f,															// float			slopeScaledDepthBias;
13965f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			1.0f,															// float			lineWidth;
13978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
13988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1399e148980e7f95d8a113a7dc84b13ca9906f33869fPyry Haulos		const VkPipelineMultisampleStateCreateInfo		multisampleStateParams =
14001d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus		{
14011d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
14021d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			DE_NULL,														// const void*								pNext;
14031d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			0u,																// VkPipelineMultisampleStateCreateFlags	flags;
14041d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits					rasterizationSamples;
14051d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			VK_FALSE,														// VkBool32									sampleShadingEnable;
14061d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			0.0f,															// float									minSampleShading;
14071d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			DE_NULL,														// const VkSampleMask*						pSampleMask;
14081d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			VK_FALSE,														// VkBool32									alphaToCoverageEnable;
14091d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			VK_FALSE														// VkBool32									alphaToOneEnable;
14101d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus		};
1411e148980e7f95d8a113a7dc84b13ca9906f33869fPyry Haulos
14120298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineColorBlendAttachmentState		colorBlendAttachmentState	=
14138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
141468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			false,															// VkBool32			blendEnable;
141568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BLEND_FACTOR_ONE,											// VkBlend			srcBlendColor;
141668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BLEND_FACTOR_ZERO,											// VkBlend			destBlendColor;
141768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BLEND_OP_ADD,												// VkBlendOp		blendOpColor;
141868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BLEND_FACTOR_ONE,											// VkBlend			srcBlendAlpha;
141968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BLEND_FACTOR_ZERO,											// VkBlend			destBlendAlpha;
142068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BLEND_OP_ADD,												// VkBlendOp		blendOpAlpha;
142168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VK_COLOR_COMPONENT_R_BIT |
142268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			 VK_COLOR_COMPONENT_G_BIT |
142368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			 VK_COLOR_COMPONENT_B_BIT |
142468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			 VK_COLOR_COMPONENT_A_BIT),										// VkChannelFlags	channelWriteMask;
14258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
14268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14270298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkPipelineColorBlendStateCreateInfo		colorBlendStateParams		=
14288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
14298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
14308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,													// const void*									pNext;
143168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineColorBlendStateCreateFlags)0,
14328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			false,														// VkBool32										logicOpEnable;
14338bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
14348bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,															// deUint32										attachmentCount;
14355f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
14365f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			{ 0.0f, 0.0f, 0.0f, 0.0f },									// float										blendConst[4];
14375f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		};
14385f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal
14390298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkGraphicsPipelineCreateInfo				graphicsPipelineParams		=
14408bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
14418bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
14428bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,											// const void*										pNext;
144368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,													// VkPipelineCreateFlags							flags;
14448bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			2u,													// deUint32											stageCount;
14458bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			shaderStageParams,									// const VkPipelineShaderStageCreateInfo*			pStages;
14468bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
14478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
14488bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
14498bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
14508bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&rasterStateParams,									// const VkPipelineRasterStateCreateInfo*			pRasterState;
14511d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
14528bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
14538bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
145486a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos			(const VkPipelineDynamicStateCreateInfo*)DE_NULL,	// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
14558bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			*m_pipelineLayout,									// VkPipelineLayout									layout;
14568bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			*m_renderPass,										// VkRenderPass										renderPass;
14578bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// deUint32											subpass;
14588bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,													// VkPipeline										basePipelineHandle;
14598bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u													// deInt32											basePipelineIndex;
14608bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
14618bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14628bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_graphicsPipeline = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
14638bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
14648bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14658bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create vertex indices buffer
14668bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
14670298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkDeviceSize								indiceBufferSize			= quadGrid.getNumTriangles() * 3 * sizeof(deUint16);
14680298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkBufferCreateInfo						indiceBufferParams			=
14698bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
14708bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
14718bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,									// const void*			pNext;
147268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,											// VkBufferCreateFlags	flags;
14738bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			indiceBufferSize,							// VkDeviceSize			size;
14748bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_BUFFER_USAGE_INDEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
14758bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
14768bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,											// deUint32				queueFamilyCount;
14778bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
14788bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
14798bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_indiceBuffer		= createBuffer(vk, vkDevice, &indiceBufferParams);
14810d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		m_indiceBufferAlloc	= m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_indiceBuffer), MemoryRequirement::HostVisible);
14828bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14838e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal		VK_CHECK(vk.bindBufferMemory(vkDevice, *m_indiceBuffer, m_indiceBufferAlloc->getMemory(), m_indiceBufferAlloc->getOffset()));
14848bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		// Load vertice indices into buffer
14867617e1896b93e92cce0214dfbdcd864b8cfbe144Pyry Haulos		deMemcpy(m_indiceBufferAlloc->getHostPtr(), quadGrid.getIndices(), (size_t)indiceBufferSize);
14870d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal		flushMappedMemoryRange(vk, vkDevice, m_indiceBufferAlloc->getMemory(), m_indiceBufferAlloc->getOffset(), indiceBufferSize);
14888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
14898bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
14908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create command pool
14918bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
149268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkCommandPoolCreateInfo					cmdPoolParams				=
14938bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
149468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,		// VkStructureType		sType;
149568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,										// const void*			pNext;
149668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,			// VkCmdPoolCreateFlags	flags;
149768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,								// deUint32				queueFamilyIndex;
14988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
14998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15008bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
15018bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
15028bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15038bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create command buffer
15048bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
150568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkCommandBufferAllocateInfo				cmdBufferParams				=
15068bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
150768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
150868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,										// const void*				pNext;
150968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*m_cmdPool,										// VkCmdPool				cmdPool;
151068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCmdBufferLevel			level;
151168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u												// deUint32					bufferCount;
15128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
15138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
151468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkCommandBufferBeginInfo					cmdBufferBeginInfo			=
15158bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
151668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType			sType;
151768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,										// const void*				pNext;
151868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,												// VkCmdBufferOptimizeFlags	flags;
1519689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
15208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
15218bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1522e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos		const VkClearValue								clearValues					= makeClearValueColorF32(m_clearColor.x(),
1523e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos																											 m_clearColor.y(),
1524e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos																											 m_clearColor.z(),
1525e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos																											 m_clearColor.w());
15268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15270298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkRenderPassBeginInfo						renderPassBeginInfo			=
15288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
1529e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
1530e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			DE_NULL,												// const void*			pNext;
1531e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			*m_renderPass,											// VkRenderPass			renderPass;
1532e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			*m_framebuffer,											// VkFramebuffer		framebuffer;
1533e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			{ { 0, 0 },  {m_renderSize.x(), m_renderSize.y() } },	// VkRect2D				renderArea;
1534e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			1,														// deUint32				clearValueCount;
1535e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos			&clearValues,											// const VkClearValue*	pClearValues;
15368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
15378bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
153868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferParams);
15398bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15408bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1541fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
1542e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		// Add texture barriers
1543fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		std::vector<VkImageMemoryBarrier> barriers;
1544fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
1545baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal		for(deUint32 i = 0; i < m_uniformInfos.size(); i++)
1546fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		{
1547baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal			const UniformInfo* uniformInfo = m_uniformInfos[i].get()->get();
1548baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
1549baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal			if (uniformInfo->type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
1550baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal			{
1551baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal				continue;
1552baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal			}
1553baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal
155468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const SamplerUniform*		sampler			= static_cast<const SamplerUniform*>(uniformInfo);
15553d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			const VkImageMemoryBarrier	textureBarrier	= createImageMemoryBarrier(sampler->image->get(), 0u, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
1556fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
1557fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal			barriers.push_back(textureBarrier);
1558fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal		}
1559fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
1560689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
1561689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos							  0, (const VkMemoryBarrier*)DE_NULL,
1562689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos							  0, (const VkBufferMemoryBarrier*)DE_NULL,
1563689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos							  (deUint32)barriers.size(), (barriers.empty() ? (const VkImageMemoryBarrier*)DE_NULL : &barriers[0]));
1564fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal
156568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
15668bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15678bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline);
15685dd012fb2f776e0724c1ba51f5b658883bd6fc9cJeff Bolz		if (!m_uniformInfos.empty())
15695dd012fb2f776e0724c1ba51f5b658883bd6fc9cJeff Bolz			vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0u, 1, &*m_descriptorSet, 0u, DE_NULL);
15708bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		vk.cmdBindIndexBuffer(*m_cmdBuffer, *m_indiceBuffer, 0, VK_INDEX_TYPE_UINT16);
15718bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1572ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal		const deUint32 numberOfVertexAttributes = (deUint32)m_vertexBuffers.size();
1573fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const std::vector<VkDeviceSize> offsets(numberOfVertexAttributes, 0);
1574c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal
1575fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal		std::vector<VkBuffer> buffers(numberOfVertexAttributes);
1576fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal		for (size_t i = 0; i < numberOfVertexAttributes; i++)
1577fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal		{
1578fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal			buffers[i] = m_vertexBuffers[i].get()->get();
1579fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal		}
1580fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal
1581fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal		vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, numberOfVertexAttributes, &buffers[0], &offsets[0]);
15825f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal		vk.cmdDrawIndexed(*m_cmdBuffer, quadGrid.getNumTriangles() * 3, 1, 0, 0, 0);
15838bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15848bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		vk.cmdEndRenderPass(*m_cmdBuffer);
15858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
15868bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
15878bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Create fence
15898bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
15900298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkFenceCreateInfo							fenceParams					=
15918bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
15928bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
15938bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,								// const void*			pNext;
15948bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u										// VkFenceCreateFlags	flags;
15958bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
15968bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		m_fence = createFence(vk, vkDevice, &fenceParams);
15978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
15988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
15998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Execute Draw
16008bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
160168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubmitInfo	submitInfo	=
160268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
160368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_SUBMIT_INFO,
160468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,
160568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,
160668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(const VkSemaphore*)DE_NULL,
1607689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkPipelineStageFlags*)DE_NULL,
160868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,
160968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&m_cmdBuffer.get(),
161068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,
161168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(const VkSemaphore*)DE_NULL,
161268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
161368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
16148bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
161568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
16168bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/));
16178bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
16188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
16198bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Read back the result
16208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	{
16210298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkDeviceSize								imageSizeBytes				= (VkDeviceSize)(sizeof(deUint32) * m_renderSize.x() * m_renderSize.y());
162294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		const VkBufferCreateInfo						readImageBufferParams		=
16238bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		{
16248bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		//  VkStructureType		sType;
16258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			DE_NULL,									//  const void*			pNext;
16268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			0u,											//  VkBufferCreateFlags	flags;
162768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			imageSizeBytes,								//  VkDeviceSize		size;
162868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BUFFER_USAGE_TRANSFER_DST_BIT,			//  VkBufferUsageFlags	usage;
16298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			VK_SHARING_MODE_EXCLUSIVE,					//  VkSharingMode		sharingMode;
16308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			1u,											//  deUint32			queueFamilyCount;
16318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			&queueFamilyIndex,							//  const deUint32*		pQueueFamilyIndices;
16328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		};
16330298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const Unique<VkBuffer>							readImageBuffer				(createBuffer(vk, vkDevice, &readImageBufferParams));
16340298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const de::UniquePtr<Allocation>					readImageBufferMemory		(m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
16358bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
16368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
16378bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
16388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal		// Copy image to buffer
163968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkCommandBufferAllocateInfo				cmdBufferParams				=
1640e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		{
164168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
164268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,										// const void*				pNext;
164368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*m_cmdPool,										// VkCmdPool				cmdPool;
164468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCmdBufferLevel			level;
164568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u												// deUint32					bufferCount;
1646e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		};
16478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
164868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkCommandBufferBeginInfo					cmdBufferBeginInfo			=
1649e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		{
165068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType			sType;
165168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,										// const void*				pNext;
165268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,												// VkCmdBufferOptimizeFlags	flags;
1653689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
1654e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		};
16558bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
165668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Move<VkCommandBuffer>						cmdBuffer					= allocateCommandBuffer(vk, vkDevice, &cmdBufferParams);
16578bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
16580298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const VkBufferImageCopy							copyParams					=
1659e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		{
1660e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			0u,											// VkDeviceSize			bufferOffset;
16610015a6211ba70667113c970a818e3f041e74e500Peter Gal			(deUint32)m_renderSize.x(),					// deUint32				bufferRowLength;
16620015a6211ba70667113c970a818e3f041e74e500Peter Gal			(deUint32)m_renderSize.y(),					// deUint32				bufferImageHeight;
16638bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal			{
166468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,			// VkImageAspect		aspect;
16655f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				0u,									// deUint32				mipLevel;
16665f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				0u,									// deUint32				arraySlice;
16675f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal				1u,									// deUint32				arraySize;
16685f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal			},											// VkImageSubresourceCopy	imageSubresource;
1669e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			{ 0u, 0u, 0u },								// VkOffset3D			imageOffset;
1670e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			{ m_renderSize.x(), m_renderSize.y(), 1u }	// VkExtent3D			imageExtent;
1671e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		};
167268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubmitInfo								submitInfo					=
167368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
167468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_SUBMIT_INFO,
167568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,
167668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,
167768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(const VkSemaphore*)DE_NULL,
1678689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkPipelineStageFlags*)DE_NULL,
167968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,
168068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&cmdBuffer.get(),
168168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,
168268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(const VkSemaphore*)DE_NULL,
168368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
16848bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1685e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
1686f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser
1687f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		const VkImageMemoryBarrier imageBarrier =
1688f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		{
1689f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// VkStructureType			sType;
1690f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			DE_NULL,									// const void*				pNext;
16913d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// VkAccessFlags			srcAccessMask;
1692f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_ACCESS_TRANSFER_READ_BIT,				// VkAccessFlags			dstAccessMask;
1693f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout			oldLayout;
1694f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// VkImageLayout			newLayout;
1695f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_QUEUE_FAMILY_IGNORED,					// deUint32					srcQueueFamilyIndex;
1696f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_QUEUE_FAMILY_IGNORED,					// deUint32					dstQueueFamilyIndex;
1697f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			*m_colorImage,								// VkImage					image;
1698f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			{											// VkImageSubresourceRange	subresourceRange;
1699f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser				VK_IMAGE_ASPECT_COLOR_BIT,				// VkImageAspectFlags	aspectMask;
1700f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser				0u,							// deUint32				baseMipLevel;
1701f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser				1u,							// deUint32				mipLevels;
1702f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser				0u,							// deUint32				baseArraySlice;
1703f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser				1u							// deUint32				arraySize;
1704f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			}
1705f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		};
1706f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser
1707f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		const VkBufferMemoryBarrier bufferBarrier =
1708f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		{
1709f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType	sType;
1710f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			DE_NULL,									// const void*		pNext;
1711f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_ACCESS_TRANSFER_WRITE_BIT,				// VkAccessFlags	srcAccessMask;
1712f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_ACCESS_HOST_READ_BIT,					// VkAccessFlags	dstAccessMask;
1713f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_QUEUE_FAMILY_IGNORED,					// deUint32			srcQueueFamilyIndex;
1714f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			VK_QUEUE_FAMILY_IGNORED,					// deUint32			dstQueueFamilyIndex;
1715f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			*readImageBuffer,							// VkBuffer			buffer;
1716f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			0u,											// VkDeviceSize		offset;
1717f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser			imageSizeBytes								// VkDeviceSize		size;
1718f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		};
1719f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser
1720f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
172168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdCopyImageToBuffer(*cmdBuffer, *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, &copyParams);
1722f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
1723f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser
1724e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
17258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1726e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
172768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
1728e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
17298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
1730220bdc217a3c721edd01df7172366fbbfcf334b1Peter Gal		invalidateMappedMemoryRange(vk, vkDevice, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset(), imageSizeBytes);
17318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal
17320298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const tcu::TextureFormat						resultFormat				(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
17330298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal		const tcu::ConstPixelBufferAccess				resultAccess				(resultFormat, m_renderSize.x(), m_renderSize.y(), 1, readImageBufferMemory->getHostPtr());
1734ee06c6e532c43240a33f7f75e4762af6e179421aPeter Gal
1735ee06c6e532c43240a33f7f75e4762af6e179421aPeter Gal		tcu::copy(result.getAccess(), resultAccess);
17368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	}
1737e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
1738e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1739e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::computeVertexReference (tcu::Surface& result, const QuadGrid& quadGrid)
1740e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
1741e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Buffer info.
1742fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int				width		= result.getWidth();
1743fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int				height		= result.getHeight();
1744fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int				gridSize	= quadGrid.getGridSize();
1745fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int				stride		= gridSize + 1;
1746fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const bool				hasAlpha	= true; // \todo [2015-09-07 elecro] add correct alpha check
1747e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	ShaderEvalContext		evalCtx		(quadGrid);
1748e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1749e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Evaluate color for each vertex.
1750e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal	std::vector<tcu::Vec4>	colors		((gridSize + 1) * (gridSize + 1));
1751e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	for (int y = 0; y < gridSize+1; y++)
1752e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	for (int x = 0; x < gridSize+1; x++)
1753e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	{
1754fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float	sx			= (float)x / (float)gridSize;
1755fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float	sy			= (float)y / (float)gridSize;
1756fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int	vtxNdx		= ((y * (gridSize+1)) + x);
1757e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1758e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		evalCtx.reset(sx, sy);
1759e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		m_evaluator.evaluate(evalCtx);
1760e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		DE_ASSERT(!evalCtx.isDiscarded); // Discard is not available in vertex shader.
1761e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		tcu::Vec4 color = evalCtx.color;
1762e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1763e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		if (!hasAlpha)
1764e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal			color.w() = 1.0f;
1765e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1766e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		colors[vtxNdx] = color;
1767e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	}
1768e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1769e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Render quads.
1770e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	for (int y = 0; y < gridSize; y++)
1771e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	for (int x = 0; x < gridSize; x++)
1772e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	{
1773fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		x0		= (float)x       / (float)gridSize;
1774fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		x1		= (float)(x + 1) / (float)gridSize;
1775fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		y0		= (float)y       / (float)gridSize;
1776fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		y1		= (float)(y + 1) / (float)gridSize;
1777fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal
1778fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		sx0		= x0 * (float)width;
1779fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		sx1		= x1 * (float)width;
1780fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		sy0		= y0 * (float)height;
1781fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		sy1		= y1 * (float)height;
1782fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		oosx	= 1.0f / (sx1 - sx0);
1783fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float		oosy	= 1.0f / (sy1 - sy0);
1784fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal
1785fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		ix0		= deCeilFloatToInt32(sx0 - 0.5f);
1786fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		ix1		= deCeilFloatToInt32(sx1 - 0.5f);
1787fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		iy0		= deCeilFloatToInt32(sy0 - 0.5f);
1788fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		iy1		= deCeilFloatToInt32(sy1 - 0.5f);
1789fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal
1790fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		v00		= (y * stride) + x;
1791fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		v01		= (y * stride) + x + 1;
1792fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		v10		= ((y + 1) * stride) + x;
1793fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const int		v11		= ((y + 1) * stride) + x + 1;
1794fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const tcu::Vec4	c00		= colors[v00];
1795fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const tcu::Vec4	c01		= colors[v01];
1796fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const tcu::Vec4	c10		= colors[v10];
1797fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const tcu::Vec4	c11		= colors[v11];
1798e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1799e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		//printf("(%d,%d) -> (%f..%f, %f..%f) (%d..%d, %d..%d)\n", x, y, sx0, sx1, sy0, sy1, ix0, ix1, iy0, iy1);
1800e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1801e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		for (int iy = iy0; iy < iy1; iy++)
1802e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		for (int ix = ix0; ix < ix1; ix++)
1803e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		{
1804e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal			DE_ASSERT(deInBounds32(ix, 0, width));
1805e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal			DE_ASSERT(deInBounds32(iy, 0, height));
1806e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1807fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const float			sfx		= (float)ix + 0.5f;
1808fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const float			sfy		= (float)iy + 0.5f;
1809fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const float			fx1		= deFloatClamp((sfx - sx0) * oosx, 0.0f, 1.0f);
1810fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const float			fy1		= deFloatClamp((sfy - sy0) * oosy, 0.0f, 1.0f);
1811e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1812e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal			// Triangle quad interpolation.
1813fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const bool			tri		= fx1 + fy1 <= 1.0f;
1814fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const float			tx		= tri ? fx1 : (1.0f-fx1);
1815fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const float			ty		= tri ? fy1 : (1.0f-fy1);
1816e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			const tcu::Vec4&	t0		= tri ? c00 : c11;
1817e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			const tcu::Vec4&	t1		= tri ? c01 : c10;
1818e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal			const tcu::Vec4&	t2		= tri ? c10 : c01;
1819fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal			const tcu::Vec4		color	= t0 + (t1-t0)*tx + (t2-t0)*ty;
1820e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1821e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal			result.setPixel(ix, iy, tcu::RGBA(color));
1822e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		}
1823e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	}
1824e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
1825e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1826e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::computeFragmentReference (tcu::Surface& result, const QuadGrid& quadGrid)
1827e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
18288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal	// Buffer info.
1829fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int			width		= result.getWidth();
1830fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const int			height		= result.getHeight();
1831fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const bool			hasAlpha	= true;  // \todo [2015-09-07 elecro] add correct alpha check
1832e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	ShaderEvalContext	evalCtx		(quadGrid);
1833e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1834e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	// Render.
1835e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	for (int y = 0; y < height; y++)
1836e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	for (int x = 0; x < width; x++)
1837e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	{
1838fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float sx = ((float)x + 0.5f) / (float)width;
1839fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal		const float sy = ((float)y + 0.5f) / (float)height;
1840e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1841e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		evalCtx.reset(sx, sy);
1842e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		m_evaluator.evaluate(evalCtx);
1843e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		// Select either clear color or computed color based on discarded bit.
1844e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal		tcu::Vec4 color = evalCtx.isDiscarded ? m_clearColor : evalCtx.color;
1845e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1846e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		if (!hasAlpha)
1847e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal			color.w() = 1.0f;
1848e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1849e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal		result.setPixel(x, y, tcu::RGBA(color));
1850e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	}
1851e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
1852e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1853e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galbool ShaderRenderCaseInstance::compareImages (const tcu::Surface& resImage, const tcu::Surface& refImage, float errorThreshold)
1854e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{
1855e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal	return tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ComparisonResult", "Image comparison result", refImage, resImage, errorThreshold, tcu::COMPARE_LOG_RESULT);
1856e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal}
1857e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal
1858c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal} // sr
1859f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} // vkt
1860