vktSynchronizationSmokeTests.cpp revision 7aa88a4dca6854ae703a357361a55c7be60823ab
1378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman/*-------------------------------------------------------------------------
2378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * Vulkan Conformance Tests
3378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * ------------------------
4378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *
5378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * Copyright (c) 2016 Google Inc.
6378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *
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
10378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
12378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *
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.
18378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *
19378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *//*!
20378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * \file
21378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * \brief Platform Synchronization tests
22378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *//*--------------------------------------------------------------------*/
23378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
247aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski#include "vktSynchronizationSmokeTests.hpp"
25378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
26378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vktTestCaseUtil.hpp"
27378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
28378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkPlatform.hpp"
29378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkStrUtil.hpp"
30378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkRef.hpp"
31378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkRefUtil.hpp"
32378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkDeviceUtil.hpp"
33378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
34378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "tcuTestLog.hpp"
35378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "tcuFormatUtil.hpp"
36378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
37378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "deUniquePtr.hpp"
38378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "deThread.hpp"
39378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkMemUtil.hpp"
40378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkQueryUtil.hpp"
41378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkPrograms.hpp"
42378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkTypeUtil.hpp"
43378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
443241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos#include <limits>
453241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos
46378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmannamespace vkt
47378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
487aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowskinamespace synchronization
497aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski{
50378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
51378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing namespace vk;
52378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing namespace tcu;
53378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
54378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmannamespace
55378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
56378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
57378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing std::vector;
58378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing std::string;
59378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing tcu::TestLog;
60378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing de::UniquePtr;
61378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing de::MovePtr;
62378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
63378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstatic const deUint64 DEFAULT_TIMEOUT = 2ull*1000*1000*1000; //!< 2 seconds in nanoseconds
64378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
65378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid buildShaders (SourceCollections& shaderCollection)
66378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
67378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	shaderCollection.glslSources.add("glslvert") <<
68378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		glu::VertexSource(
69378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"#version 310 es\n"
70378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"precision mediump float;\n"
71378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"layout (location = 0) in vec4 vertexPosition;\n"
72378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"void main()\n"
73378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"{\n"
74378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"	gl_Position = vertexPosition;\n"
75378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"}\n");
76378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
77378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	shaderCollection.glslSources.add("glslfrag") <<
78378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		glu::FragmentSource(
79378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"#version 310 es\n"
80378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"precision mediump float;\n"
81378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"layout (location = 0) out vec4 outputColor;\n"
82378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"void main()\n"
83378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"{\n"
84378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"	outputColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
85378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman				"}\n");
86378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
87378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
88271157f1dfdc1129586f47e8064874d107f3edaeDae KimMove<VkDevice> createTestDevice (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, deUint32 *outQueueFamilyIndex)
89378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
90378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceQueueCreateInfo		queueInfo;
91378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceCreateInfo			deviceInfo;
92378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	size_t						queueNdx;
93226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	const deUint32				queueCount					= 2u;
94226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	const float					queuePriority[queueCount]	= { 1.0f, 1.0f };
95378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
96378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const vector<VkQueueFamilyProperties>	queueProps				= getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
97378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkPhysicalDeviceFeatures			physicalDeviceFeatures	= getPhysicalDeviceFeatures(vki, physicalDevice);
98378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
99378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
100378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
101271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		if ((queueProps[queueNdx].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT && (queueProps[queueNdx].queueCount >= queueCount))
102378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman			break;
103378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
104378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
105271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	if (queueNdx >= queueProps.size())
106271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	{
107271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		// No queue family index found
108271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		std::ostringstream msg;
109271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		msg << "Cannot create device with " << queueCount << " graphics queues";
110271157f1dfdc1129586f47e8064874d107f3edaeDae Kim
111271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		throw tcu::NotSupportedError(msg.str());
112271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	}
113271157f1dfdc1129586f47e8064874d107f3edaeDae Kim
114378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deMemset(&queueInfo,	0, sizeof(queueInfo));
115378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deMemset(&deviceInfo,	0, sizeof(deviceInfo));
116378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
117ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&queueInfo, 0xcd, sizeof(queueInfo));
118378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	queueInfo.sType							= VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
119378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	queueInfo.pNext							= DE_NULL;
120378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	queueInfo.flags							= (VkDeviceQueueCreateFlags)0u;
121378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	queueInfo.queueFamilyIndex				= (deUint32)queueNdx;
122271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	queueInfo.queueCount					= queueCount;
123226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	queueInfo.pQueuePriorities				= queuePriority;
124378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
125ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&deviceInfo, 0xcd, sizeof(deviceInfo));
126378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.sType						= VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
127378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.pNext						= DE_NULL;
1287aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	deviceInfo.flags						= (VkDeviceCreateFlags)0u;
129378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.queueCreateInfoCount			= 1u;
130378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.pQueueCreateInfos			= &queueInfo;
131378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.enabledExtensionCount		= 0u;
132378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.ppEnabledExtensionNames		= DE_NULL;
133378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.enabledLayerCount			= 0u;
134378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.ppEnabledLayerNames			= DE_NULL;
135378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInfo.pEnabledFeatures				= &physicalDeviceFeatures;
136378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
137271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	*outQueueFamilyIndex					= queueInfo.queueFamilyIndex;
138271157f1dfdc1129586f47e8064874d107f3edaeDae Kim
139378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return createDevice(vki, physicalDevice, &deviceInfo);
140378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
141378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
142378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct BufferParameters
143378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
144378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const void*						memory;
145378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceSize					size;
146378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkBufferUsageFlags				usage;
147378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSharingMode					sharingMode;
148378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						queueFamilyCount;
149378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const deUint32*					queueFamilyIndex;
150378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkAccessFlags					inputBarrierFlags;
151378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
152378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
153378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct Buffer
154378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
155378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>				allocation;
156378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkMemoryBarrier> 		memoryBarrier;
157378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkBuffer>				buffer;
158378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
159378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
160f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createVulkanBuffer (const DeviceInterface& vkd, VkDevice device, Allocator& allocator, const BufferParameters& bufferParameters, Buffer& buffer, MemoryRequirement visibility)
161378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
162f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkBufferCreateInfo	bufferCreateParams;
163378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
164ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&bufferCreateParams, 0xcd, sizeof(bufferCreateParams));
165378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.sType					= VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
166378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.pNext					= DE_NULL;
167378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.flags					= 0;
168378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.size						= bufferParameters.size;
169378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.usage					= bufferParameters.usage;
170378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.sharingMode				= bufferParameters.sharingMode;
171378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.queueFamilyIndexCount	= bufferParameters.queueFamilyCount;
172378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferCreateParams.pQueueFamilyIndices		= bufferParameters.queueFamilyIndex;
173378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
174f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	buffer.buffer		= createBuffer(vkd, device, &bufferCreateParams);
175f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	buffer.allocation	= allocator.allocate(getBufferMemoryRequirements(vkd, device, *buffer.buffer), visibility);
176378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
177f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VK_CHECK(vkd.bindBufferMemory(device, *buffer.buffer, buffer.allocation->getMemory(), buffer.allocation->getOffset()));
178378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
179f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	// If caller provides a host memory buffer for the allocation, then go
180f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	// ahead and copy the provided data into the allocation and update the
181f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	// barrier list with the associated access
182f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	if (bufferParameters.memory != DE_NULL)
183378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
184f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		VkMemoryBarrier				barrier;
185f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		VkMappedMemoryRange			range;
186f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
187f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		deMemset(&range, 0xcd, sizeof(range));
188f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		range.sType		= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
189f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		range.pNext		= DE_NULL;
190f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		range.memory	= buffer.allocation->getMemory();
191f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		range.offset	= buffer.allocation->getOffset();
192f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		range.size		= bufferParameters.size;
193f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
194f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		deMemcpy(buffer.allocation->getHostPtr(), bufferParameters.memory, (size_t)bufferParameters.size);
195f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		VK_CHECK(vkd.flushMappedMemoryRanges(device, 1, &range));
196f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
197f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		deMemset(&barrier, 0xcd, sizeof(barrier));
198f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		barrier.sType			= VK_STRUCTURE_TYPE_MEMORY_BARRIER;
199f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		barrier.pNext			= DE_NULL;
200f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		barrier.srcAccessMask	= VK_ACCESS_HOST_WRITE_BIT;
201f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		barrier.dstAccessMask	= bufferParameters.inputBarrierFlags;
202f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
203f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		buffer.memoryBarrier.push_back(barrier);
204378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
205378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
206378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
207378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct ImageParameters
208378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
209378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImageType							imageType;
210378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFormat							format;
211378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkExtent3D							extent3D;
212378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32							mipLevels;
213378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSampleCountFlagBits				samples;
214378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImageTiling						tiling;
215378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkBufferUsageFlags					usage;
216378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSharingMode						sharingMode;
217378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32							queueFamilyCount;
218378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const deUint32*						queueFamilyNdxList;
219378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImageLayout						initialLayout;
220378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImageLayout						finalLayout;
221378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkAccessFlags						barrierInputMask;
222378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
223378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
224378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct Image
225378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
226378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkImage>					image;
227378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkImageView>				imageView;
228378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>					allocation;
229378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkImageMemoryBarrier>		imageMemoryBarrier;
230378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
231378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
232f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createVulkanImage (const DeviceInterface& vkd, VkDevice device, Allocator& allocator, const ImageParameters& imageParameters, Image& image, MemoryRequirement visibility)
233378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
234f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkComponentMapping			componentMap;
235f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkImageSubresourceRange		subresourceRange;
236f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkImageViewCreateInfo		imageViewCreateInfo;
237f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkImageCreateInfo			imageCreateParams;
238f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkImageMemoryBarrier		imageBarrier;
239378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
240ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&imageCreateParams, 0xcd, sizeof(imageCreateParams));
241378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.sType					= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
242378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.pNext					= DE_NULL;
243378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.flags					= 0;
244378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.imageType				= imageParameters.imageType;
245378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.format				= imageParameters.format;
246378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.extent				= imageParameters.extent3D;
247378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.mipLevels				= imageParameters.mipLevels;
248378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.arrayLayers			= 1;
249378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.samples				= imageParameters.samples;
250378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.tiling				= imageParameters.tiling;
251378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.usage					= imageParameters.usage;
252378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.sharingMode			= imageParameters.sharingMode;
253378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.queueFamilyIndexCount	= imageParameters.queueFamilyCount;
254378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.pQueueFamilyIndices	= imageParameters.queueFamilyNdxList;
255378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageCreateParams.initialLayout			= imageParameters.initialLayout;
256378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
257f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	image.image			= createImage(vkd, device, &imageCreateParams);
258f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	image.allocation	= allocator.allocate(getImageMemoryRequirements(vkd, device, *image.image), visibility);
259f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
260f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VK_CHECK(vkd.bindImageMemory(device, *image.image, image.allocation->getMemory(), image.allocation->getOffset()));
261f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
262f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	componentMap.r							= VK_COMPONENT_SWIZZLE_R;
263f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	componentMap.g							= VK_COMPONENT_SWIZZLE_G;
264f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	componentMap.b							= VK_COMPONENT_SWIZZLE_B;
265f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	componentMap.a							= VK_COMPONENT_SWIZZLE_A;
266f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
267f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	subresourceRange.aspectMask				= VK_IMAGE_ASPECT_COLOR_BIT;
268f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	subresourceRange.baseMipLevel			= 0;
269f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	subresourceRange.levelCount				= imageParameters.mipLevels;
270f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	subresourceRange.baseArrayLayer			= 0;
271f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	subresourceRange.layerCount				= 1;
272f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
273f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	deMemset(&imageViewCreateInfo, 0xcd, sizeof(imageViewCreateInfo));
274f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.sType				= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
275f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.pNext				= DE_NULL;
276f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.flags				= 0;
277f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.image				= image.image.get();
278f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.viewType			= VK_IMAGE_VIEW_TYPE_2D;
279f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.format				= imageParameters.format;
280f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.components			= componentMap;
281f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageViewCreateInfo.subresourceRange	= subresourceRange;
282f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
283f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	image.imageView	= createImageView(vkd, device, &imageViewCreateInfo);
284f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
285f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	deMemset(&imageBarrier, 0xcd, sizeof(imageBarrier));
286f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.sType					= VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
287f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.pNext					= DE_NULL;
288f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.srcAccessMask			= 0;
289f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.dstAccessMask			= imageParameters.barrierInputMask;
290f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.oldLayout				= imageParameters.initialLayout;
291f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.newLayout				= imageParameters.finalLayout;
292f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.srcQueueFamilyIndex	= imageParameters.queueFamilyNdxList[0];
293f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.dstQueueFamilyIndex	= imageParameters.queueFamilyNdxList[imageParameters.queueFamilyCount-1];
294f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.image					= image.image.get();
295f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	imageBarrier.subresourceRange		= subresourceRange;
296f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
297f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	image.imageMemoryBarrier.push_back(imageBarrier);
298378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
299378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
300378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct RenderPassParameters
301378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
302378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFormat				colorFormat;
303378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSampleCountFlagBits	colorSamples;
304378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
305378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
306f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid  createColorOnlyRenderPass (const DeviceInterface& vkd, VkDevice device, const RenderPassParameters& renderPassParameters, vk::Move<VkRenderPass>& renderPass)
307378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
308378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkAttachmentDescription				colorAttachmentDesc;
309378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkAttachmentReference				colorAttachmentRef;
310378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkAttachmentReference				stencilAttachmentRef;
311378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSubpassDescription				subpassDesc;
312378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRenderPassCreateInfo				renderPassParams;
313378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRenderPass						newRenderPass;
314378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
315378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.flags			= 0;
316378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.format			= renderPassParameters.colorFormat;
317378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.samples			= renderPassParameters.colorSamples;
318378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.loadOp			= VK_ATTACHMENT_LOAD_OP_CLEAR;
319378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.storeOp			= VK_ATTACHMENT_STORE_OP_STORE;
320378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.stencilLoadOp	= VK_ATTACHMENT_LOAD_OP_DONT_CARE;
321378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.stencilStoreOp	= VK_ATTACHMENT_STORE_OP_DONT_CARE;
322378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.initialLayout	= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
323378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentDesc.finalLayout		= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
324378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
325378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentRef.attachment		= 0;
326378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	colorAttachmentRef.layout			= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
327378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
3286cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos	stencilAttachmentRef.attachment		= VK_ATTACHMENT_UNUSED;
329378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	stencilAttachmentRef.layout			= VK_IMAGE_LAYOUT_UNDEFINED;
330378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
331378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.flags					= 0;
332378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.pipelineBindPoint		= VK_PIPELINE_BIND_POINT_GRAPHICS;
333378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.inputAttachmentCount	= 0;
334378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.pInputAttachments		= DE_NULL;
335378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.colorAttachmentCount	= 1;
336378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.pColorAttachments		= &colorAttachmentRef;
337378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.pResolveAttachments		= DE_NULL;
338378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.pDepthStencilAttachment	= &stencilAttachmentRef;
339378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.preserveAttachmentCount	= 0;
340378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	subpassDesc.pPreserveAttachments	= DE_NULL;
341378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
342ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&renderPassParams, 0xcd, sizeof(renderPassParams));
343378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.sType				= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
344378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.pNext				= DE_NULL;
345378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.flags				= 0;
346378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.attachmentCount	= 1;
347378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.pAttachments		= &colorAttachmentDesc;
348378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.subpassCount		= 1;
349378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.pSubpasses			= &subpassDesc;
350378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.dependencyCount	= 0;
351378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParams.pDependencies		= DE_NULL;
352378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
353f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	renderPass = createRenderPass(vkd, device, &renderPassParams);
354378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
355378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
356378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct ShaderDescParams
357378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
358f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkShaderModule			shaderModule;
359378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkShaderStageFlagBits	stage;
360378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
361378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
362378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct VertexDesc
363378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
364378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32	location;
365378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFormat	format;
366378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32	stride;
367378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32	offset;
368378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
369378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
370378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid createVertexInfo (const vector<VertexDesc>& vertexDesc, vector<VkVertexInputBindingDescription>& bindingList, vector<VkVertexInputAttributeDescription>& attrList, VkPipelineVertexInputStateCreateInfo& vertexInputState)
371378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
372378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (vector<VertexDesc>::const_iterator vertDescIter = vertexDesc.begin(); vertDescIter != vertexDesc.end(); vertDescIter++)
373378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
374378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		deUint32							bindingId = 0;
375378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		VkVertexInputBindingDescription		bindingDesc;
376378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		VkVertexInputAttributeDescription	attrDesc;
377378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
378378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bindingDesc.binding		= bindingId;
379378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bindingDesc.stride		= vertDescIter->stride;
380378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bindingDesc.inputRate	= VK_VERTEX_INPUT_RATE_VERTEX;
381378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bindingList.push_back(bindingDesc);
382378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
383378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		attrDesc.location		= vertDescIter->location;
384378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		attrDesc.binding		= bindingId;
385378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		attrDesc.format			= vertDescIter->format;
386378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		attrDesc.offset			= vertDescIter->offset;
387378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		attrList.push_back(attrDesc);
388378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
389378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bindingId++;
390378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
391378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
392ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&vertexInputState, 0xcd, sizeof(vertexInputState));
3937aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	vertexInputState.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
3947aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	vertexInputState.pNext = DE_NULL;
3957aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	vertexInputState.flags = 0u;
396378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexInputState.vertexBindingDescriptionCount = (deUint32)bindingList.size();
397378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexInputState.pVertexBindingDescriptions = &bindingList[0];
398378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexInputState.vertexAttributeDescriptionCount = (deUint32)attrList.size();
399378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexInputState.pVertexAttributeDescriptions = &attrList[0];
400378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
401378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
402f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createCommandBuffer (const DeviceInterface& deviceInterface, const VkDevice device, const deUint32 queueFamilyNdx, vk::Move<VkCommandBuffer>* commandBufferRef, vk::Move<VkCommandPool>* commandPoolRef)
403378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
404ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkCommandPool>		commandPool;
405378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandPoolCreateInfo		commandPoolInfo;
406378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBufferAllocateInfo	commandBufferInfo;
407378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBuffer				commandBuffer;
408378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
409ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&commandPoolInfo, 0xcd, sizeof(commandPoolInfo));
410378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandPoolInfo.sType				= VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
411378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandPoolInfo.pNext				= DE_NULL;
412378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandPoolInfo.flags				= 0;
413378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandPoolInfo.queueFamilyIndex	= queueFamilyNdx;
414378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
415ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	commandPool = createCommandPool(deviceInterface, device, &commandPoolInfo, DE_NULL);
416378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
417ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&commandBufferInfo, 0xcd, sizeof(commandBufferInfo));
418378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.sType					= VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
419378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.pNext					= DE_NULL;
420ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	commandBufferInfo.commandPool			= commandPool.get();
421378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.level					= VK_COMMAND_BUFFER_LEVEL_PRIMARY;
422378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.commandBufferCount	= 1;
423378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
424378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.allocateCommandBuffers(device, &commandBufferInfo, &commandBuffer));
425ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	*commandBufferRef = vk::Move<VkCommandBuffer>(vk::check<VkCommandBuffer>(commandBuffer), Deleter<VkCommandBuffer>(deviceInterface, device, commandPool.get()));
426ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	*commandPoolRef = commandPool;
427378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
428378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
429378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid createFences (const DeviceInterface& deviceInterface, VkDevice device, bool signaled, deUint32 numFences, VkFence* fence)
430378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
431378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFenceCreateInfo		fenceState;
432378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFenceCreateFlags		signalFlag = signaled ? VK_FENCE_CREATE_SIGNALED_BIT : 0;
433378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
434ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&fenceState, 0xcd, sizeof(fenceState));
435378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fenceState.sType		= VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
436378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fenceState.pNext		= DE_NULL;
437378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fenceState.flags		= signalFlag;
438378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
439378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (deUint32 ndx = 0; ndx < numFences; ndx++)
440378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		VK_CHECK(deviceInterface.createFence(device, &fenceState, DE_NULL, &fence[ndx]));
441378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
442378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
443378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid destroyFences (const DeviceInterface& deviceInterface, VkDevice device, deUint32 numFences, VkFence* fence)
444378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
445378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (deUint32 ndx = 0; ndx < numFences; ndx++)
446378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		deviceInterface.destroyFence(device, fence[ndx], DE_NULL);
447378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
448378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
449378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct RenderInfo
450378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
451378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deInt32							width;
452378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deInt32							height;
453378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						vertexBufferSize;
454378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkBuffer						vertexBuffer;
455378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImage							image;
456378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBuffer					commandBuffer;
457378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRenderPass					renderPass;
458378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFramebuffer					framebuffer;
4596222af852976871f07c00b792cae50eb458d0703Pyry Haulos	VkPipeline						pipeline;
460378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						mipLevels;
461378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const deUint32*					queueFamilyNdxList;
462378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						queueFamilyNdxCount;
463378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bool							waitEvent;
464378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkEvent							event;
465378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkImageMemoryBarrier>*	barriers;
466378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
467378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
468f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid  recordRenderPass (const DeviceInterface& deviceInterface, const RenderInfo& renderInfo)
469378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
470378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkDeviceSize					bindingOffset			= 0;
471378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkClearValue					clearValue				= makeClearValueColorF32(0.0, 0.0, 1.0, 1.0);
472378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRenderPassBeginInfo				renderPassBeginState;
473378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImageMemoryBarrier				renderBarrier;
474378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
475ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&renderPassBeginState, 0xcd, sizeof(renderPassBeginState));
476378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.sType						= VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
477378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.pNext						= DE_NULL;
478378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderPass					= renderInfo.renderPass;
479378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.framebuffer				= renderInfo.framebuffer;
480378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.offset.x		= 0;
481378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.offset.y		= 0;
482378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.extent.width	= renderInfo.width;
483378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.extent.height	= renderInfo.height;
484378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.clearValueCount			= 1;
485378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.pClearValues				= &clearValue;
486378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
487378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdBeginRenderPass(renderInfo.commandBuffer, &renderPassBeginState, VK_SUBPASS_CONTENTS_INLINE);
488378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (renderInfo.waitEvent)
489f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		deviceInterface.cmdWaitEvents(renderInfo.commandBuffer, 1, &renderInfo.event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, DE_NULL, 0, DE_NULL, 0, DE_NULL);
4906222af852976871f07c00b792cae50eb458d0703Pyry Haulos	deviceInterface.cmdBindPipeline(renderInfo.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, renderInfo.pipeline);
491378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdBindVertexBuffers(renderInfo.commandBuffer, 0u, 1u, &renderInfo.vertexBuffer, &bindingOffset);
492378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdDraw(renderInfo.commandBuffer, renderInfo.vertexBufferSize, 1, 0, 0);
493226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	deviceInterface.cmdEndRenderPass(renderInfo.commandBuffer);
494378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
495ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&renderBarrier, 0xcd, sizeof(renderBarrier));
496378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.sType								= VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
497378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.pNext								= DE_NULL;
498378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.srcAccessMask						= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
499378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.dstAccessMask						= VK_ACCESS_TRANSFER_READ_BIT;
500378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.oldLayout							= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
501378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.newLayout							= VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
502378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.srcQueueFamilyIndex				= renderInfo.queueFamilyNdxList[0];
503378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.dstQueueFamilyIndex				= renderInfo.queueFamilyNdxList[renderInfo.queueFamilyNdxCount-1];
504378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.image								= renderInfo.image;
505378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.aspectMask		= VK_IMAGE_ASPECT_COLOR_BIT;
506378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.baseMipLevel		= 0;
507378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.levelCount		= renderInfo.mipLevels;
508378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.baseArrayLayer	= 0;
509378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.layerCount		= 1;
510378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.barriers->push_back(renderBarrier);
511378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
512378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
513378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct TransferInfo
514378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
515378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBuffer					commandBuffer;
516378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						width;
517378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						height;
518378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImage							image;
519378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkBuffer						buffer;
520378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceSize					size;
521378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						mipLevel;
522378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkOffset3D						imageOffset;
523378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkBufferMemoryBarrier>*	barriers;
524378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
525378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
526f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid copyToCPU (const DeviceInterface& vkd, TransferInfo* transferInfo)
527378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
528f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkBufferImageCopy	copyState;
529378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
530378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.bufferOffset						= 0;
531378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.bufferRowLength					= transferInfo->width;
532378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.bufferImageHeight					= transferInfo->height;
533378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.aspectMask		= VK_IMAGE_ASPECT_COLOR_BIT;
534378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.mipLevel			= transferInfo->mipLevel;
535378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.baseArrayLayer	= 0;
536378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.layerCount		= 1;
537378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageOffset						= transferInfo->imageOffset;
538378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageExtent.width					= (deInt32)(transferInfo->width);
539378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageExtent.height				= (deInt32)(transferInfo->height);
540378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageExtent.depth					= 1;
541378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
542f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	vkd.cmdCopyImageToBuffer(transferInfo->commandBuffer, transferInfo->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, transferInfo->buffer, 1, &copyState);
543378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
544378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
545378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		VkBufferMemoryBarrier	bufferBarrier;
546ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman		deMemset(&bufferBarrier, 0xcd, sizeof(bufferBarrier));
547378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.sType					= VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
548378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.pNext					= DE_NULL;
549378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.srcAccessMask			= VK_ACCESS_TRANSFER_WRITE_BIT;
550378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.dstAccessMask			= VK_ACCESS_HOST_READ_BIT;
551378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.srcQueueFamilyIndex	= VK_QUEUE_FAMILY_IGNORED;
552378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.dstQueueFamilyIndex	= VK_QUEUE_FAMILY_IGNORED;
553378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.buffer				= transferInfo->buffer;
554378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.offset				= 0;
555378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.size					= transferInfo->size;
556378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		transferInfo->barriers->push_back(bufferBarrier);
557378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
558378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
559378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
560378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct TestContext
561378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
562f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const DeviceInterface&		vkd;
563f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const VkDevice				device;
564f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const deUint32				queueFamilyIndex;
565f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const BinaryCollection&		binaryCollection;
566f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	Allocator&					allocator;
567f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
568378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4*			vertices;
569378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32					numVertices;
570378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	tcu::IVec2					renderDimension;
571378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFence						fences[2];
572378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceSize				renderSize;
573378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>			renderReadBuffer;
574378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>			vertexBufferAllocation;
575378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkBuffer>			vertexBuffer;
576378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkBuffer>			renderBuffer;
577378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bool						waitEvent;
578378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkEvent						event;
579378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkImage>			image;
580378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkImageView>		imageView;
581f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	vk::Move<VkFramebuffer>		framebuffer;
582ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkCommandPool>		commandPool;
583f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	vk::Move<VkCommandBuffer>	cmdBuffer;
584ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkRenderPass>		renderPass;
5856222af852976871f07c00b792cae50eb458d0703Pyry Haulos	vk::Move<VkPipelineCache>	pipelineCache;
5866222af852976871f07c00b792cae50eb458d0703Pyry Haulos	vk::Move<VkPipeline>		pipeline;
587378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>			imageAllocation;
588378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
589f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext (const DeviceInterface&		vkd_,
590f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 const VkDevice				device_,
591f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 deUint32					queueFamilyIndex_,
592f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 const BinaryCollection&	binaryCollection_,
593f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 Allocator&					allocator_)
594f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		: vkd				(vkd_)
595f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, device			(device_)
596f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, queueFamilyIndex	(queueFamilyIndex_)
597f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, binaryCollection	(binaryCollection_)
598f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, allocator			(allocator_)
599f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, numVertices		(0)
600f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		, waitEvent			(false)
601378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
602f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		createFences(vkd, device, false, DE_LENGTH_OF_ARRAY(fences), fences);
603378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
604378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
605378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	~TestContext()
606378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
607f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		destroyFences(vkd, device, DE_LENGTH_OF_ARRAY(fences), fences);
608378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
609378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
610378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
611378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid generateWork (TestContext& testContext)
612378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
613f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const DeviceInterface&						deviceInterface		= testContext.vkd;
614f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const deUint32								queueFamilyNdx		= testContext.queueFamilyIndex;
615f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
616f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	// \note VkShaderModule is consumed by vkCreate*Pipelines() so it can be deleted
617f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	//       as pipeline has been constructed.
618f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const vk::Unique<VkShaderModule>			vertShaderModule	(createShaderModule(deviceInterface,
619f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.device,
620f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.binaryCollection.get("glslvert"),
621f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						(VkShaderModuleCreateFlags)0));
622f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
623f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const vk::Unique<VkShaderModule>			fragShaderModule	(createShaderModule(deviceInterface,
624f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.device,
625f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.binaryCollection.get("glslfrag"),
626f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						(VkShaderModuleCreateFlags)0));
627f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const VkPipelineShaderStageCreateInfo		shaderStageParams[]	=
628f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	{
629f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		{
630f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
631f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			DE_NULL,
632f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(VkPipelineShaderStageCreateFlags)0,
633f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,
634f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			*vertShaderModule,
635f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			"main",
636f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(const VkSpecializationInfo*)DE_NULL,
637f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		},
638f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		{
639f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
640f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			DE_NULL,
641f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(VkPipelineShaderStageCreateFlags)0,
642f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,
643f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			*fragShaderModule,
644f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			"main",
645f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(const VkSpecializationInfo*)DE_NULL,
646f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		}
647f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	};
648f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
649ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkPipelineLayout>					layout;
650378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<ShaderDescParams>					shaderDescParams;
651378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VertexDesc									vertexDesc;
652378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VertexDesc>							vertexDescList;
653378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkVertexInputAttributeDescription>	attrList;
654378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkBufferMemoryBarrier>				bufferMemoryBarrier;
655378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32									memoryBarrierNdx;
656378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32									bufferMemoryBarrierNdx;
657378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32									imageMemoryBarrierNdx;
658378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkVertexInputBindingDescription>		bindingList;
659378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineVertexInputStateCreateInfo		vertexInputState;
660378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineInputAssemblyStateCreateInfo		inputAssemblyState;
661378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineDepthStencilStateCreateInfo		depthStencilState;
662378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineColorBlendAttachmentState			blendAttachment;
663378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineColorBlendStateCreateInfo			blendState;
664378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineLayoutCreateInfo					pipelineLayoutState;
665378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkGraphicsPipelineCreateInfo				pipelineState;
666378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineCacheCreateInfo					cacheState;
667378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkViewport									viewport;
668378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineViewportStateCreateInfo			viewportInfo;
669378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRect2D									scissor;
670378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	BufferParameters							bufferParameters;
671378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	Buffer										buffer;
672378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	RenderInfo									renderInfo;
673378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	ImageParameters								imageParameters;
674378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	Image										image;
675378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineRasterizationStateCreateInfo		rasterState;
676378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineMultisampleStateCreateInfo		multisampleState;
677378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFramebufferCreateInfo						fbState;
678378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBufferBeginInfo					commandBufRecordState;
679378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBufferInheritanceInfo				inheritanceInfo;
680378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	RenderPassParameters						renderPassParameters;
681378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TransferInfo								transferInfo;
682378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<void*>								barrierList;
683378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkExtent3D									extent;
684378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkMemoryBarrier>						memoryBarriers;
685378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkBufferMemoryBarrier>				bufferBarriers;
686378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkImageMemoryBarrier>				imageBarriers;
687378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
688378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarrierNdx			= 0;
689378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferMemoryBarrierNdx		= 0;
690378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageMemoryBarrierNdx		= 0;
691378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	buffer.memoryBarrier.resize(memoryBarrierNdx);
692378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferMemoryBarrier.resize(bufferMemoryBarrierNdx);
693378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	image.imageMemoryBarrier.resize(imageMemoryBarrierNdx);
694378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
695378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
696378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
697378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
698378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
699378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.memory					= testContext.vertices;
700378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.size					= testContext.numVertices * sizeof(tcu::Vec4);
701378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.usage					= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
702378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.sharingMode			= VK_SHARING_MODE_EXCLUSIVE;
703378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyCount		= 1;
704378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyIndex		= &queueFamilyNdx;
705378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.inputBarrierFlags		= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
706f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createVulkanBuffer(deviceInterface, testContext.device, testContext.allocator, bufferParameters, buffer, MemoryRequirement::HostVisible);
707378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.vertexBufferAllocation		= buffer.allocation;
708378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.vertexBuffer				= buffer.buffer;
709378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
710378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.memory					= DE_NULL;
711378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.size					= testContext.renderSize;
712378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.usage					= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
713378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.sharingMode			= VK_SHARING_MODE_EXCLUSIVE;
714378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyCount		= 1;
715378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyIndex		= &queueFamilyNdx;
716378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.inputBarrierFlags		= 0;
717f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createVulkanBuffer(deviceInterface, testContext.device, testContext.allocator, bufferParameters, buffer, MemoryRequirement::HostVisible);
718378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderReadBuffer			= buffer.allocation;
719378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderBuffer				= buffer.buffer;
720378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
721378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	extent.width							= testContext.renderDimension.x();
722378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	extent.height							= testContext.renderDimension.y();
723378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	extent.depth							= 1;
724378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
725378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.imageType 				= VK_IMAGE_TYPE_2D;
726378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.format					= VK_FORMAT_R8G8B8A8_UNORM;
727378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.extent3D				= extent;
728378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.mipLevels				= 1;
729378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.samples					= VK_SAMPLE_COUNT_1_BIT;
730378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.tiling					= VK_IMAGE_TILING_OPTIMAL;
731378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.usage					= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
732378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.sharingMode				= VK_SHARING_MODE_EXCLUSIVE;
733378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.queueFamilyCount		= 1;
734378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.queueFamilyNdxList		= &queueFamilyNdx;
735378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.initialLayout			= VK_IMAGE_LAYOUT_UNDEFINED;
736378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.finalLayout				= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
737378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.barrierInputMask		= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
738f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createVulkanImage(deviceInterface, testContext.device, testContext.allocator, imageParameters, image, MemoryRequirement::Any);
739378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.imageAllocation				= image.allocation;
740378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.image						= image.image;
741378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
742159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	for (size_t ndx = 0; ndx < image.imageMemoryBarrier.size(); ++ndx)
743159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos		imageBarriers.push_back(image.imageMemoryBarrier[ndx]);
744159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos
745378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParameters.colorFormat		= VK_FORMAT_R8G8B8A8_UNORM;
746378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParameters.colorSamples		= VK_SAMPLE_COUNT_1_BIT;
747f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createColorOnlyRenderPass(deviceInterface, testContext.device, renderPassParameters, testContext.renderPass);
748378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
749378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.location = 0;
750378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.format = VK_FORMAT_R32G32B32A32_SFLOAT;
751378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.stride = sizeof(tcu::Vec4);
752378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.offset = 0;
753378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDescList.push_back(vertexDesc);
754378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
755378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	createVertexInfo(vertexDescList, bindingList, attrList, vertexInputState);
756378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
757ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&inputAssemblyState, 0xcd, sizeof(inputAssemblyState));
758378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inputAssemblyState.sType					= VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
759378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inputAssemblyState.pNext					= DE_NULL;
7607aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	inputAssemblyState.flags					= 0u;
761378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inputAssemblyState.topology					= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
762f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	inputAssemblyState.primitiveRestartEnable	= false;
763378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
764378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.x									= 0;
765378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.y									= 0;
766378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.width								= (float)testContext.renderDimension.x();
767378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.height								= (float)testContext.renderDimension.y();
768378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.minDepth							= 0;
769378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.maxDepth							= 1;
770378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
771378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.offset.x							= 0;
772378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.offset.y							= 0;
773378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.extent.width						= testContext.renderDimension.x();
774378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.extent.height						= testContext.renderDimension.y();
775378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
776ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&viewportInfo, 0xcd, sizeof(viewportInfo));
777378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.sType							= VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
778378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.pNext							= DE_NULL;
779378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.flags							= 0;
780378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.viewportCount					= 1;
781378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.pViewports						= &viewport;
782378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.scissorCount					= 1;
783378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.pScissors						= &scissor;
784378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
785ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&rasterState, 0xcd, sizeof(rasterState));
786378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.sType							= VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
787378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.pNext							= DE_NULL;
788378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.flags							= 0;
789378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.depthClampEnable				= VK_TRUE;
790378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.rasterizerDiscardEnable			= VK_FALSE;
791378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.polygonMode						= VK_POLYGON_MODE_FILL;
792378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.cullMode						= VK_CULL_MODE_NONE;
793378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.frontFace						= VK_FRONT_FACE_COUNTER_CLOCKWISE;
794378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.depthBiasEnable					= VK_FALSE;
795378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.lineWidth						= 1;
796378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
797ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&multisampleState, 0xcd, sizeof(multisampleState));
798378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.sType						= VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
799378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.pNext						= DE_NULL;
800378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.flags						= 0;
801378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.rasterizationSamples		= VK_SAMPLE_COUNT_1_BIT;
802378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.sampleShadingEnable		= VK_FALSE;
803378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.pSampleMask				= DE_NULL;
804378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.alphaToCoverageEnable		= VK_FALSE;
805378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.alphaToOneEnable			= VK_FALSE;
806378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
807ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&depthStencilState, 0xcd, sizeof(depthStencilState));
808378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.sType						= VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
809378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.pNext						= DE_NULL;
810378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.flags						= 0;
811378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.depthTestEnable			= VK_FALSE;
812378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.depthWriteEnable			= VK_FALSE;
813226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.depthCompareOp			= VK_COMPARE_OP_ALWAYS;
814378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.depthBoundsTestEnable		= VK_FALSE;
815378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.stencilTestEnable			= VK_FALSE;
816159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.front.failOp				= VK_STENCIL_OP_KEEP;
817159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.front.passOp				= VK_STENCIL_OP_KEEP;
818159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.front.depthFailOp			= VK_STENCIL_OP_KEEP;
819226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.compareOp			= VK_COMPARE_OP_ALWAYS;
820226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.compareMask			= 0u;
821226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.writeMask			= 0u;
822226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.reference			= 0u;
823159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.back						= depthStencilState.front;
824378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
825ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&blendAttachment, 0xcd, sizeof(blendAttachment));
826378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendAttachment.blendEnable					= VK_FALSE;
827159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.srcColorBlendFactor			= VK_BLEND_FACTOR_ZERO;
828159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.srcAlphaBlendFactor			= VK_BLEND_FACTOR_ZERO;
829159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.dstColorBlendFactor			= VK_BLEND_FACTOR_ZERO;
830159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.dstAlphaBlendFactor			= VK_BLEND_FACTOR_ZERO;
831159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.colorBlendOp				= VK_BLEND_OP_ADD;
832159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.alphaBlendOp				= VK_BLEND_OP_ADD;
8337aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	blendAttachment.colorWriteMask				= VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
834378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
835ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&blendState, 0xcd, sizeof(blendState));
836378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.sType							= VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
837378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.pNext							= DE_NULL;
838378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.flags							= 0;
839378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.logicOpEnable					= VK_FALSE;
840159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendState.logicOp							= VK_LOGIC_OP_COPY;
841378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.attachmentCount					= 1;
842378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.pAttachments						= &blendAttachment;
843378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
844ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&pipelineLayoutState, 0xcd, sizeof(pipelineLayoutState));
845378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.sType					= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
846378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pNext					= DE_NULL;
847378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.flags					= 0;
848378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.setLayoutCount			= 0;
849378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pSetLayouts				= DE_NULL;
850378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pushConstantRangeCount	= 0;
851378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pPushConstantRanges		= DE_NULL;
852ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	layout = createPipelineLayout(deviceInterface, testContext.device, &pipelineLayoutState, DE_NULL);
853378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
854ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&pipelineState, 0xcd, sizeof(pipelineState));
855378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.sType							= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
856378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pNext							= DE_NULL;
857378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.flags							= 0;
858f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	pipelineState.stageCount					= DE_LENGTH_OF_ARRAY(shaderStageParams);
859f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	pipelineState.pStages						= &shaderStageParams[0];
860378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pVertexInputState				= &vertexInputState;
861378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pInputAssemblyState			= &inputAssemblyState;
862378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pTessellationState			= DE_NULL;
863378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pViewportState				= &viewportInfo;
864378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pRasterizationState			= &rasterState;
865378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pMultisampleState				= &multisampleState;
866378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pDepthStencilState			= &depthStencilState;
867378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pColorBlendState				= &blendState;
86886a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos	pipelineState.pDynamicState					= (const VkPipelineDynamicStateCreateInfo*)DE_NULL;
869ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	pipelineState.layout						= layout.get();
870ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	pipelineState.renderPass					= testContext.renderPass.get();
871378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.subpass						= 0;
872378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.basePipelineHandle			= DE_NULL;
873378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.basePipelineIndex				= 0;
874378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
875ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&cacheState, 0xcd, sizeof(cacheState));
876378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.sType							= VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
877378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.pNext							= DE_NULL;
878378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.flags							= 0;
879378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.initialDataSize					= 0;
880378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.pInitialData						= DE_NULL;
881378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
8826222af852976871f07c00b792cae50eb458d0703Pyry Haulos	testContext.pipelineCache	= createPipelineCache(deviceInterface, testContext.device, &cacheState);
8836222af852976871f07c00b792cae50eb458d0703Pyry Haulos	testContext.pipeline		= createGraphicsPipeline(deviceInterface, testContext.device, testContext.pipelineCache.get(), &pipelineState);
884378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
885ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&fbState, 0xcd, sizeof(fbState));
886378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.sType								= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
887378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.pNext								= DE_NULL;
888378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.flags								= 0;
889ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	fbState.renderPass							= testContext.renderPass.get();
890378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.attachmentCount						= 1;
891378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.pAttachments						= &image.imageView.get();
892378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.width								= (deUint32)testContext.renderDimension.x();
893378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.height								= (deUint32)testContext.renderDimension.y();
894378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.layers								= 1;
895f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
896f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	testContext.framebuffer	= createFramebuffer(deviceInterface, testContext.device, &fbState);
897f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	testContext.imageView	= image.imageView;
898378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
899ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&inheritanceInfo, 0xcd, sizeof(inheritanceInfo));
900378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.sType						= VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
901378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.pNext						= DE_NULL;
902ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	inheritanceInfo.renderPass					= testContext.renderPass.get();
903378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.subpass						= 0;
904f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	inheritanceInfo.framebuffer					= *testContext.framebuffer;
905378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.occlusionQueryEnable		= VK_FALSE;
9067aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	inheritanceInfo.queryFlags					= 0u;
9077aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	inheritanceInfo.pipelineStatistics			= 0u;
908378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
909ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&commandBufRecordState, 0xcd, sizeof(commandBufRecordState));
910378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.sType					= VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
911378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.pNext					= DE_NULL;
912378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.flags					= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
913378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.pInheritanceInfo		= &inheritanceInfo;
914378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.beginCommandBuffer(testContext.cmdBuffer.get(), &commandBufRecordState));
915378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
916378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdPipelineBarrier( testContext.cmdBuffer.get(),
917378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_HOST_BIT,
918378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
919f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman										false,
920f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]),
921f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]),
922f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0]));
923378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
924378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
925378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
926378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
927378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
928378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.width				= testContext.renderDimension.x();
929378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.height				= testContext.renderDimension.y();
930378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.vertexBufferSize		= testContext.numVertices;
931378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.vertexBuffer			= testContext.vertexBuffer.get();
932378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.image				= testContext.image.get();
933378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.commandBuffer		= testContext.cmdBuffer.get();
934ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	renderInfo.renderPass			= testContext.renderPass.get();
935f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	renderInfo.framebuffer			= *testContext.framebuffer;
9366222af852976871f07c00b792cae50eb458d0703Pyry Haulos	renderInfo.pipeline				= *testContext.pipeline;
937378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.mipLevels			= 1;
938378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.queueFamilyNdxList	= &queueFamilyNdx;
939378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.queueFamilyNdxCount	= 1;
940378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.waitEvent			= testContext.waitEvent;
941378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.event				= testContext.event;
942378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.barriers				= &imageBarriers;
943f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	recordRenderPass(deviceInterface, renderInfo);
944378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
945378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdPipelineBarrier(	renderInfo.commandBuffer,
946378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
947378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_TRANSFER_BIT,
948f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman										false,
949f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]),
950f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]),
951f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0]));
952378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
953378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
954378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
955378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
956378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
957378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.commandBuffer		= renderInfo.commandBuffer;
958378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.width				= testContext.renderDimension.x();
959378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.height				= testContext.renderDimension.y();
960378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.image				= renderInfo.image;
961378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.buffer				= testContext.renderBuffer.get();
962378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.size				= testContext.renderSize;
963378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.mipLevel			= 0;
964378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.imageOffset.x		= 0;
965378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.imageOffset.y		= 0;
966378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.imageOffset.z		= 0;
967378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.barriers			= &bufferBarriers;
968f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	copyToCPU(deviceInterface, &transferInfo);
969378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
970378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdPipelineBarrier(	transferInfo.commandBuffer,
971378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_TRANSFER_BIT,
972378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_HOST_BIT,
973f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman										false,
974f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]),
975f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]),
976f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0]));
977378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
978378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
979378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
980378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
981378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
982378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.endCommandBuffer(transferInfo.commandBuffer));
983378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
984378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
985378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstatic void initSubmitInfo (VkSubmitInfo* submitInfo, deUint32 submitInfoCount)
986378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
987378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (deUint32 ndx = 0; ndx < submitInfoCount; ndx++)
988378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
989378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].sType					= VK_STRUCTURE_TYPE_SUBMIT_INFO;
990378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pNext					= DE_NULL;
991378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].waitSemaphoreCount		= 0;
992378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pWaitSemaphores			= DE_NULL;
993378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pWaitDstStageMask		= DE_NULL;
994378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].commandBufferCount		= 1;
995378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].signalSemaphoreCount	= 0;
996378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pSignalSemaphores		= DE_NULL;
997378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
998378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
999378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1000378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testFences (Context& context)
1001378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1002378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TestLog&					log					= context.getTestContext().getLog();
1003378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const DeviceInterface&		deviceInterface		= context.getDeviceInterface();
1004378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkQueue				queue				= context.getUniversalQueue();
1005378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const deUint32				queueFamilyIdx		= context.getUniversalQueueFamilyIndex();
1006271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	VkDevice					device				= context.getDevice();
10073241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	VkResult					waitStatus;
1008378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					fenceStatus;
1009f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext					testContext			(deviceInterface, device, queueFamilyIdx, context.getBinaryCollection(), context.getDefaultAllocator());
1010378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSubmitInfo				submitInfo;
1011378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkMappedMemoryRange			range;
1012378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	void*						resultImage;
1013378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1014378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4				vertices[]			=
1015378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1016378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.5f,  0.5f, 0.0f, 1.0f),
1017378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f,  0.5f, 0.0f, 1.0f),
1018378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f)
1019378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1020378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1021378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.vertices = vertices;
1022378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.numVertices = DE_LENGTH_OF_ARRAY(vertices);
1023378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderDimension = tcu::IVec2(256, 256);
1024378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderSize = sizeof(deUint32) * testContext.renderDimension.x() * testContext.renderDimension.y();
1025378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1026f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createCommandBuffer(deviceInterface, device, queueFamilyIdx, &testContext.cmdBuffer, &testContext.commandPool);
1027378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	generateWork(testContext);
1028378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1029378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	initSubmitInfo(&submitInfo, 1);
1030378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	submitInfo.pCommandBuffers		= &testContext.cmdBuffer.get();
1031378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1032271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	// Default status is unsignaled
1033271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[0]);
1034378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (fenceStatus != VK_NOT_READY)
1035378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1036271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives fence 0 should be reset but status is " << getResultName(fenceStatus) << TestLog::EndMessage;
1037378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("Fence in incorrect state");
1038378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1039271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[1]);
1040271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	if (fenceStatus != VK_NOT_READY)
1041271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	{
1042271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives fence 1 should be reset but status is " << getResultName(fenceStatus) << TestLog::EndMessage;
1043271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		return tcu::TestStatus::fail("Fence in incorrect state");
1044271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	}
1045271157f1dfdc1129586f47e8064874d107f3edaeDae Kim
1046271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	VK_CHECK(deviceInterface.queueSubmit(queue, 1, &submitInfo, testContext.fences[0]));
1047378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10483241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait with timeout = 0
1049f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, 0u);
10503241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_SUCCESS && waitStatus != VK_TIMEOUT)
1051378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
10523241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		// Will most likely end with VK_TIMEOUT
10533241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSynchPrimitives failed to wait for a single fence" << TestLog::EndMessage;
10543241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("Failed to wait for a single fence");
1055378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1056378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10573241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait with a reasonable timeout
1058f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, DEFAULT_TIMEOUT);
10593241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_SUCCESS && waitStatus != VK_TIMEOUT)
10603241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	{
10613241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		// \note Wait can end with a timeout if DEFAULT_TIMEOUT is not sufficient
10623241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSynchPrimitives failed to wait for a single fence" << TestLog::EndMessage;
10633241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("Failed to wait for a single fence");
10643241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	}
1065378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10663241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait for work on fences[0] to actually complete
1067f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, std::numeric_limits<deUint64>::max());
10683241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_SUCCESS)
1069378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
10703241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSynchPrimitives failed to wait for a fence" << TestLog::EndMessage;
10713241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("failed to wait for a fence");
1072378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1073378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10743241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait until timeout on a fence that has not been submitted
1075f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[1], true, 1);
10763241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_TIMEOUT)
1077378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
10783241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSyncPrimitives failed to timeout on wait for single fence" << TestLog::EndMessage;
10793241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("failed to timeout on wait for single fence");
1080378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1081378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1082271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	// Check that the fence is signaled after the wait
1083271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[0]);
1084378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (fenceStatus != VK_SUCCESS)
1085378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1086271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives fence should be signaled but status is " << getResultName(fenceStatus) << TestLog::EndMessage;
1087378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("Fence in incorrect state");
1088378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1089378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1090378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1091378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1092378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.memory		= testContext.renderReadBuffer->getMemory();
1093378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1094378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.size			= testContext.renderSize;
1095271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device, 1, &range));
1096378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	resultImage = testContext.renderReadBuffer->getHostPtr();
1097378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1098378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1099378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1100378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1101378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1102378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext.renderDimension.x(),
1103378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext.renderDimension.y(),
1104378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1105378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1106378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1107271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	return TestStatus::pass("synchronization-fences passed");
1108378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1109378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1110378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvk::refdetails::Checked<VkSemaphore> createSemaphore (const DeviceInterface& deviceInterface, const VkDevice& device, const VkAllocationCallbacks* allocationCallbacks)
1111378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1112378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSemaphoreCreateInfo		semaCreateInfo;
1113378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSemaphore					semaphore;
1114378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1115378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	semaCreateInfo.sType		= VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1116378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	semaCreateInfo.pNext		= DE_NULL;
1117378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	semaCreateInfo.flags		= 0;
1118378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.createSemaphore(device, &semaCreateInfo, allocationCallbacks, &semaphore));
1119378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1120378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return vk::check<VkSemaphore>(semaphore);
1121378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1122378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1123378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testSemaphores (Context& context)
1124378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1125378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TestLog&					log					= context.getTestContext().getLog();
1126378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const InstanceInterface&	instanceInterface	= context.getInstanceInterface();
1127378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkPhysicalDevice		physicalDevice		= context.getPhysicalDevice();
1128271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	deUint32					queueFamilyIdx;
1129271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	vk::Move<VkDevice>			device				= createTestDevice(instanceInterface, physicalDevice, &queueFamilyIdx);
1130f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const DeviceDriver			deviceInterface		(instanceInterface, *device);
1131f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	SimpleAllocator				allocator			(deviceInterface,
1132f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos													 *device,
1133f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos													 getPhysicalDeviceMemoryProperties(instanceInterface, physicalDevice));
1134378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkQueue						queue[2];
1135378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					testStatus;
1136f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext					testContext1		(deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator);
1137f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext					testContext2		(deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator);
1138f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	Unique<VkSemaphore>			semaphore			(createSemaphore(deviceInterface, device.get(), (VkAllocationCallbacks*)DE_NULL), Deleter<VkSemaphore>(deviceInterface, device.get(), DE_NULL));
1139378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSubmitInfo				submitInfo[2];
1140378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkMappedMemoryRange			range;
1141378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	void*						resultImage;
1142226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	const VkPipelineStageFlags	waitDstStageMask	= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
1143378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1144378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.getDeviceQueue(device.get(), queueFamilyIdx, 0, &queue[0]);
1145378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.getDeviceQueue(device.get(), queueFamilyIdx, 1, &queue[1]);
1146378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1147378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4		vertices1[]			=
1148378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1149378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.5f,  0.5f, 0.0f, 1.0f),
1150378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f,  0.5f, 0.0f, 1.0f),
1151378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f)
1152378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1153378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1154378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4		vertices2[]			=
1155378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1156378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
1157378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
1158378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
1159378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1160378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1161271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.vertices			= vertices1;
1162271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.numVertices		= DE_LENGTH_OF_ARRAY(vertices1);
1163271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.renderDimension	= tcu::IVec2(256, 256);
1164271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.renderSize			= sizeof(deUint32) * testContext1.renderDimension.x() * testContext1.renderDimension.y();
1165378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1166271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.vertices			= vertices2;
1167271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.numVertices		= DE_LENGTH_OF_ARRAY(vertices2);
1168271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.renderDimension	= tcu::IVec2(256, 256);
1169271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.renderSize			= sizeof(deUint32) * testContext2.renderDimension.x() * testContext2.renderDimension.y();
1170378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1171f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createCommandBuffer(deviceInterface, device.get(), queueFamilyIdx, &testContext1.cmdBuffer, &testContext1.commandPool);
1172378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	generateWork(testContext1);
1173378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1174f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createCommandBuffer(deviceInterface, device.get(), queueFamilyIdx, &testContext2.cmdBuffer, &testContext2.commandPool);
1175378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	generateWork(testContext2);
1176378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1177378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	initSubmitInfo(submitInfo, DE_LENGTH_OF_ARRAY(submitInfo));
1178378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1179378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	// The difference between the two submit infos is that each will use a unique cmd buffer,
1180378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	// and one will signal a semaphore but not wait on a semaphore, the other will wait on the
1181378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	// semaphore but not signal a semaphore
1182271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[0].pCommandBuffers		= &testContext1.cmdBuffer.get();
1183271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[1].pCommandBuffers		= &testContext2.cmdBuffer.get();
1184378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1185271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[0].signalSemaphoreCount	= 1;
1186271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[0].pSignalSemaphores		= &semaphore.get();
1187271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[1].waitSemaphoreCount	= 1;
1188271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[1].pWaitSemaphores		= &semaphore.get();
1189226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	submitInfo[1].pWaitDstStageMask		= &waitDstStageMask;
1190378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1191378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.queueSubmit(queue[0], 1, &submitInfo[0], testContext1.fences[0]));
1192378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
11936e70e1764f44364869c497a32671faddf8152293Ilya Zaytsev	testStatus  = deviceInterface.waitForFences(device.get(), 1, &testContext1.fences[0], true, std::numeric_limits<deUint64>::max());
1194378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (testStatus != VK_SUCCESS)
1195378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1196378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		log << TestLog::Message << "testSynchPrimitives failed to wait for a set fence" << TestLog::EndMessage;
1197378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("failed to wait for a set fence");
1198378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1199378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1200378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1201378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1202378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.memory		= testContext1.renderReadBuffer->getMemory();
1203378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1204378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.size			= testContext1.renderSize;
1205378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device.get(), 1, &range));
1206378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	resultImage = testContext1.renderReadBuffer->getHostPtr();
1207378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1208378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1209378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1210378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1211378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1212378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext1.renderDimension.x(),
1213378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext1.renderDimension.y(),
1214378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1215378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1216378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1217378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.queueSubmit(queue[1], 1, &submitInfo[1], testContext2.fences[0]));
1218378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
12196e70e1764f44364869c497a32671faddf8152293Ilya Zaytsev	testStatus  = deviceInterface.waitForFences(device.get(), 1, &testContext2.fences[0], true, std::numeric_limits<deUint64>::max());
1220378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (testStatus != VK_SUCCESS)
1221378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1222378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		log << TestLog::Message << "testSynchPrimitives failed to wait for a set fence" << TestLog::EndMessage;
1223378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("failed to wait for a set fence");
1224378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1225378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1226378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1227378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1228378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.memory		= testContext2.renderReadBuffer->getMemory();
1229378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1230378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.size			= testContext2.renderSize;
1231378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device.get(), 1, &range));
1232378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	resultImage = testContext2.renderReadBuffer->getHostPtr();
1233378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1234378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1235378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1236378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1237378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1238378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext2.renderDimension.x(),
1239378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext2.renderDimension.y(),
1240378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1241378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1242378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1243378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return tcu::TestStatus::pass("synchronization-semaphores passed");
1244378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1245378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1246378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvk::refdetails::Checked<VkEvent> createEvent (const DeviceInterface& deviceInterface, const VkDevice& device, const VkAllocationCallbacks* allocationCallbacks)
1247378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1248378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkEventCreateInfo		eventCreateInfo;
1249378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkEvent					event;
1250378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1251378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	eventCreateInfo.sType		= VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
1252378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	eventCreateInfo.pNext		= DE_NULL;
1253378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	eventCreateInfo.flags		= 0;
1254378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.createEvent(device, &eventCreateInfo, allocationCallbacks, &event));
1255378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1256378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return vk::check<VkEvent>(event);
1257378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1258378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1259378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testEvents (Context& context)
1260378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1261378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TestLog&					log					= context.getTestContext().getLog();
1262f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	const DeviceInterface&		deviceInterface		= context.getDeviceInterface();
1263f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VkDevice					device				= context.getDevice();
1264f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	const deUint32				queueFamilyIdx		= context.getUniversalQueueFamilyIndex();
1265f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	Allocator&					allocator			= context.getDefaultAllocator();
1266f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VkQueue						queue				= context.getUniversalQueue();
1267378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					testStatus;
1268378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					eventStatus;
1269f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	TestContext					testContext			(deviceInterface, device, queueFamilyIdx, context.getBinaryCollection(), allocator);
1270f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	Unique<VkEvent>				event				(createEvent(deviceInterface, device, (VkAllocationCallbacks*)DE_NULL), Deleter<VkEvent>(deviceInterface, device, DE_NULL));
1271f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VkSubmitInfo				submitInfo;
1272378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkMappedMemoryRange			range;
1273378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	void*						resultImage;
1274378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1275378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4		vertices1[]			=
1276378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1277378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.5f,  0.5f, 0.0f, 1.0f),
1278378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f,  0.5f, 0.0f, 1.0f),
1279378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f)
1280378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1281378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1282f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.vertices = vertices1;
1283f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.numVertices = DE_LENGTH_OF_ARRAY(vertices1);
1284f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.renderDimension = tcu::IVec2(256, 256);
1285f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.waitEvent = true;
1286f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.event = event.get();
1287f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.renderSize = sizeof(deUint32) * testContext.renderDimension.x() * testContext.renderDimension.y();
1288378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1289f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	createCommandBuffer(deviceInterface, device, queueFamilyIdx, &testContext.cmdBuffer, &testContext.commandPool);
1290f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	generateWork(testContext);
1291378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1292f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	initSubmitInfo(&submitInfo, 1);
1293f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	submitInfo.pCommandBuffers = &testContext.cmdBuffer.get();
1294378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1295f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// 6.3 An event is initially in the unsignaled state
1296f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	eventStatus = deviceInterface.getEventStatus(device, event.get());
1297378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (eventStatus != VK_EVENT_RESET)
1298378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1299271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives event should be reset but status is " << getResultName(eventStatus) << TestLog::EndMessage;
1300378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("Event in incorrect status");
1301378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1302378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1303f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// The recorded command buffer should wait at the top of the graphics pipe for an event signaled by the host and so should not
1304f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// make forward progress as long as the event is not signaled
1305f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VK_CHECK(deviceInterface.queueSubmit(queue, 1, &submitInfo, testContext.fences[0]));
1306378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1307f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testStatus  = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, 1);
1308f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	if (testStatus != VK_TIMEOUT)
1309378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1310f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		log << TestLog::Message << "testSynchronizationPrimitives failed to wait for set event from host." << TestLog::EndMessage;
1311f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		return tcu::TestStatus::fail("failed to wait for event set from host");
1312378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1313378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1314f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// Should allow the recorded command buffer to finally make progress
1315f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VK_CHECK(deviceInterface.setEvent(device, event.get()));
1316f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	eventStatus = deviceInterface.getEventStatus(device, event.get());
1317f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	if (eventStatus != VK_EVENT_SET)
1318f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	{
1319f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		log << TestLog::Message << "testEvents failed to transition event to signaled state via setEvent call from host" << TestLog::EndMessage;
1320f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		return tcu::TestStatus::fail("failed to signal event from host");
1321f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	}
1322378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1323f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testStatus  = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, ~(0ull));
1324378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (testStatus != VK_SUCCESS)
1325378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1326f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		log << TestLog::Message << "testSynchronizationPrimitives failed to proceed after set event from host." << TestLog::EndMessage;
1327f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		return tcu::TestStatus::fail("failed to proceed after event set from host");
1328378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1329378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1330378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1331378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1332f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	range.memory		= testContext.renderReadBuffer->getMemory();
1333378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1334f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	range.size			= testContext.renderSize;
1335f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device, 1, &range));
1336f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	resultImage = testContext.renderReadBuffer->getHostPtr();
1337378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1338378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1339378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1340378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1341378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1342f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman									testContext.renderDimension.x(),
1343f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman									testContext.renderDimension.y(),
1344378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1345378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1346378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1347378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return tcu::TestStatus::pass("synchronization-events passed");
1348378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1349378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1350378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} // anonymous
1351378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
13527aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowskitcu::TestCaseGroup* createSmokeTests (tcu::TestContext& textCtx)
1353378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
13547aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	de::MovePtr<tcu::TestCaseGroup> synchTests  (new tcu::TestCaseGroup(textCtx, "smoke", "Synchronization smoke tests"));
1355378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1356378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	addFunctionCaseWithPrograms(synchTests.get(), "fences", "", buildShaders, testFences);
1357378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	addFunctionCaseWithPrograms(synchTests.get(), "semaphores", "", buildShaders, testSemaphores);
1358378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	addFunctionCaseWithPrograms(synchTests.get(), "events", "", buildShaders, testEvents);
1359378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1360378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return synchTests.release();
1361378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1362378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
13637aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski} // synchronization
13647aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski} // vkt
1365