vktApiSmokeTests.cpp revision 3d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410
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"
10534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		"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
1964ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosclass RefVertexShader : public rr::VertexShader
1974ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{
1984ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulospublic:
1994ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	RefVertexShader (void)
2004ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		: rr::VertexShader(1, 0)
2014ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2024ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		m_inputs[0].type = rr::GENERICVECTYPE_FLOAT;
2034ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2044ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2054ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const
2064ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2074ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
2084ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		{
2094ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			packets[packetNdx]->position = rr::readVertexAttribFloat(inputs[0],
2104ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																	 packets[packetNdx]->instanceNdx,
2114ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																	 packets[packetNdx]->vertexNdx);
2124ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		}
2134ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2144ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos};
2154ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2164ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosclass RefFragmentShader : public rr::FragmentShader
2174ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{
2184ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulospublic:
2194ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	RefFragmentShader (void)
2204ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		: rr::FragmentShader(0, 1)
2214ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2224ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		m_outputs[0].type = rr::GENERICVECTYPE_FLOAT;
2234ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2244ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2254ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	void shadeFragments (rr::FragmentPacket*, const int numPackets, const rr::FragmentShadingContext& context) const
2264ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2274ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
2284ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		{
2294ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			for (int fragNdx = 0; fragNdx < rr::NUM_FRAGMENTS_PER_PACKET; ++fragNdx)
2304ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			{
2314ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos				rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f));
2324ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			}
2334ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		}
2344ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	}
2354ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos};
2364ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2374ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosvoid renderReferenceTriangle (const tcu::PixelBufferAccess& dst, const tcu::Vec4 (&vertices)[3])
2384ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{
2394ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const RefVertexShader					vertShader;
2404ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const RefFragmentShader					fragShader;
2414ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::Program						program			(&vertShader, &fragShader);
2424ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::MultisamplePixelBufferAccess	colorBuffer		= rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(dst);
2434ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::RenderTarget					renderTarget	(colorBuffer);
2444ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::RenderState					renderState		((rr::ViewportState(colorBuffer)));
2454ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::Renderer						renderer;
2464ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const rr::VertexAttrib					vertexAttribs[]	=
2474ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	{
2484ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, sizeof(tcu::Vec4), 0, vertices[0].getPtr())
2494ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	};
2504ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
2514ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	renderer.draw(rr::DrawCommand(renderState,
2524ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  renderTarget,
2534ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  program,
2544ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  DE_LENGTH_OF_ARRAY(vertexAttribs),
2554ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  &vertexAttribs[0],
2564ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos								  rr::PrimitiveList(rr::PRIMITIVETYPE_TRIANGLES, DE_LENGTH_OF_ARRAY(vertices), 0)));
2574ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos}
2584ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
25934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus renderTriangleTest (Context& context)
26034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
26134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkDevice							vkDevice				= context.getDevice();
26234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const DeviceInterface&					vk						= context.getDeviceInterface();
26334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkQueue							queue					= context.getUniversalQueue();
26434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
26534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	SimpleAllocator							memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
26634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const tcu::IVec2						renderSize				(256, 256);
2674ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const VkFormat							colorFormat				= VK_FORMAT_R8G8B8A8_UNORM;
2684ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	const tcu::Vec4							clearColor				(0.125f, 0.25f, 0.75f, 1.0f);
26934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
27034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const tcu::Vec4							vertices[]				=
27134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
27234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
27334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
27434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
27534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
27634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
27734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkBufferCreateInfo				vertexBufferParams		=
27834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
27968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// sType
28068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,								// pNext
28168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,										// flags
28268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkDeviceSize)sizeof(vertices),			// size
28368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,		// usage
28468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SHARING_MODE_EXCLUSIVE,				// sharingMode
28568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,										// queueFamilyIndexCount
28668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&queueFamilyIndex,						// pQueueFamilyIndices
28734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
28834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkBuffer>					vertexBuffer			(createBuffer(vk, vkDevice, &vertexBufferParams));
28934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const UniquePtr<Allocation>				vertexBufferMemory		(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible));
29034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
29134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
29234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
29334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkDeviceSize						imageSizeBytes			= (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y());
29434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkBufferCreateInfo				readImageBufferParams	=
29534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
29668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// sType
29768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,									// pNext
29868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkBufferCreateFlags)0u,					// flags
29968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		imageSizeBytes,								// size
30068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BUFFER_USAGE_TRANSFER_DST_BIT,			// usage
30168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SHARING_MODE_EXCLUSIVE,					// sharingMode
30268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,											// queueFamilyIndexCount
30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&queueFamilyIndex,							// pQueueFamilyIndices
30434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
30534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkBuffer>					readImageBuffer			(createBuffer(vk, vkDevice, &readImageBufferParams));
30634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const UniquePtr<Allocation>				readImageBufferMemory	(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
30734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
30834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
30934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
31034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkImageCreateInfo					imageParams				=
31134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
31268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,									// sType
31368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,																// pNext
31468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,																		// flags
31568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_TYPE_2D,														// imageType
31668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,												// format
317689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		{ (deUint32)renderSize.x(), (deUint32)renderSize.y(), 1 },				// extent
31868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,																		// mipLevels
31968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,																		// arraySize
32068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,													// samples
32168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_TILING_OPTIMAL,												// tiling
32268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT,	// usage
32368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SHARING_MODE_EXCLUSIVE,												// sharingMode
32468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,																		// queueFamilyIndexCount
32568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&queueFamilyIndex,														// pQueueFamilyIndices
32668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_UNDEFINED,												// initialLayout
32734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
32834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
32934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkImage>					image					(createImage(vk, vkDevice, &imageParams));
33034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const UniquePtr<Allocation>				imageMemory				(memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any));
33134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
33234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset()));
33334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
33434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkAttachmentDescription			colorAttDesc			=
33534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
33668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// flags
33768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,						// format
33868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,							// samples
33968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_LOAD_OP_CLEAR,					// loadOp
34068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_STORE_OP_STORE,					// storeOp
34168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_LOAD_OP_DONT_CARE,				// stencilLoadOp
34268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_ATTACHMENT_STORE_OP_DONT_CARE,				// stencilStoreOp
34368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// initialLayout
34468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// finalLayout
34534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
34634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkAttachmentReference				colorAttRef				=
34734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
34868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// attachment
34968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// layout
35034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
35134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkSubpassDescription				subpassDesc				=
35234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
35368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkSubpassDescriptionFlags)0u,					// flags
35468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_PIPELINE_BIND_POINT_GRAPHICS,				// pipelineBindPoint
35568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// inputAttachmentCount
35668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pInputAttachments
35768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// colorAttachmentCount
35868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&colorAttRef,									// pColorAttachments
35968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pResolveAttachments
36068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// depthStencilAttachment
36168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// preserveAttachmentCount
36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pPreserveAttachments
36334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
36434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkRenderPassCreateInfo			renderPassParams		=
36534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
36668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,		// sType
36768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pNext
36868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// flags
36968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// attachmentCount
37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&colorAttDesc,									// pAttachments
37168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// subpassCount
37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&subpassDesc,									// pSubpasses
37368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// dependencyCount
37468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pDependencies
37534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
37634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkRenderPass>				renderPass				(createRenderPass(vk, vkDevice, &renderPassParams));
37734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
3783d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkImageViewCreateInfo				colorAttViewParams		=
37934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
38068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// sType
38168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,										// pNext
38268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,												// flags
38368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*image,											// image
38468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_VIEW_TYPE_2D,							// viewType
38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,						// format
3863d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
38768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_R,
38868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_G,
38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_B,
39068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPONENT_SWIZZLE_A
39168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},												// components
3923d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
39368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_ASPECT_COLOR_BIT,						// aspectMask
39468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,												// baseMipLevel
39568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,												// levelCount
39668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,												// baseArrayLayer
39768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,												// layerCount
39868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},												// subresourceRange
39934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
4003d2071b82061ee418aa87064333069281133eddaPyry Haulos	const Unique<VkImageView>				colorAttView			(createImageView(vk, vkDevice, &colorAttViewParams));
40134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
40234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Pipeline layout
40334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineLayoutCreateInfo		pipelineLayoutParams	=
40434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
40568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,			// sType
40668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
40768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(vk::VkPipelineLayoutCreateFlags)0,
40868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// setLayoutCount
40968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pSetLayouts
41068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// pushConstantRangeCount
41168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pPushConstantRanges
41234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
41334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkPipelineLayout>			pipelineLayout			(createPipelineLayout(vk, vkDevice, &pipelineLayoutParams));
41434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
41568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	// Shaders
41668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkShaderModule>			vertShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0));
41768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkShaderModule>			fragShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0));
41868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
41934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Pipeline
42034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkSpecializationInfo				emptyShaderSpecParams	=
42134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
42268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// mapEntryCount
42368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pMap
42468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0,														// dataSize
42568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pData
42634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
42734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineShaderStageCreateInfo	shaderStageParams[]	=
42834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
42934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
43068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
43168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,												// pNext
43268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,														// flags
43368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,								// stage
43468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*vertShaderModule,										// module
43568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",													// pName
43668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&emptyShaderSpecParams,									// pSpecializationInfo
43734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		},
43834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
43968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
44068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,												// pNext
44168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,														// flags
44268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
44368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*fragShaderModule,										// module
44468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",													// pName
44568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&emptyShaderSpecParams,									// pSpecializationInfo
44634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		}
44734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
44834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineDepthStencilStateCreateInfo	depthStencilParams		=
44934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
45068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
45168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
45268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
45368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// depthTestEnable
45468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// depthWriteEnable
45568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
45668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// depthBoundsTestEnable
45768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// stencilTestEnable
45834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
45968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// failOp
46068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// passOp
46168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// depthFailOp
46268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPARE_OP_ALWAYS,										// compareOp
46368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// compareMask
46468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// writeMask
46568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// reference
46668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// front
46734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
46868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// failOp
46968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// passOp
47068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STENCIL_OP_KEEP,											// depthFailOp
47168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_COMPARE_OP_ALWAYS,										// compareOp
47268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// compareMask
47368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// writeMask
47468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// reference
47568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// back;
4763d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		0.0f,														//	float				minDepthBounds;
4773d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		1.0f,														//	float				maxDepthBounds;
4783d2071b82061ee418aa87064333069281133eddaPyry Haulos	};
4793d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkViewport						viewport0				=
4803d2071b82061ee418aa87064333069281133eddaPyry Haulos	{
48168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// x
48268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// y
48368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(float)renderSize.x(),										// width
48468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(float)renderSize.y(),										// height
48568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// minDepth
48668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1.0f,														// maxDepth
4873d2071b82061ee418aa87064333069281133eddaPyry Haulos	};
4883d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkRect2D							scissor0				=
4893d2071b82061ee418aa87064333069281133eddaPyry Haulos	{
4903d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
49168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// x
49268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,															// y
49368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// offset
4943d2071b82061ee418aa87064333069281133eddaPyry Haulos		{
495689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)renderSize.x(),									// width
496689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)renderSize.y(),									// height
49768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		},															// extent;
49834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
49934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineViewportStateCreateInfo		viewportParams			=
50034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
50168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,		// sType
50268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
50368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
50468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// viewportCount
50568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&viewport0,													// pViewports
50668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// scissorCount
50768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&scissor0													// pScissors
50834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
5093d2071b82061ee418aa87064333069281133eddaPyry Haulos	const VkSampleMask							sampleMask				= ~0u;
51034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineMultisampleStateCreateInfo	multisampleParams		=
51134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
51268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// sType
51368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
51468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
51568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_SAMPLE_COUNT_1_BIT,										// rasterizationSamples
51668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// sampleShadingEnable
51768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// minSampleShading
51868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&sampleMask,												// sampleMask
51968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// alphaToCoverageEnable
52068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// alphaToOneEnable
52168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	};
52268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkPipelineRasterizationStateCreateInfo	rasterParams		=
52368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	{
52468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,	// sType
52568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
52668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
52768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_TRUE,													// depthClampEnable
52868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// rasterizerDiscardEnable
52968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_POLYGON_MODE_FILL,										// polygonMode
53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_CULL_MODE_NONE,											// cullMode
53168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FRONT_FACE_COUNTER_CLOCKWISE,							// frontFace
53268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// depthBiasEnable
53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// depthBiasConstantFactor
53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// depthBiasClamp
53568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0.0f,														// depthBiasSlopeFactor
53668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1.0f,														// lineWidth
53734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
53834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyParams	=
53934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,														// pNext
54268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,																// flags
54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,														// primitiveRestartEnable
54534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
54634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkVertexInputBindingDescription		vertexBinding0			=
54734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
54868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// binding
54968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)sizeof(tcu::Vec4),							// stride
55068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_VERTEX_INPUT_RATE_VERTEX,							// inputRate
55134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
55234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkVertexInputAttributeDescription		vertexAttrib0			=
55334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
55468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// location
55568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// binding
55668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT,							// format
55768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// offset
55834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
55934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineVertexInputStateCreateInfo	vertexInputStateParams	=
56034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
56168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	// sType
56268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
56368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
56468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// vertexBindingDescriptionCount
56568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&vertexBinding0,											// pVertexBindingDescriptions
56668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// vertexAttributeDescriptionCount
56768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&vertexAttrib0,												// pVertexAttributeDescriptions
56834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
56934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineColorBlendAttachmentState	attBlendParams			=
57034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
57168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,													// blendEnable
57268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ONE,										// srcColorBlendFactor
57368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ZERO,										// dstColorBlendFactor
57468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_OP_ADD,											// colorBlendOp
57568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ONE,										// srcAlphaBlendFactor
57668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_FACTOR_ZERO,										// dstAlphaBlendFactor
57768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_BLEND_OP_ADD,											// alphaBlendOp
57868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VK_COLOR_COMPONENT_R_BIT|
57968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		 VK_COLOR_COMPONENT_G_BIT|
58068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		 VK_COLOR_COMPONENT_B_BIT|
58168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		 VK_COLOR_COMPONENT_A_BIT),									// colorWriteMask
58234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
58334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkPipelineColorBlendStateCreateInfo	blendParams				=
58434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
58568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// sType
58668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
58768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,															// flags
58868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_FALSE,													// logicOpEnable
58968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_LOGIC_OP_COPY,											// logicOp
59068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,															// attachmentCount
59168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&attBlendParams,											// pAttachments
59268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{ 0.0f, 0.0f, 0.0f, 0.0f },									// blendConstants[4]
5933d2071b82061ee418aa87064333069281133eddaPyry Haulos	};
59434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkGraphicsPipelineCreateInfo		pipelineParams			=
59534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
59668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,		// sType
59768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
59868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// flags
59968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams),		// stageCount
60068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		shaderStageParams,										// pStages
60168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&vertexInputStateParams,								// pVertexInputState
60268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&inputAssemblyParams,									// pInputAssemblyState
60368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pTessellationState
60468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&viewportParams,										// pViewportState
60568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&rasterParams,											// pRasterizationState
60668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&multisampleParams,										// pMultisampleState
60768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&depthStencilParams,									// pDepthStencilState
60868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&blendParams,											// pColorBlendState
60986a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos		(const VkPipelineDynamicStateCreateInfo*)DE_NULL,		// pDynamicState
61068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*pipelineLayout,										// layout
61168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*renderPass,											// renderPass
61268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// subpass
61368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// basePipelineHandle
61468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// basePipelineIndex
61534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
61634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
61734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const Unique<VkPipeline>				pipeline				(createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams));
61834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
61934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Framebuffer
62034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	const VkFramebufferCreateInfo			framebufferParams		=
62134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
62268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,				// sType
62368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
62468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// flags
62568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*renderPass,											// renderPass
62668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,														// attachmentCount
62768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		&*colorAttView,											// pAttachments
62868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)renderSize.x(),								// width
62968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(deUint32)renderSize.y(),								// height
63068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,														// layers
63134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
6323d2071b82061ee418aa87064333069281133eddaPyry Haulos	const Unique<VkFramebuffer>				framebuffer				(createFramebuffer(vk, vkDevice, &framebufferParams));
63334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
63468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandPoolCreateInfo			cmdPoolParams			=
63534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
63668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType
63768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,													// pNext
63868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags
63968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		queueFamilyIndex,											// queueFamilyIndex
64034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
64168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
64234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
64334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Command buffer
64468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandBufferAllocateInfo		cmdBufParams			=
64534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
64668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,			// sType
64768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
64868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		*cmdPool,												// pool
64968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_COMMAND_BUFFER_LEVEL_PRIMARY,						// level
65068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,														// bufferCount
65134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
65268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const Unique<VkCommandBuffer>			cmdBuf					(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
65334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
65468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandBufferBeginInfo			cmdBufBeginParams		=
65534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
65668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// sType
65768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,												// pNext
65868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,														// flags
659689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkCommandBufferInheritanceInfo*)DE_NULL,
66034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	};
66134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
66234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Record commands
66334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams));
66434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
66534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
66634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkMemoryBarrier		vertFlushBarrier	=
66734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
66868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_MEMORY_BARRIER,			// sType
66968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
67068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_HOST_WRITE_BIT,					// srcAccessMask
67168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,		// dstAccessMask
67234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
67334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkImageMemoryBarrier	colorAttBarrier		=
67434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
67568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
67668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
67768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,											// srcAccessMask
67868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VK_ACCESS_COLOR_ATTACHMENT_READ_BIT|
67968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT),		// dstAccessMask
68068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_UNDEFINED,					// oldLayout
68168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// newLayout
68268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// srcQueueFamilyIndex
68368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// dstQueueFamilyIndex
68468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*image,										// image
68534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos			{
68668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
68768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseMipLevel
68868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// levelCount
68968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseArrayLayer
69068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// layerCount
69168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			}											// subresourceRange
69234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
693689c095f881a410da6a315795452a8e00ad95a9dPyry 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);
69434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
69534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
69634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
6974ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const VkClearValue			clearValue		= makeClearValueColorF32(clearColor[0],
6984ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																			 clearColor[1],
6994ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																			 clearColor[2],
7004ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos																			 clearColor[3]);
70134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkRenderPassBeginInfo	passBeginParams	=
70234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
70368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,			// sType
70468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,											// pNext
70568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*renderPass,										// renderPass
70668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*framebuffer,										// framebuffer
707689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{
708689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ 0, 0 },
709689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ (deUint32)renderSize.x(), (deUint32)renderSize.y() }
710689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			},													// renderArea
71168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,													// clearValueCount
71268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&clearValue,										// pClearValues
71334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
71468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_SUBPASS_CONTENTS_INLINE);
71534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
71634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
71734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
71834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
71934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkDeviceSize bindingOffset = 0;
72034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset);
72134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
7223d2071b82061ee418aa87064333069281133eddaPyry Haulos	vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u);
72334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	vk.cmdEndRenderPass(*cmdBuf);
72434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
72534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
72634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkImageMemoryBarrier	renderFinishBarrier	=
72734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
72868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
72968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
73068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// outputMask
73168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_TRANSFER_READ_BIT,				// inputMask
73268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// oldLayout
73368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// newLayout
73468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// srcQueueFamilyIndex
73568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// dstQueueFamilyIndex
73668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*image,										// image
73734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos			{
73868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
73968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseMipLevel
74068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// mipLevels
74168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,											// baseArraySlice
74268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,											// arraySize
74368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			}											// subresourceRange
74434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
745689c095f881a410da6a315795452a8e00ad95a9dPyry 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);
74634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
74734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
74834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
74934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkBufferImageCopy	copyParams	=
75034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
75168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkDeviceSize)0u,						// bufferOffset
75268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)renderSize.x(),				// bufferRowLength
75368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)renderSize.y(),				// bufferImageHeight
75434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos			{
75568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,				// aspectMask
75668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,										// mipLevel
75768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,										// baseArrayLayer
75868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,										// layerCount
75968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			},										// imageSubresource
76068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			{ 0u, 0u, 0u },							// imageOffset
761689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{
762689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)renderSize.x(),
763689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)renderSize.y(),
764689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				1u
765689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			}										// imageExtent
76634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
76768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, &copyParams);
76834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
76934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
77034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
77134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkBufferMemoryBarrier	copyFinishBarrier	=
77234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
77368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// sType
77468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,									// pNext
77568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_TRANSFER_WRITE_BIT,				// srcAccessMask
77668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_ACCESS_HOST_READ_BIT,					// dstAccessMask
77768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// srcQueueFamilyIndex
77868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			queueFamilyIndex,							// dstQueueFamilyIndex
77968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			*readImageBuffer,							// buffer
78068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,											// offset
78168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			imageSizeBytes								// size
78234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
783689c095f881a410da6a315795452a8e00ad95a9dPyry 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);
78434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
78534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
78634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	VK_CHECK(vk.endCommandBuffer(*cmdBuf));
78734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
78834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Upload vertex data
78934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
7907965292de01eac3af42c1de1e61b9442739eb188Pyry Haulos		const VkMappedMemoryRange	range			=
79134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
79268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
79368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
79468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vertexBufferMemory->getMemory(),		// memory
79568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0,										// offset
79668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkDeviceSize)sizeof(vertices),			// size
79734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
7987965292de01eac3af42c1de1e61b9442739eb188Pyry Haulos		void*						vertexBufPtr	= vertexBufferMemory->getHostPtr();
79934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
80034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices));
80134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range));
80234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
80334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
80434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	// Submit & wait for completion
80534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
80634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const VkFenceCreateInfo	fenceParams	=
80734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
80868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// sType
80968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
81068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,										// flags
81168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
81268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubmitInfo		submitInfo	=
81368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
81468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_SUBMIT_INFO,			// sType
81568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
81668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,										// waitSemaphoreCount
81768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pWaitSemaphores
818689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkPipelineStageFlags*)DE_NULL,
81968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			1u,										// commandBufferCount
82068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&cmdBuf.get(),							// pCommandBuffers
82168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0u,										// signalSemaphoreCount
82268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pSignalSemaphores
82334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
82434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		const Unique<VkFence>	fence		(createFence(vk, vkDevice, &fenceParams));
82534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
82668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
82734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull));
82834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
82934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
8304ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos	// Read results, render reference, compare
83134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	{
8324ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const tcu::TextureFormat			tcuFormat		= vk::mapVkFormat(colorFormat);
8334ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const VkMappedMemoryRange			range			=
83434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		{
83568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
83668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,								// pNext
83768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			readImageBufferMemory->getMemory(),		// memory
83868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			0,										// offset
83968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			imageSizeBytes,							// size
84034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		};
8414ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		const tcu::ConstPixelBufferAccess	resultAccess	(tcuFormat, renderSize.x(), renderSize.y(), 1, readImageBufferMemory->getHostPtr());
84234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
84334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos		VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range));
8444ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
8454ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		{
8464ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			tcu::TextureLevel	refImage		(tcuFormat, renderSize.x(), renderSize.y());
8474ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			const tcu::UVec4	threshold		(0u);
8484ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			const tcu::IVec3	posDeviation	(1,1,0);
8494ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
8504ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			tcu::clear(refImage.getAccess(), clearColor);
8514ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			renderReferenceTriangle(refImage.getAccess(), vertices);
8524ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos
8534ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			if (tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(),
8544ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  "ComparisonResult",
8554ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  "Image comparison result",
8564ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  refImage.getAccess(),
8574ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  resultAccess,
8584ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  threshold,
8594ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  posDeviation,
8604ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  false,
8614ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos														  tcu::COMPARE_LOG_RESULT))
8624ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos				return tcu::TestStatus::pass("Rendering succeeded");
8634ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos			else
8644ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos				return tcu::TestStatus::fail("Image comparison failed");
8654ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos		}
86634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	}
86734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
86834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	return tcu::TestStatus::pass("Rendering succeeded");
86934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
87034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
87141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvitcu::TestStatus renderTriangleUnusedResolveAttachmentTest (Context& context)
87241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi{
87341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkDevice							vkDevice				= context.getDevice();
87441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const DeviceInterface&					vk						= context.getDeviceInterface();
87541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkQueue							queue					= context.getUniversalQueue();
87641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const deUint32							queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
87741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	SimpleAllocator							memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
87841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const tcu::IVec2						renderSize				(256, 256);
87941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkFormat							colorFormat				= VK_FORMAT_R8G8B8A8_UNORM;
88041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const tcu::Vec4							clearColor				(0.125f, 0.25f, 0.75f, 1.0f);
88141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
88241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const tcu::Vec4							vertices[]				=
88341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
88441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
88541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
88641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
88741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
88841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
88941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkBufferCreateInfo				vertexBufferParams		=
89041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
89141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// sType
89241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,								// pNext
89341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,										// flags
89441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VkDeviceSize)sizeof(vertices),			// size
89541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,		// usage
89641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SHARING_MODE_EXCLUSIVE,				// sharingMode
89741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,										// queueFamilyIndexCount
89841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&queueFamilyIndex,						// pQueueFamilyIndices
89941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
90041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkBuffer>					vertexBuffer			(createBuffer(vk, vkDevice, &vertexBufferParams));
90141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const UniquePtr<Allocation>				vertexBufferMemory		(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible));
90241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
90341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
90441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
90541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkDeviceSize						imageSizeBytes			= (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y());
90641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkBufferCreateInfo				readImageBufferParams	=
90741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
90841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// sType
90941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,									// pNext
91041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VkBufferCreateFlags)0u,					// flags
91141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		imageSizeBytes,								// size
91241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BUFFER_USAGE_TRANSFER_DST_BIT,			// usage
91341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SHARING_MODE_EXCLUSIVE,					// sharingMode
91441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,											// queueFamilyIndexCount
91541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&queueFamilyIndex,							// pQueueFamilyIndices
91641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
91741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkBuffer>					readImageBuffer			(createBuffer(vk, vkDevice, &readImageBufferParams));
91841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const UniquePtr<Allocation>				readImageBufferMemory	(memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
91941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
92041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
92141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
92241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkImageCreateInfo					imageParams				=
92341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
92441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,									// sType
92541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,																// pNext
92641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,																		// flags
92741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_TYPE_2D,														// imageType
92841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R8G8B8A8_UNORM,												// format
92941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{ (deUint32)renderSize.x(), (deUint32)renderSize.y(), 1 },				// extent
93041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,																		// mipLevels
93141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,																		// arraySize
93241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SAMPLE_COUNT_1_BIT,													// samples
93341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_TILING_OPTIMAL,												// tiling
93441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT,	// usage
93541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SHARING_MODE_EXCLUSIVE,												// sharingMode
93641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,																		// queueFamilyIndexCount
93741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&queueFamilyIndex,														// pQueueFamilyIndices
93841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_UNDEFINED,												// initialLayout
93941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
94041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
94141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkImage>					image					(createImage(vk, vkDevice, &imageParams));
94241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const UniquePtr<Allocation>				imageMemory				(memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any));
94341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
94441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset()));
94541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
94641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkAttachmentDescription			colorAttDesc			=
94741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
94841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// flags
94941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R8G8B8A8_UNORM,						// format
95041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SAMPLE_COUNT_1_BIT,							// samples
95141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,					// loadOp
95241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,					// storeOp
95341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE,				// stencilLoadOp
95441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_STORE_OP_DONT_CARE,				// stencilStoreOp
95541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// initialLayout
95641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// finalLayout
95741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
95841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkAttachmentReference				colorAttRef				=
95941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
96041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// attachment
96141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// layout
96241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
96341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkAttachmentReference				resolveAttRef			=
96441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
96541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_ATTACHMENT_UNUSED,
96641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL
96741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
96841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkSubpassDescription				subpassDesc				=
96941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
97041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VkSubpassDescriptionFlags)0u,					// flags
97141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_PIPELINE_BIND_POINT_GRAPHICS,				// pipelineBindPoint
97241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// inputAttachmentCount
97341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pInputAttachments
97441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,												// colorAttachmentCount
97541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&colorAttRef,									// pColorAttachments
97641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&resolveAttRef,									// pResolveAttachments
97741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// depthStencilAttachment
97841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// preserveAttachmentCount
97941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pPreserveAttachments
98041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
98141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkRenderPassCreateInfo			renderPassParams		=
98241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
98341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,		// sType
98441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pNext
98541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// flags
98641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,												// attachmentCount
98741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&colorAttDesc,									// pAttachments
98841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,												// subpassCount
98941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&subpassDesc,									// pSubpasses
99041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// dependencyCount
99141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pDependencies
99241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
99341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkRenderPass>				renderPass				(createRenderPass(vk, vkDevice, &renderPassParams));
99441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
99541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkImageViewCreateInfo				colorAttViewParams		=
99641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
99741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// sType
99841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,										// pNext
99941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,												// flags
100041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*image,											// image
100141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_IMAGE_VIEW_TYPE_2D,							// viewType
100241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R8G8B8A8_UNORM,						// format
100341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
100441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_R,
100541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_G,
100641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_B,
100741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPONENT_SWIZZLE_A
100841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},												// components
100941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
101041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_ASPECT_COLOR_BIT,						// aspectMask
101141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,												// baseMipLevel
101241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,												// levelCount
101341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,												// baseArrayLayer
101441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,												// layerCount
101541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},												// subresourceRange
101641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
101741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkImageView>				colorAttView			(createImageView(vk, vkDevice, &colorAttViewParams));
101841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
101941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Pipeline layout
102041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineLayoutCreateInfo		pipelineLayoutParams	=
102141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
102241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,			// sType
102341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
102441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(vk::VkPipelineLayoutCreateFlags)0,
102541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// setLayoutCount
102641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pSetLayouts
102741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// pushConstantRangeCount
102841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pPushConstantRanges
102941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
103041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkPipelineLayout>			pipelineLayout			(createPipelineLayout(vk, vkDevice, &pipelineLayoutParams));
103141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
103241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Shaders
103341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkShaderModule>			vertShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0));
103441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkShaderModule>			fragShaderModule		(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0));
103541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
103641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Pipeline
103741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkSpecializationInfo				emptyShaderSpecParams	=
103841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
103941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// mapEntryCount
104041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pMap
104141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0,														// dataSize
104241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pData
104341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
104441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineShaderStageCreateInfo	shaderStageParams[]	=
104541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
104641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
104741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
104841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,												// pNext
104941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,														// flags
105041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_SHADER_STAGE_VERTEX_BIT,								// stage
105141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*vertShaderModule,										// module
105241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			"main",													// pName
105341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&emptyShaderSpecParams,									// pSpecializationInfo
105441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},
105541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
105641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
105741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,												// pNext
105841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,														// flags
105941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
106041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*fragShaderModule,										// module
106141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			"main",													// pName
106241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&emptyShaderSpecParams,									// pSpecializationInfo
106341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		}
106441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
106541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineDepthStencilStateCreateInfo	depthStencilParams		=
106641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
106741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
106841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
106941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
107041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// depthTestEnable
107141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// depthWriteEnable
107241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
107341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// depthBoundsTestEnable
107441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// stencilTestEnable
107541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
107641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// failOp
107741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// passOp
107841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// depthFailOp
107941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPARE_OP_ALWAYS,										// compareOp
108041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// compareMask
108141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// writeMask
108241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// reference
108341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// front
108441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
108541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// failOp
108641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// passOp
108741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STENCIL_OP_KEEP,											// depthFailOp
108841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_COMPARE_OP_ALWAYS,										// compareOp
108941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// compareMask
109041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// writeMask
109141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// reference
109241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// back;
109341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		-1.0f,														//	float				minDepthBounds;
109441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		+1.0f,														//	float				maxDepthBounds;
109541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
109641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkViewport						viewport0				=
109741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
109841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// x
109941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// y
110041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(float)renderSize.x(),										// width
110141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(float)renderSize.y(),										// height
110241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// minDepth
110341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1.0f,														// maxDepth
110441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
110541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkRect2D							scissor0				=
110641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
110741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
110841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// x
110941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,															// y
111041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// offset
111141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
111241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.x(),									// width
111341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.y(),									// height
111441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		},															// extent;
111541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
111641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineViewportStateCreateInfo		viewportParams			=
111741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
111841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,		// sType
111941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
112041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
112141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// viewportCount
112241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&viewport0,													// pViewports
112341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// scissorCount
112441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&scissor0													// pScissors
112541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
112641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkSampleMask							sampleMask				= ~0u;
112741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineMultisampleStateCreateInfo	multisampleParams		=
112841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
112941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// sType
113041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
113141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
113241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_SAMPLE_COUNT_1_BIT,										// rasterizationSamples
113341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// sampleShadingEnable
113441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// minSampleShading
113541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&sampleMask,												// sampleMask
113641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// alphaToCoverageEnable
113741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// alphaToOneEnable
113841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
113941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineRasterizationStateCreateInfo	rasterParams		=
114041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
114141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,	// sType
114241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
114341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
114441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_TRUE,													// depthClampEnable
114541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// rasterizerDiscardEnable
114641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_POLYGON_MODE_FILL,										// polygonMode
114741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CULL_MODE_NONE,											// cullMode
114841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FRONT_FACE_COUNTER_CLOCKWISE,							// frontFace
114941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// depthBiasEnable
115041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// depthBiasConstantFactor
115141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// depthBiasClamp
115241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0.0f,														// depthBiasSlopeFactor
115341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1.0f,														// lineWidth
115441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
115541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyParams	=
115641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
115741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
115841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,														// pNext
115941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,																// flags
116041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
116141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,														// primitiveRestartEnable
116241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
116341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkVertexInputBindingDescription		vertexBinding0			=
116441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
116541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// binding
116641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)sizeof(tcu::Vec4),							// stride
116741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_VERTEX_INPUT_RATE_VERTEX,							// inputRate
116841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
116941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkVertexInputAttributeDescription		vertexAttrib0			=
117041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
117141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// location
117241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// binding
117341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FORMAT_R32G32B32A32_SFLOAT,							// format
117441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// offset
117541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
117641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineVertexInputStateCreateInfo	vertexInputStateParams	=
117741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
117841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	// sType
117941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
118041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
118141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// vertexBindingDescriptionCount
118241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&vertexBinding0,											// pVertexBindingDescriptions
118341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// vertexAttributeDescriptionCount
118441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&vertexAttrib0,												// pVertexAttributeDescriptions
118541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
118641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineColorBlendAttachmentState	attBlendParams			=
118741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
118841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_FALSE,													// blendEnable
118941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ONE,										// srcColorBlendFactor
119041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ZERO,										// dstColorBlendFactor
119141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_OP_ADD,											// colorBlendOp
119241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ONE,										// srcAlphaBlendFactor
119341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_FACTOR_ZERO,										// dstAlphaBlendFactor
119441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_BLEND_OP_ADD,											// alphaBlendOp
119541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(VK_COLOR_COMPONENT_R_BIT|
119641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		 VK_COLOR_COMPONENT_G_BIT|
119741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		 VK_COLOR_COMPONENT_B_BIT|
119841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		 VK_COLOR_COMPONENT_A_BIT),									// colorWriteMask
119941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
120041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkPipelineColorBlendStateCreateInfo	blendParams				=
120141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
120241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// sType
120341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
120441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,															// flags
120541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_FALSE,													// logicOpEnable
120641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_LOGIC_OP_COPY,											// logicOp
120741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,															// attachmentCount
120841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&attBlendParams,											// pAttachments
120941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{ 0.0f, 0.0f, 0.0f, 0.0f },									// blendConstants[4]
121041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
121141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkGraphicsPipelineCreateInfo		pipelineParams			=
121241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
121341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,		// sType
121441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
121541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// flags
121641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams),		// stageCount
121741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		shaderStageParams,										// pStages
121841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&vertexInputStateParams,								// pVertexInputState
121941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&inputAssemblyParams,									// pInputAssemblyState
122041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pTessellationState
122141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&viewportParams,										// pViewportState
122241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&rasterParams,											// pRasterizationState
122341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&multisampleParams,										// pMultisampleState
122441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&depthStencilParams,									// pDepthStencilState
122541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&blendParams,											// pColorBlendState
122641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(const VkPipelineDynamicStateCreateInfo*)DE_NULL,		// pDynamicState
122741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*pipelineLayout,										// layout
122841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*renderPass,											// renderPass
122941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// subpass
123041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// basePipelineHandle
123141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// basePipelineIndex
123241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
123341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
123441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkPipeline>				pipeline				(createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams));
123541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
123641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Framebuffer
123741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkFramebufferCreateInfo			framebufferParams		=
123841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
123941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,				// sType
124041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
124141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// flags
124241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*renderPass,											// renderPass
124341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,														// attachmentCount
124441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		&*colorAttView,											// pAttachments
124541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)renderSize.x(),								// width
124641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(deUint32)renderSize.y(),								// height
124741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,														// layers
124841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
124941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkFramebuffer>				framebuffer				(createFramebuffer(vk, vkDevice, &framebufferParams));
125041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
125141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkCommandPoolCreateInfo			cmdPoolParams			=
125241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
125341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,					// sType
125441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,													// pNext
125541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,			// flags
125641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		queueFamilyIndex,											// queueFamilyIndex
125741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
125841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkCommandPool>				cmdPool					(createCommandPool(vk, vkDevice, &cmdPoolParams));
125941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
126041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Command buffer
126141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkCommandBufferAllocateInfo		cmdBufParams			=
126241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
126341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,			// sType
126441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
126541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		*cmdPool,												// pool
126641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_COMMAND_BUFFER_LEVEL_PRIMARY,						// level
126741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		1u,														// bufferCount
126841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
126941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const Unique<VkCommandBuffer>			cmdBuf					(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
127041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
127141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	const VkCommandBufferBeginInfo			cmdBufBeginParams		=
127241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
127341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// sType
127441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		DE_NULL,												// pNext
127541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		0u,														// flags
127641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		(const VkCommandBufferInheritanceInfo*)DE_NULL,
127741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	};
127841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
127941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Record commands
128041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams));
128141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
128241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
128341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkMemoryBarrier		vertFlushBarrier	=
128441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
128541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_MEMORY_BARRIER,			// sType
128641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
128741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_HOST_WRITE_BIT,					// srcAccessMask
128841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,		// dstAccessMask
128941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
129041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkImageMemoryBarrier	colorAttBarrier		=
129141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
129241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
129341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
129441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,											// srcAccessMask
129541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(VK_ACCESS_COLOR_ATTACHMENT_READ_BIT|
129641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT),		// dstAccessMask
129741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_UNDEFINED,					// oldLayout
129841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// newLayout
129941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// srcQueueFamilyIndex
130041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// dstQueueFamilyIndex
130141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*image,										// image
130241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
130341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
130441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseMipLevel
130541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// levelCount
130641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseArrayLayer
130741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// layerCount
130841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			}											// subresourceRange
130941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
131041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika 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);
131141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
131241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
131341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
131441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkClearValue			clearValue		= makeClearValueColorF32(clearColor[0],
131541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi																			 clearColor[1],
131641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi																			 clearColor[2],
131741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi																			 clearColor[3]);
131841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkRenderPassBeginInfo	passBeginParams	=
131941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
132041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,			// sType
132141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,											// pNext
132241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*renderPass,										// renderPass
132341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*framebuffer,										// framebuffer
132441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
132541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				{ 0, 0 },
132641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				{ (deUint32)renderSize.x(), (deUint32)renderSize.y() }
132741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			},													// renderArea
132841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,													// clearValueCount
132941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&clearValue,										// pClearValues
133041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
133141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_SUBPASS_CONTENTS_INLINE);
133241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
133341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
133441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
133541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
133641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkDeviceSize bindingOffset = 0;
133741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset);
133841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
133941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u);
134041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	vk.cmdEndRenderPass(*cmdBuf);
134141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
134241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
134341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkImageMemoryBarrier	renderFinishBarrier	=
134441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
134541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// sType
134641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
134741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// outputMask
134841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_TRANSFER_READ_BIT,				// inputMask
134941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// oldLayout
135041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// newLayout
135141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// srcQueueFamilyIndex
135241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// dstQueueFamilyIndex
135341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*image,										// image
135441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
135541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,					// aspectMask
135641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseMipLevel
135741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// mipLevels
135841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,											// baseArraySlice
135941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,											// arraySize
136041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			}											// subresourceRange
136141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
136241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika 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);
136341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
136441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
136541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
136641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkBufferImageCopy	copyParams	=
136741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
136841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(VkDeviceSize)0u,						// bufferOffset
136941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.x(),				// bufferRowLength
137041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(deUint32)renderSize.y(),				// bufferImageHeight
137141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
137241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,				// aspectMask
137341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,										// mipLevel
137441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				0u,										// baseArrayLayer
137541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u,										// layerCount
137641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			},										// imageSubresource
137741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{ 0u, 0u, 0u },							// imageOffset
137841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			{
137941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				(deUint32)renderSize.x(),
138041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				(deUint32)renderSize.y(),
138141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				1u
138241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			}										// imageExtent
138341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
138441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, &copyParams);
138541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
138641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
138741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
138841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkBufferMemoryBarrier	copyFinishBarrier	=
138941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
139041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// sType
139141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,									// pNext
139241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_TRANSFER_WRITE_BIT,				// srcAccessMask
139341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_ACCESS_HOST_READ_BIT,					// dstAccessMask
139441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// srcQueueFamilyIndex
139541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			queueFamilyIndex,							// dstQueueFamilyIndex
139641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			*readImageBuffer,							// buffer
139741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,											// offset
139841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			imageSizeBytes								// size
139941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
140041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika 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);
140141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
140241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
140341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	VK_CHECK(vk.endCommandBuffer(*cmdBuf));
140441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
140541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Upload vertex data
140641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
140741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkMappedMemoryRange	range			=
140841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
140941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
141041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
141141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			vertexBufferMemory->getMemory(),		// memory
141241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0,										// offset
141341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(VkDeviceSize)sizeof(vertices),			// size
141441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
141541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		void*						vertexBufPtr	= vertexBufferMemory->getHostPtr();
141641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
141741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices));
141841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range));
141941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
142041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
142141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Submit & wait for completion
142241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
142341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkFenceCreateInfo	fenceParams	=
142441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
142541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// sType
142641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
142741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,										// flags
142841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
142941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkSubmitInfo		submitInfo	=
143041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
143141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_SUBMIT_INFO,			// sType
143241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
143341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,										// waitSemaphoreCount
143441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pWaitSemaphores
143541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			(const VkPipelineStageFlags*)DE_NULL,
143641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			1u,										// commandBufferCount
143741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			&cmdBuf.get(),							// pCommandBuffers
143841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0u,										// signalSemaphoreCount
143941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pSignalSemaphores
144041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
144141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const Unique<VkFence>	fence		(createFence(vk, vkDevice, &fenceParams));
144241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
144341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
144441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull));
144541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
144641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
144741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	// Read results, render reference, compare
144841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	{
144941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const tcu::TextureFormat			tcuFormat		= vk::mapVkFormat(colorFormat);
145041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const VkMappedMemoryRange			range			=
145141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
145241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType
145341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			DE_NULL,								// pNext
145441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			readImageBufferMemory->getMemory(),		// memory
145541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			0,										// offset
145641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			imageSizeBytes,							// size
145741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		};
145841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		const tcu::ConstPixelBufferAccess	resultAccess	(tcuFormat, renderSize.x(), renderSize.y(), 1, readImageBufferMemory->getHostPtr());
145941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
146041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range));
146141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
146241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		{
146341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			tcu::TextureLevel	refImage		(tcuFormat, renderSize.x(), renderSize.y());
146441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			const tcu::UVec4	threshold		(0u);
146541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			const tcu::IVec3	posDeviation	(1,1,0);
146641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
146741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			tcu::clear(refImage.getAccess(), clearColor);
146841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			renderReferenceTriangle(refImage.getAccess(), vertices);
146941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
147041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			if (tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(),
147141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  "ComparisonResult",
147241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  "Image comparison result",
147341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  refImage.getAccess(),
147441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  resultAccess,
147541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  threshold,
147641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  posDeviation,
147741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  false,
147841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi														  tcu::COMPARE_LOG_RESULT))
147941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				return tcu::TestStatus::pass("Rendering succeeded");
148041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi			else
148141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi				return tcu::TestStatus::fail("Image comparison failed");
148241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi		}
148341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	}
148441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
148541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	return tcu::TestStatus::pass("Rendering succeeded");
148641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi}
148741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi
148834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // anonymous
148934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
149034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestCaseGroup* createSmokeTests (tcu::TestContext& testCtx)
149134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{
149234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	de::MovePtr<tcu::TestCaseGroup>	smokeTests	(new tcu::TestCaseGroup(testCtx, "smoke", "Smoke Tests"));
149334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
149441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCase				(smokeTests.get(), "create_sampler",			"",	createSamplerTest);
149541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "create_shader",				"", createShaderProgs,		createShaderModuleTest);
149641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "triangle",					"", createTriangleProgs,	renderTriangleTest);
149741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "asm_triangle",				"", createTriangleAsmProgs,	renderTriangleTest);
149841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi	addFunctionCaseWithPrograms	(smokeTests.get(), "unused_resolve_attachment",	"", createTriangleProgs,	renderTriangleUnusedResolveAttachmentTest);
149934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
150034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos	return smokeTests.release();
150134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos}
150234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos
150334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // api
150434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // vkt
1505