134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos/*-------------------------------------------------------------------------
234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * Vulkan Conformance Tests
334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * ------------------------
434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *
534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * Copyright (c) 2015 Google Inc.
634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *
7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
1034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
1834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *
1934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *//*!
2034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * \file
2134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * \brief Simple Smoke Tests
2234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *//*--------------------------------------------------------------------*/
2334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
2434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vktApiTests.hpp"
2534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
2634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vktTestCaseUtil.hpp"
2734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
2834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkDefs.hpp"
2934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkPlatform.hpp"
3034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkStrUtil.hpp"
3134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkRef.hpp"
3234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkRefUtil.hpp"
3334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkQueryUtil.hpp"
3434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkMemUtil.hpp"
3534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkDeviceUtil.hpp"
3634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkPrograms.hpp"
370ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos#include "vkTypeUtil.hpp"
384ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "vkImageUtil.hpp"
3934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
4034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "tcuTestLog.hpp"
4134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "tcuFormatUtil.hpp"
424ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "tcuTextureUtil.hpp"
434ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "tcuImageCompare.hpp"
444ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
454ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "rrRenderer.hpp"
4634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
4734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "deUniquePtr.hpp"
4834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
4934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosnamespace vkt
5034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
5134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosnamespace api
5234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
5334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
5434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosnamespace
5534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
5634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
5734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing namespace vk;
5834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing std::vector;
5934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing tcu::TestLog;
6034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing de::UniquePtr;
6134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
6234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus createSamplerTest (Context& context)
6334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
6434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkDevice			vkDevice	= context.getDevice();
6534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const DeviceInterface&	vk			= context.getDeviceInterface();
6634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
6734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
6834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const struct VkSamplerCreateInfo		samplerInfo	=
6934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
7068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,		// sType
7168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
7268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,											// flags
7368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_FILTER_NEAREST,							// magFilter
7468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_FILTER_NEAREST,							// minFilter
75689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			VK_SAMPLER_MIPMAP_MODE_NEAREST,				// mipmapMode
7668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		// addressModeU
7768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		// addressModeV
7868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		// addressModeW
7968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0.0f,										// mipLodBias
80689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			VK_FALSE,									// anisotropyEnable
810aeee78a8c5276964d855b097b91059daa3fd79aPyry Haulos			1.0f,										// maxAnisotropy
8268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_FALSE,									// compareEnable
8368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPARE_OP_ALWAYS,						// compareOp
8468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0.0f,										// minLod
8568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0.0f,										// maxLod
8668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,	// borderColor
8768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_FALSE,									// unnormalizedCoords
8834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
8934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
9034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		Move<VkSampler>			tmpSampler	= createSampler(vk, vkDevice, &samplerInfo);
9134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		Move<VkSampler>			tmp2Sampler;
9234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
9334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tmp2Sampler = tmpSampler;
9434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
9534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const Unique<VkSampler>	sampler		(tmp2Sampler);
9634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
9734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
9834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	return tcu::TestStatus::pass("Creating sampler succeeded");
9934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
10034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
1017485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid createShaderProgs (SourceCollections& dst)
10234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
1037485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn	dst.glslSources.add("test") << glu::VertexSource(
104fd7944ef801e5be2e9883c4acc6c9d826574e743Csaba Osztrogonác		"#version 310 es\n"
10504e0b933ea3c81ffd6964aecc2e295d7207c876aSlawomir Cygan		"layout(location = 0) in highp vec4 a_position;\n"
10634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		"void main (void) { gl_Position = a_position; }\n");
10734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
10834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
10934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus createShaderModuleTest (Context& context)
11034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
11134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkDevice					vkDevice	= context.getDevice();
11234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const DeviceInterface&			vk			= context.getDeviceInterface();
11334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkShaderModule>	shader		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("test"), 0));
11434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
11534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	return tcu::TestStatus::pass("Creating shader module succeeded");
11634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
11734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
1187485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid createTriangleAsmProgs (SourceCollections& dst)
11934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
1207485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn	dst.spirvAsmSources.add("vert") <<
1217485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpCapability Shader\n"
1227485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%1 =	 OpExtInstImport \"GLSL.std.450\"\n"
1237485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpMemoryModel Logical GLSL450\n"
12421c0fb00ba42f8077fe62868301cf0be711d8147Lei Zhang		"		 OpEntryPoint Vertex %4 \"main\" %10 %12 %16 %17\n"
1258e061635437aa8a4d572a585d400378eb43fcfbeDae Kim		"		 OpSource ESSL 300\n"
1267485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpName %4 \"main\"\n"
1277485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpName %10 \"gl_Position\"\n"
1287485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpName %12 \"a_position\"\n"
129a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn		"		 OpName %16 \"gl_VertexIndex\"\n"
130a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn		"		 OpName %17 \"gl_InstanceIndex\"\n"
1317485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpDecorate %10 BuiltIn Position\n"
1327485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpDecorate %12 Location 0\n"
133a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn		"		 OpDecorate %16 BuiltIn VertexIndex\n"
134a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn		"		 OpDecorate %17 BuiltIn InstanceIndex\n"
1357485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%2 =	 OpTypeVoid\n"
1367485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%3 =	 OpTypeFunction %2\n"
1377485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%7 =	 OpTypeFloat 32\n"
1387485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%8 =	 OpTypeVector %7 4\n"
1397485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%9 =	 OpTypePointer Output %8\n"
1407485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%10 =	 OpVariable %9 Output\n"
1417485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%11 =	 OpTypePointer Input %8\n"
1427485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%12 =	 OpVariable %11 Input\n"
1437485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%14 =	 OpTypeInt 32 1\n"
1447485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%15 =	 OpTypePointer Input %14\n"
1457485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%16 =	 OpVariable %15 Input\n"
1467485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%17 =	 OpVariable %15 Input\n"
1477485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%4 =	 OpFunction %2 None %3\n"
1487485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%5 =	 OpLabel\n"
1497485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%13 =	 OpLoad %8 %12\n"
1507485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpStore %10 %13\n"
1517485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpBranch %6\n"
1527485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%6 =	 OpLabel\n"
1537485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpReturn\n"
1547485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		 OpFunctionEnd\n";
1557485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn	dst.spirvAsmSources.add("frag") <<
1567485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpCapability Shader\n"
1577485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%1 =	OpExtInstImport \"GLSL.std.450\"\n"
1587485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpMemoryModel Logical GLSL450\n"
15921c0fb00ba42f8077fe62868301cf0be711d8147Lei Zhang		"		OpEntryPoint Fragment %4 \"main\" %10\n"
1607485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpExecutionMode %4 OriginLowerLeft\n"
1618e061635437aa8a4d572a585d400378eb43fcfbeDae Kim		"		OpSource ESSL 300\n"
1627485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpName %4 \"main\"\n"
1637485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpName %10 \"o_color\"\n"
1647485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpDecorate %10 RelaxedPrecision\n"
1657485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpDecorate %10 Location 0\n"
1667485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%2 =	OpTypeVoid\n"
1677485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%3 =	OpTypeFunction %2\n"
1687485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%7 =	OpTypeFloat 32\n"
1697485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%8 =	OpTypeVector %7 4\n"
1707485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%9 =	OpTypePointer Output %8\n"
1717485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%10 =	OpVariable %9 Output\n"
1727485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%11 =	OpConstant %7 1065353216\n"
1737485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%12 =	OpConstant %7 0\n"
1747485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%13 =	OpConstantComposite %8 %11 %12 %11 %11\n"
1757485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%4 =	OpFunction %2 None %3\n"
1767485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%5 =	OpLabel\n"
1777485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpStore %10 %13\n"
1787485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpBranch %6\n"
1797485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"%6 =	OpLabel\n"
1807485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpReturn\n"
1817485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn		"		OpFunctionEnd\n";
1827485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn}
1837485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn
1847485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid createTriangleProgs (SourceCollections& dst)
1857485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn{
1867485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn	dst.glslSources.add("vert") << glu::VertexSource(
187fd7944ef801e5be2e9883c4acc6c9d826574e743Csaba Osztrogonác		"#version 310 es\n"
18834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		"layout(location = 0) in highp vec4 a_position;\n"
18934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		"void main (void) { gl_Position = a_position; }\n");
1907485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn	dst.glslSources.add("frag") << glu::FragmentSource(
191fd7944ef801e5be2e9883c4acc6c9d826574e743Csaba Osztrogonác		"#version 310 es\n"
19234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		"layout(location = 0) out lowp vec4 o_color;\n"
19334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		"void main (void) { o_color = vec4(1.0, 0.0, 1.0, 1.0); }\n");
19434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
19534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
1961d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulosvoid createProgsNoOpName (SourceCollections& dst)
1971d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos{
1981d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos	dst.spirvAsmSources.add("vert") <<
1991d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpCapability Shader\n"
2001d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%1 = OpExtInstImport \"GLSL.std.450\"\n"
2011d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpMemoryModel Logical GLSL450\n"
2021d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpEntryPoint Vertex %4 \"main\" %20 %22 %26\n"
2031d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpSource ESSL 310\n"
2041d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpMemberDecorate %18 0 BuiltIn Position\n"
2051d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpMemberDecorate %18 1 BuiltIn PointSize\n"
2061d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpDecorate %18 Block\n"
2071d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpDecorate %22 Location 0\n"
2081d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpDecorate %26 Location 2\n"
2091d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%2 = OpTypeVoid\n"
2101d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%3 = OpTypeFunction %2\n"
2111d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%6 = OpTypeFloat 32\n"
2121d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%7 = OpTypeVector %6 4\n"
2131d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%8 = OpTypeStruct %7\n"
2141d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%9 = OpTypePointer Function %8\n"
2151d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%11 = OpTypeInt 32 1\n"
2161d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%12 = OpConstant %11 0\n"
2171d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%13 = OpConstant %6 1\n"
2181d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%14 = OpConstant %6 0\n"
2191d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%15 = OpConstantComposite %7 %13 %14 %13 %13\n"
2201d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%16 = OpTypePointer Function %7\n"
2211d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%18 = OpTypeStruct %7 %6\n"
2221d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%19 = OpTypePointer Output %18\n"
2231d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%20 = OpVariable %19 Output\n"
2241d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%21 = OpTypePointer Input %7\n"
2251d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%22 = OpVariable %21 Input\n"
2261d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%24 = OpTypePointer Output %7\n"
2271d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%26 = OpVariable %24 Output\n"
2281d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%4 = OpFunction %2 None %3\n"
2291d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%5 = OpLabel\n"
2301d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%10 = OpVariable %9 Function\n"
2311d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%17 = OpAccessChain %16 %10 %12\n"
2321d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpStore %17 %15\n"
2331d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%23 = OpLoad %7 %22\n"
2341d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%25 = OpAccessChain %24 %20 %12\n"
2351d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpStore %25 %23\n"
2361d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%27 = OpAccessChain %16 %10 %12\n"
2371d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%28 = OpLoad %7 %27\n"
2381d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpStore %26 %28\n"
2391d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpReturn\n"
2401d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpFunctionEnd\n";
2411d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos	dst.spirvAsmSources.add("frag") <<
2421d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpCapability Shader\n"
2431d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%1 = OpExtInstImport \"GLSL.std.450\"\n"
2441d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpMemoryModel Logical GLSL450\n"
2451d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpEntryPoint Fragment %4 \"main\" %9 %11\n"
2461d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpExecutionMode %4 OriginUpperLeft\n"
2471d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpSource ESSL 310\n"
2481d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpDecorate %9 RelaxedPrecision\n"
2491d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpDecorate %9 Location 0\n"
2501d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpDecorate %11 Location 2\n"
2511d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%2 = OpTypeVoid\n"
2521d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%3 = OpTypeFunction %2\n"
2531d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%6 = OpTypeFloat 32\n"
2541d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%7 = OpTypeVector %6 4\n"
2551d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%8 = OpTypePointer Output %7\n"
2561d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%9 = OpVariable %8 Output\n"
2571d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%10 = OpTypePointer Input %7\n"
2581d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%11 = OpVariable %10 Input\n"
2591d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%4 = OpFunction %2 None %3\n"
2601d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%5 = OpLabel\n"
2611d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"%12 = OpLoad %7 %11\n"
2621d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpStore %9 %12\n"
2631d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpReturn\n"
2641d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos		"OpFunctionEnd\n";
2651d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos}
2661d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos
2674ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosclass RefVertexShader : public rr::VertexShader
2684ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{
2694ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulospublic:
2704ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	RefVertexShader (void)
2714ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		: rr::VertexShader(1, 0)
2724ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2734ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		m_inputs[0].type = rr::GENERICVECTYPE_FLOAT;
2744ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2754ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2764ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const
2774ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2784ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
2794ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		{
2804ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			packets[packetNdx]->position = rr::readVertexAttribFloat(inputs[0],
2814ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																	 packets[packetNdx]->instanceNdx,
2824ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																	 packets[packetNdx]->vertexNdx);
2834ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		}
2844ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2854ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos};
2864ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2874ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosclass RefFragmentShader : public rr::FragmentShader
2884ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{
2894ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulospublic:
2904ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	RefFragmentShader (void)
2914ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		: rr::FragmentShader(0, 1)
2924ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2934ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		m_outputs[0].type = rr::GENERICVECTYPE_FLOAT;
2944ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2954ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2964ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	void shadeFragments (rr::FragmentPacket*, const int numPackets, const rr::FragmentShadingContext& context) const
2974ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2984ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
2994ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		{
3004ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			for (int fragNdx = 0; fragNdx < rr::NUM_FRAGMENTS_PER_PACKET; ++fragNdx)
3014ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			{
3024ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos				rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f));
3034ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			}
3044ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		}
3054ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
3064ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos};
3074ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
3084ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosvoid renderReferenceTriangle (const tcu::PixelBufferAccess& dst, const tcu::Vec4 (&vertices)[3])
3094ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{
3104ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const RefVertexShader					vertShader;
3114ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const RefFragmentShader					fragShader;
3124ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::Program						program			(&vertShader, &fragShader);
3134ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::MultisamplePixelBufferAccess	colorBuffer		= rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(dst);
3144ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::RenderTarget					renderTarget	(colorBuffer);
315417115b2676c3064a06385184573b6d7a0644f42David Sodman	const rr::RenderState					renderState		((rr::ViewportState(colorBuffer)), rr::VIEWPORTORIENTATION_UPPER_LEFT);
3164ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::Renderer						renderer;
3174ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::VertexAttrib					vertexAttribs[]	=
3184ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
3194ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, sizeof(tcu::Vec4), 0, vertices[0].getPtr())
3204ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	};
3214ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
3224ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	renderer.draw(rr::DrawCommand(renderState,
3234ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  renderTarget,
3244ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  program,
3254ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  DE_LENGTH_OF_ARRAY(vertexAttribs),
3264ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  &vertexAttribs[0],
3274ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  rr::PrimitiveList(rr::PRIMITIVETYPE_TRIANGLES, DE_LENGTH_OF_ARRAY(vertices), 0)));
3284ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos}
3294ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
33034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus renderTriangleTest (Context& context)
33134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
33234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkDevice							vkDevice				= context.getDevice();
33334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const DeviceInterface&					vk						= context.getDeviceInterface();
33434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkQueue							queue					= context.getUniversalQueue();
33534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
33634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	SimpleAllocator							memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
33734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const tcu::IVec2						renderSize				(256, 256);
3384ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const VkFormat							colorFormat				= VK_FORMAT_R8G8B8A8_UNORM;
3394ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const tcu::Vec4							clearColor				(0.125f, 0.25f, 0.75f, 1.0f);
34034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
34134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const tcu::Vec4							vertices[]				=
34234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
34334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
34434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
34534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
34634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
34734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
34834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkBufferCreateInfo				vertexBufferParams		=
34934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
35068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// sType
35168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,								// pNext
35268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,										// flags
35368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkDeviceSize)sizeof(vertices),			// size
35468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,		// usage
35568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SHARING_MODE_EXCLUSIVE,				// sharingMode
35668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,										// queueFamilyIndexCount
35768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&queueFamilyIndex,						// pQueueFamilyIndices
35834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
35934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkBuffer>					vertexBuffer			(createBuffer(vk, vkDevice, &vertexBufferParams));
36034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const UniquePtr<Allocation>				vertexBufferMemory		(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible));
36134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
36234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
36334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
36434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkDeviceSize						imageSizeBytes			= (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y());
36534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkBufferCreateInfo				readImageBufferParams	=
36634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
36768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// sType
36868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,									// pNext
36968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkBufferCreateFlags)0u,					// flags
37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		imageSizeBytes,								// size
37168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BUFFER_USAGE_TRANSFER_DST_BIT,			// usage
37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SHARING_MODE_EXCLUSIVE,					// sharingMode
37368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,											// queueFamilyIndexCount
37468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&queueFamilyIndex,							// pQueueFamilyIndices
37534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
37634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkBuffer>					readImageBuffer			(createBuffer(vk, vkDevice, &readImageBufferParams));
37734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const UniquePtr<Allocation>				readImageBufferMemory	(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
37834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
37934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
38034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
38134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkImageCreateInfo					imageParams				=
38234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
38368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,									// sType
38468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,																// pNext
38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,																		// flags
38668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_TYPE_2D,														// imageType
38768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,												// format
388689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		{ (deUint32)renderSize.x(), (deUint32)renderSize.y(), 1 },				// extent
38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,																		// mipLevels
39068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,																		// arraySize
39168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,													// samples
39268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_TILING_OPTIMAL,												// tiling
39368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT,	// usage
39468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SHARING_MODE_EXCLUSIVE,												// sharingMode
39568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,																		// queueFamilyIndexCount
39668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&queueFamilyIndex,														// pQueueFamilyIndices
39768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_UNDEFINED,												// initialLayout
39834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
39934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
40034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkImage>					image					(createImage(vk, vkDevice, &imageParams));
40134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const UniquePtr<Allocation>				imageMemory				(memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any));
40234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
40334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset()));
40434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
40534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkAttachmentDescription			colorAttDesc			=
40634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
40768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// flags
40868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,						// format
40968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,							// samples
41068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_LOAD_OP_CLEAR,					// loadOp
41168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_STORE_OP_STORE,					// storeOp
41268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_LOAD_OP_DONT_CARE,				// stencilLoadOp
41368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_STORE_OP_DONT_CARE,				// stencilStoreOp
41468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// initialLayout
41568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// finalLayout
41634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
41734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkAttachmentReference				colorAttRef				=
41834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
41968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// attachment
42068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// layout
42134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
42234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkSubpassDescription				subpassDesc				=
42334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
42468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkSubpassDescriptionFlags)0u,					// flags
42568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_PIPELINE_BIND_POINT_GRAPHICS,				// pipelineBindPoint
42668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// inputAttachmentCount
42768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pInputAttachments
42868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// colorAttachmentCount
42968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&colorAttRef,									// pColorAttachments
43068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pResolveAttachments
43168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// depthStencilAttachment
43268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// preserveAttachmentCount
43368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pPreserveAttachments
43434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
43534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkRenderPassCreateInfo			renderPassParams		=
43634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
43768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,		// sType
43868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pNext
43968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// flags
44068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// attachmentCount
44168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&colorAttDesc,									// pAttachments
44268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// subpassCount
44368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&subpassDesc,									// pSubpasses
44468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// dependencyCount
44568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pDependencies
44634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
44734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkRenderPass>				renderPass				(createRenderPass(vk, vkDevice, &renderPassParams));
44834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
4493d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkImageViewCreateInfo				colorAttViewParams		=
45034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
45168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// sType
45268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pNext
45368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// flags
45468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*image,											// image
45568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_VIEW_TYPE_2D,							// viewType
45668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,						// format
4573d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
45868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_R,
45968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_G,
46068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_B,
46168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_A
46268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},												// components
4633d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
46468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_ASPECT_COLOR_BIT,						// aspectMask
46568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,												// baseMipLevel
46668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,												// levelCount
46768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,												// baseArrayLayer
46868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,												// layerCount
46968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},												// subresourceRange
47034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
4713d2071b82061ee418aa87064333069281133eddaPyry Haulos	const Unique<VkImageView>				colorAttView			(createImageView(vk, vkDevice, &colorAttViewParams));
47234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
47334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Pipeline layout
47434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineLayoutCreateInfo		pipelineLayoutParams	=
47534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
47668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,			// sType
47768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
47868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(vk::VkPipelineLayoutCreateFlags)0,
47968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// setLayoutCount
48068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pSetLayouts
48168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// pushConstantRangeCount
48268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pPushConstantRanges
48334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
48434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkPipelineLayout>			pipelineLayout			(createPipelineLayout(vk, vkDevice, &pipelineLayoutParams));
48534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
48668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	// Shaders
48768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkShaderModule>			vertShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0));
48868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkShaderModule>			fragShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0));
48968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
49034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Pipeline
49134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkSpecializationInfo				emptyShaderSpecParams	=
49234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
49368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// mapEntryCount
49468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pMap
49568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0,														// dataSize
49668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pData
49734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
49834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineShaderStageCreateInfo	shaderStageParams[]	=
49934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
50034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
50168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
50268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,												// pNext
50368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,														// flags
50468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,								// stage
50568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*vertShaderModule,										// module
50668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",													// pName
50768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&emptyShaderSpecParams,									// pSpecializationInfo
50834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		},
50934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
51068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
51168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,												// pNext
51268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,														// flags
51368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
51468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*fragShaderModule,										// module
51568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",													// pName
51668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&emptyShaderSpecParams,									// pSpecializationInfo
51734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		}
51834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
51934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineDepthStencilStateCreateInfo	depthStencilParams		=
52034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
52168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
52268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
52368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
52468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// depthTestEnable
52568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// depthWriteEnable
52668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
52768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// depthBoundsTestEnable
52868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// stencilTestEnable
52934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// failOp
53168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// passOp
53268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// depthFailOp
53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPARE_OP_ALWAYS,										// compareOp
53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// compareMask
53568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// writeMask
53668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// reference
53768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// front
53834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
53968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// failOp
54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// passOp
54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// depthFailOp
54268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPARE_OP_ALWAYS,										// compareOp
54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// compareMask
54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// writeMask
54568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// reference
54668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// back;
5473d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		0.0f,														//	float				minDepthBounds;
5483d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		1.0f,														//	float				maxDepthBounds;
5493d2071b82061ee418aa87064333069281133eddaPyry Haulos	};
5503d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkViewport						viewport0				=
5513d2071b82061ee418aa87064333069281133eddaPyry Haulos	{
55268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// x
55368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// y
55468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(float)renderSize.x(),										// width
55568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(float)renderSize.y(),										// height
55668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// minDepth
55768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1.0f,														// maxDepth
5583d2071b82061ee418aa87064333069281133eddaPyry Haulos	};
5593d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkRect2D							scissor0				=
5603d2071b82061ee418aa87064333069281133eddaPyry Haulos	{
5613d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
56268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// x
56368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// y
56468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// offset
5653d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
566689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)renderSize.x(),									// width
567689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)renderSize.y(),									// height
56868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// extent;
56934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
57034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineViewportStateCreateInfo		viewportParams			=
57134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
57268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,		// sType
57368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
57468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
57568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// viewportCount
57668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&viewport0,													// pViewports
57768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// scissorCount
57868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&scissor0													// pScissors
57934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
5803d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkSampleMask							sampleMask				= ~0u;
58134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineMultisampleStateCreateInfo	multisampleParams		=
58234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
58368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// sType
58468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
58568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
58668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,										// rasterizationSamples
58768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// sampleShadingEnable
58868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// minSampleShading
58968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&sampleMask,												// sampleMask
59068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// alphaToCoverageEnable
59168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// alphaToOneEnable
59268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	};
59368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkPipelineRasterizationStateCreateInfo	rasterParams		=
59468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	{
59568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,	// sType
59668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
59768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
5986140c85a76b7866db94aaf77bcd5dca80490e19bJorg Wagner		VK_FALSE,													// depthClampEnable
59968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// rasterizerDiscardEnable
60068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_POLYGON_MODE_FILL,										// polygonMode
60168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_CULL_MODE_NONE,											// cullMode
60268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FRONT_FACE_COUNTER_CLOCKWISE,							// frontFace
60368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// depthBiasEnable
60468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// depthBiasConstantFactor
60568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// depthBiasClamp
60668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// depthBiasSlopeFactor
60768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1.0f,														// lineWidth
60834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
60934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyParams	=
61034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
61168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
61268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,														// pNext
61368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,																// flags
61468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
61568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,														// primitiveRestartEnable
61634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
61734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkVertexInputBindingDescription		vertexBinding0			=
61834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
61968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// binding
62068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)sizeof(tcu::Vec4),							// stride
62168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_VERTEX_INPUT_RATE_VERTEX,							// inputRate
62234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
62334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkVertexInputAttributeDescription		vertexAttrib0			=
62434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
62568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// location
62668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// binding
62768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT,							// format
62868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// offset
62934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
63034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineVertexInputStateCreateInfo	vertexInputStateParams	=
63134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
63268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	// sType
63368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
63468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
63568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// vertexBindingDescriptionCount
63668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&vertexBinding0,											// pVertexBindingDescriptions
63768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// vertexAttributeDescriptionCount
63868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&vertexAttrib0,												// pVertexAttributeDescriptions
63934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
64034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineColorBlendAttachmentState	attBlendParams			=
64134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
64268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// blendEnable
64368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ONE,										// srcColorBlendFactor
64468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ZERO,										// dstColorBlendFactor
64568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_OP_ADD,											// colorBlendOp
64668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ONE,										// srcAlphaBlendFactor
64768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ZERO,										// dstAlphaBlendFactor
64868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_OP_ADD,											// alphaBlendOp
64968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VK_COLOR_COMPONENT_R_BIT|
65068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		 VK_COLOR_COMPONENT_G_BIT|
65168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		 VK_COLOR_COMPONENT_B_BIT|
65268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		 VK_COLOR_COMPONENT_A_BIT),									// colorWriteMask
65334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
65434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineColorBlendStateCreateInfo	blendParams				=
65534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
65668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// sType
65768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
65868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
65968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// logicOpEnable
66068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_LOGIC_OP_COPY,											// logicOp
66168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// attachmentCount
66268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&attBlendParams,											// pAttachments
66368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{ 0.0f, 0.0f, 0.0f, 0.0f },									// blendConstants[4]
6643d2071b82061ee418aa87064333069281133eddaPyry Haulos	};
66534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkGraphicsPipelineCreateInfo		pipelineParams			=
66634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
66768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,		// sType
66868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
66968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// flags
67068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams),		// stageCount
67168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		shaderStageParams,										// pStages
67268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&vertexInputStateParams,								// pVertexInputState
67368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&inputAssemblyParams,									// pInputAssemblyState
67468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pTessellationState
67568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&viewportParams,										// pViewportState
67668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&rasterParams,											// pRasterizationState
67768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&multisampleParams,										// pMultisampleState
67868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&depthStencilParams,									// pDepthStencilState
67968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&blendParams,											// pColorBlendState
68086a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos		(const VkPipelineDynamicStateCreateInfo*)DE_NULL,		// pDynamicState
68168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*pipelineLayout,										// layout
68268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*renderPass,											// renderPass
68368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// subpass
68468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// basePipelineHandle
68568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// basePipelineIndex
68634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
68734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
68834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkPipeline>				pipeline				(createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams));
68934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
69034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Framebuffer
69134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkFramebufferCreateInfo			framebufferParams		=
69234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
69368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,				// sType
69468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
69568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// flags
69668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*renderPass,											// renderPass
69768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,														// attachmentCount
69868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&*colorAttView,											// pAttachments
69968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)renderSize.x(),								// width
70068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)renderSize.y(),								// height
70168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,														// layers
70234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
7033d2071b82061ee418aa87064333069281133eddaPyry Haulos	const Unique<VkFramebuffer>				framebuffer				(createFramebuffer(vk, vkDevice, &framebufferParams));
70434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
70568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandPoolCreateInfo			cmdPoolParams			=
70634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
70768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType
70868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
70968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags
71068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		queueFamilyIndex,											// queueFamilyIndex
71134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
71268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
71334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
71434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Command buffer
71568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandBufferAllocateInfo		cmdBufParams			=
71634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
71768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,			// sType
71868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
71968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*cmdPool,												// pool
72068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMMAND_BUFFER_LEVEL_PRIMARY,						// level
72168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,														// bufferCount
72234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
72368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkCommandBuffer>			cmdBuf					(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
72434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
72568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandBufferBeginInfo			cmdBufBeginParams		=
72634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
72768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// sType
72868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
72968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// flags
730689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkCommandBufferInheritanceInfo*)DE_NULL,
73134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
73234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
73334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Record commands
73434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams));
73534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
73634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
73734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkMemoryBarrier		vertFlushBarrier	=
73834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
73968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_MEMORY_BARRIER,			// sType
74068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
74168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_HOST_WRITE_BIT,					// srcAccessMask
74268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,		// dstAccessMask
74334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
74434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkImageMemoryBarrier	colorAttBarrier		=
74534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
74668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
74768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
74868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,											// srcAccessMask
74968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VK_ACCESS_COLOR_ATTACHMENT_READ_BIT|
75068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT),		// dstAccessMask
75168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_UNDEFINED,					// oldLayout
75268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// newLayout
75368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// srcQueueFamilyIndex
75468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// dstQueueFamilyIndex
75568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*image,										// image
75634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos			{
75768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
75868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseMipLevel
75968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// levelCount
76068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseArrayLayer
76168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// layerCount
76268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			}											// subresourceRange
76334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
764689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, (VkDependencyFlags)0, 1, &vertFlushBarrier, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &colorAttBarrier);
76534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
76634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
76734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
7684ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const VkClearValue			clearValue		= makeClearValueColorF32(clearColor[0],
7694ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																			 clearColor[1],
7704ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																			 clearColor[2],
7714ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																			 clearColor[3]);
77234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkRenderPassBeginInfo	passBeginParams	=
77334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
77468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,			// sType
77568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,											// pNext
77668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*renderPass,										// renderPass
77768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*framebuffer,										// framebuffer
778689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{
779689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ 0, 0 },
780689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ (deUint32)renderSize.x(), (deUint32)renderSize.y() }
781689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			},													// renderArea
78268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,													// clearValueCount
78368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&clearValue,										// pClearValues
78434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
78568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_SUBPASS_CONTENTS_INLINE);
78634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
78734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
78834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
78934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
79034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkDeviceSize bindingOffset = 0;
79134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset);
79234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
7933d2071b82061ee418aa87064333069281133eddaPyry Haulos	vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u);
79434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	vk.cmdEndRenderPass(*cmdBuf);
79534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
79634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
79734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkImageMemoryBarrier	renderFinishBarrier	=
79834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
79968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
80068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
80168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// outputMask
80268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_TRANSFER_READ_BIT,				// inputMask
80368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// oldLayout
80468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// newLayout
80568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// srcQueueFamilyIndex
80668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// dstQueueFamilyIndex
80768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*image,										// image
80834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos			{
80968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
81068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseMipLevel
81168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// mipLevels
81268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseArraySlice
81368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// arraySize
81468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			}											// subresourceRange
81534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
816689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &renderFinishBarrier);
81734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
81834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
81934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
82034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkBufferImageCopy	copyParams	=
82134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
82268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkDeviceSize)0u,						// bufferOffset
82368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)renderSize.x(),				// bufferRowLength
82468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)renderSize.y(),				// bufferImageHeight
82534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos			{
82668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,				// aspectMask
82768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,										// mipLevel
82868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,										// baseArrayLayer
82968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,										// layerCount
83068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			},										// imageSubresource
83168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			{ 0u, 0u, 0u },							// imageOffset
832689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{
833689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)renderSize.x(),
834689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)renderSize.y(),
835689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				1u
836689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			}										// imageExtent
83734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
83868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, &copyParams);
83934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
84034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
84134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
84234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkBufferMemoryBarrier	copyFinishBarrier	=
84334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
84468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// sType
84568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
84668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_TRANSFER_WRITE_BIT,				// srcAccessMask
84768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_HOST_READ_BIT,					// dstAccessMask
84868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// srcQueueFamilyIndex
84968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// dstQueueFamilyIndex
85068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*readImageBuffer,							// buffer
85168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,											// offset
85268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			imageSizeBytes								// size
85334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
854689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyFinishBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
85534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
85634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
85734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.endCommandBuffer(*cmdBuf));
85834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
85934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Upload vertex data
86034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
8617965292de01eac3af42c1de1e61b9442739eb188Pyry Haulos		const VkMappedMemoryRange	range			=
86234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
86368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
86468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
86568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vertexBufferMemory->getMemory(),		// memory
86668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0,										// offset
86768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkDeviceSize)sizeof(vertices),			// size
86834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
8697965292de01eac3af42c1de1e61b9442739eb188Pyry Haulos		void*						vertexBufPtr	= vertexBufferMemory->getHostPtr();
87034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
87134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices));
87234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range));
87334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
87434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
87534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Submit & wait for completion
87634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
87734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkFenceCreateInfo	fenceParams	=
87834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
87968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// sType
88068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
88168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,										// flags
88268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
88368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubmitInfo		submitInfo	=
88468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
88568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_SUBMIT_INFO,			// sType
88668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
88768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,										// waitSemaphoreCount
88868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pWaitSemaphores
889689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkPipelineStageFlags*)DE_NULL,
89068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,										// commandBufferCount
89168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&cmdBuf.get(),							// pCommandBuffers
89268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,										// signalSemaphoreCount
89368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pSignalSemaphores
89434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
89534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const Unique<VkFence>	fence		(createFence(vk, vkDevice, &fenceParams));
89634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
89768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
89834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull));
89934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
90034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
9014ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	// Read results, render reference, compare
90234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
9034ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const tcu::TextureFormat			tcuFormat		= vk::mapVkFormat(colorFormat);
9044ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const VkMappedMemoryRange			range			=
90534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
90668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
90768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
90868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			readImageBufferMemory->getMemory(),		// memory
90968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0,										// offset
91068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			imageSizeBytes,							// size
91134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
9124ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const tcu::ConstPixelBufferAccess	resultAccess	(tcuFormat, renderSize.x(), renderSize.y(), 1, readImageBufferMemory->getHostPtr());
91334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
91434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range));
9154ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
9164ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		{
9174ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			tcu::TextureLevel	refImage		(tcuFormat, renderSize.x(), renderSize.y());
9184ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			const tcu::UVec4	threshold		(0u);
9194ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			const tcu::IVec3	posDeviation	(1,1,0);
9204ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
9214ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			tcu::clear(refImage.getAccess(), clearColor);
9224ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			renderReferenceTriangle(refImage.getAccess(), vertices);
9234ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
9244ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			if (tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(),
9254ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  "ComparisonResult",
9264ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  "Image comparison result",
9274ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  refImage.getAccess(),
9284ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  resultAccess,
9294ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  threshold,
9304ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  posDeviation,
9314ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  false,
9324ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  tcu::COMPARE_LOG_RESULT))
9334ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos				return tcu::TestStatus::pass("Rendering succeeded");
9344ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			else
9354ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos				return tcu::TestStatus::fail("Image comparison failed");
9364ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		}
93734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
93834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
93934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	return tcu::TestStatus::pass("Rendering succeeded");
94034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
94134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
94241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvitcu::TestStatus renderTriangleUnusedResolveAttachmentTest (Context& context)
94341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi{
94441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkDevice							vkDevice				= context.getDevice();
94541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const DeviceInterface&					vk						= context.getDeviceInterface();
94641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkQueue							queue					= context.getUniversalQueue();
94741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
94841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	SimpleAllocator							memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
94941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const tcu::IVec2						renderSize				(256, 256);
95041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkFormat							colorFormat				= VK_FORMAT_R8G8B8A8_UNORM;
95141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const tcu::Vec4							clearColor				(0.125f, 0.25f, 0.75f, 1.0f);
95241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
95341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const tcu::Vec4							vertices[]				=
95441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
95541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
95641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
95741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
95841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
95941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
96041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkBufferCreateInfo				vertexBufferParams		=
96141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
96241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// sType
96341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,								// pNext
96441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,										// flags
96541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VkDeviceSize)sizeof(vertices),			// size
96641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,		// usage
96741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SHARING_MODE_EXCLUSIVE,				// sharingMode
96841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,										// queueFamilyIndexCount
96941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&queueFamilyIndex,						// pQueueFamilyIndices
97041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
97141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkBuffer>					vertexBuffer			(createBuffer(vk, vkDevice, &vertexBufferParams));
97241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const UniquePtr<Allocation>				vertexBufferMemory		(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible));
97341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
97441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
97541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
97641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkDeviceSize						imageSizeBytes			= (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y());
97741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkBufferCreateInfo				readImageBufferParams	=
97841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
97941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// sType
98041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,									// pNext
98141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VkBufferCreateFlags)0u,					// flags
98241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		imageSizeBytes,								// size
98341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BUFFER_USAGE_TRANSFER_DST_BIT,			// usage
98441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SHARING_MODE_EXCLUSIVE,					// sharingMode
98541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,											// queueFamilyIndexCount
98641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&queueFamilyIndex,							// pQueueFamilyIndices
98741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
98841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkBuffer>					readImageBuffer			(createBuffer(vk, vkDevice, &readImageBufferParams));
98941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const UniquePtr<Allocation>				readImageBufferMemory	(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
99041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
99141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
99241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
99341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkImageCreateInfo					imageParams				=
99441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
99541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,									// sType
99641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,																// pNext
99741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,																		// flags
99841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_TYPE_2D,														// imageType
99941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R8G8B8A8_UNORM,												// format
100041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{ (deUint32)renderSize.x(), (deUint32)renderSize.y(), 1 },				// extent
100141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,																		// mipLevels
100241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,																		// arraySize
100341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SAMPLE_COUNT_1_BIT,													// samples
100441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_TILING_OPTIMAL,												// tiling
100541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT,	// usage
100641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SHARING_MODE_EXCLUSIVE,												// sharingMode
100741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,																		// queueFamilyIndexCount
100841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&queueFamilyIndex,														// pQueueFamilyIndices
100941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_UNDEFINED,												// initialLayout
101041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
101141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
101241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkImage>					image					(createImage(vk, vkDevice, &imageParams));
101341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const UniquePtr<Allocation>				imageMemory				(memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any));
101441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
101541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset()));
101641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
101741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkAttachmentDescription			colorAttDesc			=
101841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
101941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// flags
102041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R8G8B8A8_UNORM,						// format
102141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SAMPLE_COUNT_1_BIT,							// samples
102241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,					// loadOp
102341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,					// storeOp
102441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE,				// stencilLoadOp
102541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_STORE_OP_DONT_CARE,				// stencilStoreOp
102641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// initialLayout
102741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// finalLayout
102841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
102941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkAttachmentReference				colorAttRef				=
103041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
103141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// attachment
103241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// layout
103341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
103441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkAttachmentReference				resolveAttRef			=
103541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
103641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_UNUSED,
103741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL
103841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
103941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkSubpassDescription				subpassDesc				=
104041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
104141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VkSubpassDescriptionFlags)0u,					// flags
104241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_PIPELINE_BIND_POINT_GRAPHICS,				// pipelineBindPoint
104341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// inputAttachmentCount
104441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pInputAttachments
104541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,												// colorAttachmentCount
104641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&colorAttRef,									// pColorAttachments
104741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&resolveAttRef,									// pResolveAttachments
104841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// depthStencilAttachment
104941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// preserveAttachmentCount
105041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pPreserveAttachments
105141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
105241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkRenderPassCreateInfo			renderPassParams		=
105341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
105441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,		// sType
105541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pNext
105641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// flags
105741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,												// attachmentCount
105841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&colorAttDesc,									// pAttachments
105941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,												// subpassCount
106041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&subpassDesc,									// pSubpasses
106141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// dependencyCount
106241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pDependencies
106341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
106441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkRenderPass>				renderPass				(createRenderPass(vk, vkDevice, &renderPassParams));
106541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
106641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkImageViewCreateInfo				colorAttViewParams		=
106741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
106841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// sType
106941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pNext
107041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// flags
107141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*image,											// image
107241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_VIEW_TYPE_2D,							// viewType
107341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R8G8B8A8_UNORM,						// format
107441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
107541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_R,
107641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_G,
107741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_B,
107841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_A
107941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},												// components
108041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
108141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_ASPECT_COLOR_BIT,						// aspectMask
108241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,												// baseMipLevel
108341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,												// levelCount
108441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,												// baseArrayLayer
108541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,												// layerCount
108641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},												// subresourceRange
108741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
108841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkImageView>				colorAttView			(createImageView(vk, vkDevice, &colorAttViewParams));
108941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
109041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Pipeline layout
109141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineLayoutCreateInfo		pipelineLayoutParams	=
109241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
109341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,			// sType
109441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
109541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(vk::VkPipelineLayoutCreateFlags)0,
109641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// setLayoutCount
109741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pSetLayouts
109841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// pushConstantRangeCount
109941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pPushConstantRanges
110041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
110141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkPipelineLayout>			pipelineLayout			(createPipelineLayout(vk, vkDevice, &pipelineLayoutParams));
110241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
110341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Shaders
110441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkShaderModule>			vertShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0));
110541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkShaderModule>			fragShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0));
110641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
110741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Pipeline
110841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkSpecializationInfo				emptyShaderSpecParams	=
110941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
111041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// mapEntryCount
111141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pMap
111241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0,														// dataSize
111341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pData
111441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
111541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineShaderStageCreateInfo	shaderStageParams[]	=
111641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
111741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
111841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
111941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,												// pNext
112041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,														// flags
112141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_SHADER_STAGE_VERTEX_BIT,								// stage
112241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*vertShaderModule,										// module
112341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			"main",													// pName
112441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&emptyShaderSpecParams,									// pSpecializationInfo
112541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},
112641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
112741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
112841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,												// pNext
112941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,														// flags
113041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
113141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*fragShaderModule,										// module
113241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			"main",													// pName
113341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&emptyShaderSpecParams,									// pSpecializationInfo
113441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		}
113541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
113641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineDepthStencilStateCreateInfo	depthStencilParams		=
113741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
113841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
113941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
114041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
114141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// depthTestEnable
114241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// depthWriteEnable
114341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
114441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// depthBoundsTestEnable
114541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// stencilTestEnable
114641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
114741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// failOp
114841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// passOp
114941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// depthFailOp
115041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPARE_OP_ALWAYS,										// compareOp
115141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// compareMask
115241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// writeMask
115341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// reference
115441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// front
115541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
115641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// failOp
115741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// passOp
115841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// depthFailOp
115941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPARE_OP_ALWAYS,										// compareOp
116041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// compareMask
116141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// writeMask
116241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// reference
116341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// back;
116441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		-1.0f,														//	float				minDepthBounds;
116541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		+1.0f,														//	float				maxDepthBounds;
116641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
116741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkViewport						viewport0				=
116841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
116941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// x
117041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// y
117141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(float)renderSize.x(),										// width
117241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(float)renderSize.y(),										// height
117341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// minDepth
117441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1.0f,														// maxDepth
117541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
117641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkRect2D							scissor0				=
117741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
117841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
117941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// x
118041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// y
118141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// offset
118241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
118341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.x(),									// width
118441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.y(),									// height
118541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// extent;
118641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
118741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineViewportStateCreateInfo		viewportParams			=
118841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
118941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,		// sType
119041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
119141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
119241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// viewportCount
119341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&viewport0,													// pViewports
119441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// scissorCount
119541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&scissor0													// pScissors
119641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
119741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkSampleMask							sampleMask				= ~0u;
119841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineMultisampleStateCreateInfo	multisampleParams		=
119941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
120041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// sType
120141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
120241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
120341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SAMPLE_COUNT_1_BIT,										// rasterizationSamples
120441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// sampleShadingEnable
120541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// minSampleShading
120641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&sampleMask,												// sampleMask
120741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// alphaToCoverageEnable
120841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// alphaToOneEnable
120941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
121041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineRasterizationStateCreateInfo	rasterParams		=
121141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
121241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,	// sType
121341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
121441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
121541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_TRUE,													// depthClampEnable
121641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// rasterizerDiscardEnable
121741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_POLYGON_MODE_FILL,										// polygonMode
121841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CULL_MODE_NONE,											// cullMode
121941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FRONT_FACE_COUNTER_CLOCKWISE,							// frontFace
122041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// depthBiasEnable
122141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// depthBiasConstantFactor
122241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// depthBiasClamp
122341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// depthBiasSlopeFactor
122441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1.0f,														// lineWidth
122541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
122641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyParams	=
122741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
122841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
122941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,														// pNext
123041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,																// flags
123141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
123241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,														// primitiveRestartEnable
123341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
123441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkVertexInputBindingDescription		vertexBinding0			=
123541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
123641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// binding
123741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)sizeof(tcu::Vec4),							// stride
123841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_VERTEX_INPUT_RATE_VERTEX,							// inputRate
123941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
124041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkVertexInputAttributeDescription		vertexAttrib0			=
124141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
124241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// location
124341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// binding
124441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R32G32B32A32_SFLOAT,							// format
124541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// offset
124641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
124741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineVertexInputStateCreateInfo	vertexInputStateParams	=
124841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
124941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	// sType
125041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
125141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
125241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// vertexBindingDescriptionCount
125341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&vertexBinding0,											// pVertexBindingDescriptions
125441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// vertexAttributeDescriptionCount
125541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&vertexAttrib0,												// pVertexAttributeDescriptions
125641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
125741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineColorBlendAttachmentState	attBlendParams			=
125841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
125941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// blendEnable
126041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ONE,										// srcColorBlendFactor
126141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ZERO,										// dstColorBlendFactor
126241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_OP_ADD,											// colorBlendOp
126341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ONE,										// srcAlphaBlendFactor
126441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ZERO,										// dstAlphaBlendFactor
126541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_OP_ADD,											// alphaBlendOp
126641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VK_COLOR_COMPONENT_R_BIT|
126741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		 VK_COLOR_COMPONENT_G_BIT|
126841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		 VK_COLOR_COMPONENT_B_BIT|
126941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		 VK_COLOR_COMPONENT_A_BIT),									// colorWriteMask
127041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
127141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineColorBlendStateCreateInfo	blendParams				=
127241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
127341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// sType
127441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
127541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
127641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// logicOpEnable
127741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_LOGIC_OP_COPY,											// logicOp
127841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// attachmentCount
127941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&attBlendParams,											// pAttachments
128041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{ 0.0f, 0.0f, 0.0f, 0.0f },									// blendConstants[4]
128141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
128241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkGraphicsPipelineCreateInfo		pipelineParams			=
128341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
128441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,		// sType
128541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
128641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// flags
128741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams),		// stageCount
128841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		shaderStageParams,										// pStages
128941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&vertexInputStateParams,								// pVertexInputState
129041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&inputAssemblyParams,									// pInputAssemblyState
129141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pTessellationState
129241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&viewportParams,										// pViewportState
129341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&rasterParams,											// pRasterizationState
129441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&multisampleParams,										// pMultisampleState
129541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&depthStencilParams,									// pDepthStencilState
129641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&blendParams,											// pColorBlendState
129741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(const VkPipelineDynamicStateCreateInfo*)DE_NULL,		// pDynamicState
129841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*pipelineLayout,										// layout
129941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*renderPass,											// renderPass
130041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// subpass
130141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// basePipelineHandle
130241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// basePipelineIndex
130341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
130441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
130541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkPipeline>				pipeline				(createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams));
130641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
130741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Framebuffer
130841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkFramebufferCreateInfo			framebufferParams		=
130941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
131041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,				// sType
131141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
131241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// flags
131341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*renderPass,											// renderPass
131441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,														// attachmentCount
131541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&*colorAttView,											// pAttachments
131641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)renderSize.x(),								// width
131741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)renderSize.y(),								// height
131841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,														// layers
131941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
132041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkFramebuffer>				framebuffer				(createFramebuffer(vk, vkDevice, &framebufferParams));
132141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
132241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkCommandPoolCreateInfo			cmdPoolParams			=
132341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
132441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType
132541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
132641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags
132741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		queueFamilyIndex,											// queueFamilyIndex
132841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
132941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
133041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
133141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Command buffer
133241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkCommandBufferAllocateInfo		cmdBufParams			=
133341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
133441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,			// sType
133541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
133641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*cmdPool,												// pool
133741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_COMMAND_BUFFER_LEVEL_PRIMARY,						// level
133841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,														// bufferCount
133941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
134041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkCommandBuffer>			cmdBuf					(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
134141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
134241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkCommandBufferBeginInfo			cmdBufBeginParams		=
134341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
134441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// sType
134541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
134641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// flags
134741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(const VkCommandBufferInheritanceInfo*)DE_NULL,
134841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
134941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
135041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Record commands
135141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams));
135241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
135341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
135441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkMemoryBarrier		vertFlushBarrier	=
135541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
135641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_MEMORY_BARRIER,			// sType
135741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
135841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_HOST_WRITE_BIT,					// srcAccessMask
135941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,		// dstAccessMask
136041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
136141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkImageMemoryBarrier	colorAttBarrier		=
136241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
136341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
136441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
136541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,											// srcAccessMask
136641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(VK_ACCESS_COLOR_ATTACHMENT_READ_BIT|
136741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT),		// dstAccessMask
136841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_UNDEFINED,					// oldLayout
136941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// newLayout
137041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// srcQueueFamilyIndex
137141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// dstQueueFamilyIndex
137241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*image,										// image
137341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
137441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
137541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseMipLevel
137641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// levelCount
137741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseArrayLayer
137841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// layerCount
137941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			}											// subresourceRange
138041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
138141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, (VkDependencyFlags)0, 1, &vertFlushBarrier, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &colorAttBarrier);
138241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
138341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
138441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
138541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkClearValue			clearValue		= makeClearValueColorF32(clearColor[0],
138641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi																			 clearColor[1],
138741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi																			 clearColor[2],
138841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi																			 clearColor[3]);
138941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkRenderPassBeginInfo	passBeginParams	=
139041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
139141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,			// sType
139241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,											// pNext
139341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*renderPass,										// renderPass
139441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*framebuffer,										// framebuffer
139541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
139641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				{ 0, 0 },
139741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				{ (deUint32)renderSize.x(), (deUint32)renderSize.y() }
139841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			},													// renderArea
139941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,													// clearValueCount
140041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&clearValue,										// pClearValues
140141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
140241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_SUBPASS_CONTENTS_INLINE);
140341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
140441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
140541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
140641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
140741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkDeviceSize bindingOffset = 0;
140841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset);
140941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
141041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u);
141141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	vk.cmdEndRenderPass(*cmdBuf);
141241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
141341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
141441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkImageMemoryBarrier	renderFinishBarrier	=
141541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
141641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
141741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
141841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// outputMask
141941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_TRANSFER_READ_BIT,				// inputMask
142041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// oldLayout
142141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// newLayout
142241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// srcQueueFamilyIndex
142341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// dstQueueFamilyIndex
142441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*image,										// image
142541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
142641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
142741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseMipLevel
142841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// mipLevels
142941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseArraySlice
143041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// arraySize
143141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			}											// subresourceRange
143241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
143341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &renderFinishBarrier);
143441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
143541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
143641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
143741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkBufferImageCopy	copyParams	=
143841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
143941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(VkDeviceSize)0u,						// bufferOffset
144041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.x(),				// bufferRowLength
144141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.y(),				// bufferImageHeight
144241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
144341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,				// aspectMask
144441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,										// mipLevel
144541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,										// baseArrayLayer
144641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,										// layerCount
144741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			},										// imageSubresource
144841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{ 0u, 0u, 0u },							// imageOffset
144941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
145041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				(deUint32)renderSize.x(),
145141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				(deUint32)renderSize.y(),
145241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u
145341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			}										// imageExtent
145441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
145541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, &copyParams);
145641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
145741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
145841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
145941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkBufferMemoryBarrier	copyFinishBarrier	=
146041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
146141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// sType
146241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
146341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_TRANSFER_WRITE_BIT,				// srcAccessMask
146441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_HOST_READ_BIT,					// dstAccessMask
146541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// srcQueueFamilyIndex
146641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// dstQueueFamilyIndex
146741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*readImageBuffer,							// buffer
146841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,											// offset
146941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			imageSizeBytes								// size
147041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
147141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyFinishBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
147241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
147341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
147441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.endCommandBuffer(*cmdBuf));
147541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
147641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Upload vertex data
147741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
147841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkMappedMemoryRange	range			=
147941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
148041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
148141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
148241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			vertexBufferMemory->getMemory(),		// memory
148341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0,										// offset
148441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(VkDeviceSize)sizeof(vertices),			// size
148541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
148641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		void*						vertexBufPtr	= vertexBufferMemory->getHostPtr();
148741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
148841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices));
148941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range));
149041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
149141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
149241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Submit & wait for completion
149341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
149441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkFenceCreateInfo	fenceParams	=
149541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
149641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// sType
149741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
149841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,										// flags
149941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
150041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkSubmitInfo		submitInfo	=
150141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
150241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_SUBMIT_INFO,			// sType
150341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
150441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,										// waitSemaphoreCount
150541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pWaitSemaphores
150641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(const VkPipelineStageFlags*)DE_NULL,
150741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,										// commandBufferCount
150841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&cmdBuf.get(),							// pCommandBuffers
150941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,										// signalSemaphoreCount
151041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pSignalSemaphores
151141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
151241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const Unique<VkFence>	fence		(createFence(vk, vkDevice, &fenceParams));
151341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
151441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
151541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull));
151641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
151741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
151841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Read results, render reference, compare
151941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
152041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const tcu::TextureFormat			tcuFormat		= vk::mapVkFormat(colorFormat);
152141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkMappedMemoryRange			range			=
152241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
152341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
152441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
152541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			readImageBufferMemory->getMemory(),		// memory
152641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0,										// offset
152741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			imageSizeBytes,							// size
152841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
152941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const tcu::ConstPixelBufferAccess	resultAccess	(tcuFormat, renderSize.x(), renderSize.y(), 1, readImageBufferMemory->getHostPtr());
153041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
153141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range));
153241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
153341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
153441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			tcu::TextureLevel	refImage		(tcuFormat, renderSize.x(), renderSize.y());
153541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			const tcu::UVec4	threshold		(0u);
153641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			const tcu::IVec3	posDeviation	(1,1,0);
153741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
153841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			tcu::clear(refImage.getAccess(), clearColor);
153941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			renderReferenceTriangle(refImage.getAccess(), vertices);
154041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
154141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			if (tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(),
154241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  "ComparisonResult",
154341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  "Image comparison result",
154441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  refImage.getAccess(),
154541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  resultAccess,
154641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  threshold,
154741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  posDeviation,
154841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  false,
154941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  tcu::COMPARE_LOG_RESULT))
155041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				return tcu::TestStatus::pass("Rendering succeeded");
155141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			else
155241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				return tcu::TestStatus::fail("Image comparison failed");
155341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		}
155441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
155541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
155641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	return tcu::TestStatus::pass("Rendering succeeded");
155741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi}
155841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
155934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // anonymous
156034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
156134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestCaseGroup* createSmokeTests (tcu::TestContext& testCtx)
156234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
156334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	de::MovePtr<tcu::TestCaseGroup>	smokeTests	(new tcu::TestCaseGroup(testCtx, "smoke", "Smoke Tests"));
156434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
156541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCase				(smokeTests.get(), "create_sampler",			"",	createSamplerTest);
156641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "create_shader",				"", createShaderProgs,		createShaderModuleTest);
156741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "triangle",					"", createTriangleProgs,	renderTriangleTest);
156841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "asm_triangle",				"", createTriangleAsmProgs,	renderTriangleTest);
15691d385a1405fae6be086a68a216b758c2a824d6a6Pyry Haulos	addFunctionCaseWithPrograms	(smokeTests.get(), "asm_triangle_no_opname",	"", createProgsNoOpName,	renderTriangleTest);
157041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "unused_resolve_attachment",	"", createTriangleProgs,	renderTriangleUnusedResolveAttachmentTest);
157134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
157234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	return smokeTests.release();
157334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
157434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
157534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // api
157634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // vkt
1577