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;
156653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	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	VkCommandBufferAllocateInfo	commandBufferInfo;
406378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBuffer				commandBuffer;
407378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
408da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	commandPool = createCommandPool(deviceInterface, device, 0u, queueFamilyNdx);
409378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
410ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&commandBufferInfo, 0xcd, sizeof(commandBufferInfo));
411378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.sType					= VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
412378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.pNext					= DE_NULL;
413ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	commandBufferInfo.commandPool			= commandPool.get();
414378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.level					= VK_COMMAND_BUFFER_LEVEL_PRIMARY;
415378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufferInfo.commandBufferCount	= 1;
416378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
417378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.allocateCommandBuffers(device, &commandBufferInfo, &commandBuffer));
418ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	*commandBufferRef = vk::Move<VkCommandBuffer>(vk::check<VkCommandBuffer>(commandBuffer), Deleter<VkCommandBuffer>(deviceInterface, device, commandPool.get()));
419ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	*commandPoolRef = commandPool;
420378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
421378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
422378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid createFences (const DeviceInterface& deviceInterface, VkDevice device, bool signaled, deUint32 numFences, VkFence* fence)
423378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
424378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFenceCreateInfo		fenceState;
425378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFenceCreateFlags		signalFlag = signaled ? VK_FENCE_CREATE_SIGNALED_BIT : 0;
426378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
427ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&fenceState, 0xcd, sizeof(fenceState));
428378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fenceState.sType		= VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
429378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fenceState.pNext		= DE_NULL;
430378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fenceState.flags		= signalFlag;
431378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
432378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (deUint32 ndx = 0; ndx < numFences; ndx++)
433378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		VK_CHECK(deviceInterface.createFence(device, &fenceState, DE_NULL, &fence[ndx]));
434378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
435378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
436378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid destroyFences (const DeviceInterface& deviceInterface, VkDevice device, deUint32 numFences, VkFence* fence)
437378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
438378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (deUint32 ndx = 0; ndx < numFences; ndx++)
439378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		deviceInterface.destroyFence(device, fence[ndx], DE_NULL);
440378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
441378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
442378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct RenderInfo
443378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
444378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deInt32							width;
445378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deInt32							height;
446378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						vertexBufferSize;
447378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkBuffer						vertexBuffer;
448378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImage							image;
449378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBuffer					commandBuffer;
450378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRenderPass					renderPass;
451378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFramebuffer					framebuffer;
4526222af852976871f07c00b792cae50eb458d0703Pyry Haulos	VkPipeline						pipeline;
453378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						mipLevels;
454378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const deUint32*					queueFamilyNdxList;
455378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						queueFamilyNdxCount;
456378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bool							waitEvent;
457378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkEvent							event;
458378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkImageMemoryBarrier>*	barriers;
459378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
460378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
461f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid  recordRenderPass (const DeviceInterface& deviceInterface, const RenderInfo& renderInfo)
462378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
463378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkDeviceSize					bindingOffset			= 0;
464378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkClearValue					clearValue				= makeClearValueColorF32(0.0, 0.0, 1.0, 1.0);
465378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRenderPassBeginInfo				renderPassBeginState;
466378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImageMemoryBarrier				renderBarrier;
467378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
468ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&renderPassBeginState, 0xcd, sizeof(renderPassBeginState));
469378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.sType						= VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
470378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.pNext						= DE_NULL;
471378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderPass					= renderInfo.renderPass;
472378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.framebuffer				= renderInfo.framebuffer;
473378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.offset.x		= 0;
474378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.offset.y		= 0;
475378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.extent.width	= renderInfo.width;
476378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.renderArea.extent.height	= renderInfo.height;
477378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.clearValueCount			= 1;
478378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassBeginState.pClearValues				= &clearValue;
479378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
480378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (renderInfo.waitEvent)
481f093f4b9e448947e887868ffc0d23b45c31ee9b0David 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);
4820e54da35ac023351bb8b3bd4f55d0c98d812ef8dPeter Quayle	deviceInterface.cmdBeginRenderPass(renderInfo.commandBuffer, &renderPassBeginState, VK_SUBPASS_CONTENTS_INLINE);
4836222af852976871f07c00b792cae50eb458d0703Pyry Haulos	deviceInterface.cmdBindPipeline(renderInfo.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, renderInfo.pipeline);
484378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdBindVertexBuffers(renderInfo.commandBuffer, 0u, 1u, &renderInfo.vertexBuffer, &bindingOffset);
485378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdDraw(renderInfo.commandBuffer, renderInfo.vertexBufferSize, 1, 0, 0);
486226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	deviceInterface.cmdEndRenderPass(renderInfo.commandBuffer);
487378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
488ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&renderBarrier, 0xcd, sizeof(renderBarrier));
489378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.sType								= VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
490378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.pNext								= DE_NULL;
491378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.srcAccessMask						= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
492378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.dstAccessMask						= VK_ACCESS_TRANSFER_READ_BIT;
493378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.oldLayout							= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
494378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.newLayout							= VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
495378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.srcQueueFamilyIndex				= renderInfo.queueFamilyNdxList[0];
496378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.dstQueueFamilyIndex				= renderInfo.queueFamilyNdxList[renderInfo.queueFamilyNdxCount-1];
497378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.image								= renderInfo.image;
498378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.aspectMask		= VK_IMAGE_ASPECT_COLOR_BIT;
499378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.baseMipLevel		= 0;
500378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.levelCount		= renderInfo.mipLevels;
501378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.baseArrayLayer	= 0;
502378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderBarrier.subresourceRange.layerCount		= 1;
503378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.barriers->push_back(renderBarrier);
504378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
505378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
506378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct TransferInfo
507378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
508378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBuffer					commandBuffer;
509378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						width;
510378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						height;
511378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkImage							image;
512378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkBuffer						buffer;
513378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceSize					size;
514378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32						mipLevel;
515378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkOffset3D						imageOffset;
516378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkBufferMemoryBarrier>*	barriers;
517378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
518378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
519f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid copyToCPU (const DeviceInterface& vkd, TransferInfo* transferInfo)
520378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
521f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	VkBufferImageCopy	copyState;
522378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
523378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.bufferOffset						= 0;
524378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.bufferRowLength					= transferInfo->width;
525378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.bufferImageHeight					= transferInfo->height;
526378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.aspectMask		= VK_IMAGE_ASPECT_COLOR_BIT;
527378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.mipLevel			= transferInfo->mipLevel;
528378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.baseArrayLayer	= 0;
529378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageSubresource.layerCount		= 1;
530378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageOffset						= transferInfo->imageOffset;
531378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageExtent.width					= (deInt32)(transferInfo->width);
532378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageExtent.height				= (deInt32)(transferInfo->height);
533378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	copyState.imageExtent.depth					= 1;
534378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
535f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	vkd.cmdCopyImageToBuffer(transferInfo->commandBuffer, transferInfo->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, transferInfo->buffer, 1, &copyState);
536378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
537378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
538378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		VkBufferMemoryBarrier	bufferBarrier;
539ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman		deMemset(&bufferBarrier, 0xcd, sizeof(bufferBarrier));
540378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.sType					= VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
541378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.pNext					= DE_NULL;
542378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.srcAccessMask			= VK_ACCESS_TRANSFER_WRITE_BIT;
543378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.dstAccessMask			= VK_ACCESS_HOST_READ_BIT;
544378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.srcQueueFamilyIndex	= VK_QUEUE_FAMILY_IGNORED;
545378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.dstQueueFamilyIndex	= VK_QUEUE_FAMILY_IGNORED;
546378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.buffer				= transferInfo->buffer;
547378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.offset				= 0;
548378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		bufferBarrier.size					= transferInfo->size;
549378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		transferInfo->barriers->push_back(bufferBarrier);
550378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
551378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
552378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
553378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct TestContext
554378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
555f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const DeviceInterface&		vkd;
556f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const VkDevice				device;
557f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const deUint32				queueFamilyIndex;
558f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const BinaryCollection&		binaryCollection;
559f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	Allocator&					allocator;
560f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
561378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4*			vertices;
562378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32					numVertices;
563378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	tcu::IVec2					renderDimension;
564378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFence						fences[2];
565378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkDeviceSize				renderSize;
566378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>			renderReadBuffer;
567378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>			vertexBufferAllocation;
568378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkBuffer>			vertexBuffer;
569378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkBuffer>			renderBuffer;
570378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bool						waitEvent;
571378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkEvent						event;
572378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkImage>			image;
573378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vk::Move<VkImageView>		imageView;
574f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	vk::Move<VkFramebuffer>		framebuffer;
575ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkCommandPool>		commandPool;
576f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	vk::Move<VkCommandBuffer>	cmdBuffer;
577ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkRenderPass>		renderPass;
5786222af852976871f07c00b792cae50eb458d0703Pyry Haulos	vk::Move<VkPipelineCache>	pipelineCache;
5796222af852976871f07c00b792cae50eb458d0703Pyry Haulos	vk::Move<VkPipeline>		pipeline;
580378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	MovePtr<Allocation>			imageAllocation;
581378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
582f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext (const DeviceInterface&		vkd_,
583f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 const VkDevice				device_,
584f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 deUint32					queueFamilyIndex_,
585f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 const BinaryCollection&	binaryCollection_,
586f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos				 Allocator&					allocator_)
587f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		: vkd				(vkd_)
588f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, device			(device_)
589f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, queueFamilyIndex	(queueFamilyIndex_)
590f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, binaryCollection	(binaryCollection_)
591f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, allocator			(allocator_)
592f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		, numVertices		(0)
593f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		, waitEvent			(false)
594378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
595f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		createFences(vkd, device, false, DE_LENGTH_OF_ARRAY(fences), fences);
596378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
597378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
598378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	~TestContext()
599378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
600f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		destroyFences(vkd, device, DE_LENGTH_OF_ARRAY(fences), fences);
601378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
602378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman};
603378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
604378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid generateWork (TestContext& testContext)
605378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
606f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const DeviceInterface&						deviceInterface		= testContext.vkd;
607f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const deUint32								queueFamilyNdx		= testContext.queueFamilyIndex;
608f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
609f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	// \note VkShaderModule is consumed by vkCreate*Pipelines() so it can be deleted
610f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	//       as pipeline has been constructed.
611f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const vk::Unique<VkShaderModule>			vertShaderModule	(createShaderModule(deviceInterface,
612f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.device,
613f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.binaryCollection.get("glslvert"),
614f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						(VkShaderModuleCreateFlags)0));
615f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
616f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const vk::Unique<VkShaderModule>			fragShaderModule	(createShaderModule(deviceInterface,
617f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.device,
618f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						testContext.binaryCollection.get("glslfrag"),
619f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos																						(VkShaderModuleCreateFlags)0));
620f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const VkPipelineShaderStageCreateInfo		shaderStageParams[]	=
621f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	{
622f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		{
623f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
624f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			DE_NULL,
625f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(VkPipelineShaderStageCreateFlags)0,
626f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,
627f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			*vertShaderModule,
628f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			"main",
629f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(const VkSpecializationInfo*)DE_NULL,
630f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		},
631f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		{
632f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
633f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			DE_NULL,
634f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(VkPipelineShaderStageCreateFlags)0,
635f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,
636f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			*fragShaderModule,
637f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			"main",
638f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos			(const VkSpecializationInfo*)DE_NULL,
639f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos		}
640f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	};
641f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
642ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	vk::Move<VkPipelineLayout>					layout;
643378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<ShaderDescParams>					shaderDescParams;
644378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VertexDesc									vertexDesc;
645378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VertexDesc>							vertexDescList;
646378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkVertexInputAttributeDescription>	attrList;
647378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkBufferMemoryBarrier>				bufferMemoryBarrier;
648378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32									memoryBarrierNdx;
649378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32									bufferMemoryBarrierNdx;
650378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deUint32									imageMemoryBarrierNdx;
651378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkVertexInputBindingDescription>		bindingList;
652378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineVertexInputStateCreateInfo		vertexInputState;
653378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineInputAssemblyStateCreateInfo		inputAssemblyState;
654378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineDepthStencilStateCreateInfo		depthStencilState;
655378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineColorBlendAttachmentState			blendAttachment;
656378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineColorBlendStateCreateInfo			blendState;
657378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineLayoutCreateInfo					pipelineLayoutState;
658378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkGraphicsPipelineCreateInfo				pipelineState;
659378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineCacheCreateInfo					cacheState;
660378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkViewport									viewport;
661378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineViewportStateCreateInfo			viewportInfo;
662378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkRect2D									scissor;
663378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	BufferParameters							bufferParameters;
664378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	Buffer										buffer;
665378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	RenderInfo									renderInfo;
666378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	ImageParameters								imageParameters;
667378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	Image										image;
668378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineRasterizationStateCreateInfo		rasterState;
669378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkPipelineMultisampleStateCreateInfo		multisampleState;
670378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkFramebufferCreateInfo						fbState;
671378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBufferBeginInfo					commandBufRecordState;
672378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkCommandBufferInheritanceInfo				inheritanceInfo;
673378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	RenderPassParameters						renderPassParameters;
674378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TransferInfo								transferInfo;
675378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<void*>								barrierList;
676378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkExtent3D									extent;
677378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkMemoryBarrier>						memoryBarriers;
678378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkBufferMemoryBarrier>				bufferBarriers;
679378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vector<VkImageMemoryBarrier>				imageBarriers;
680378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
681378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarrierNdx			= 0;
682378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferMemoryBarrierNdx		= 0;
683378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageMemoryBarrierNdx		= 0;
684378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	buffer.memoryBarrier.resize(memoryBarrierNdx);
685378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferMemoryBarrier.resize(bufferMemoryBarrierNdx);
686378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	image.imageMemoryBarrier.resize(imageMemoryBarrierNdx);
687378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
688378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
689378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
690378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
691378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
692378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.memory					= testContext.vertices;
693378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.size					= testContext.numVertices * sizeof(tcu::Vec4);
694378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.usage					= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
695378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.sharingMode			= VK_SHARING_MODE_EXCLUSIVE;
696378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyCount		= 1;
697378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyIndex		= &queueFamilyNdx;
698378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.inputBarrierFlags		= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
699f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createVulkanBuffer(deviceInterface, testContext.device, testContext.allocator, bufferParameters, buffer, MemoryRequirement::HostVisible);
700378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.vertexBufferAllocation		= buffer.allocation;
701378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.vertexBuffer				= buffer.buffer;
702378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
703378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.memory					= DE_NULL;
704378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.size					= testContext.renderSize;
705378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.usage					= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
706378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.sharingMode			= VK_SHARING_MODE_EXCLUSIVE;
707378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyCount		= 1;
708378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.queueFamilyIndex		= &queueFamilyNdx;
709378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferParameters.inputBarrierFlags		= 0;
710f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createVulkanBuffer(deviceInterface, testContext.device, testContext.allocator, bufferParameters, buffer, MemoryRequirement::HostVisible);
711378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderReadBuffer			= buffer.allocation;
712378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderBuffer				= buffer.buffer;
713378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
714378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	extent.width							= testContext.renderDimension.x();
715378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	extent.height							= testContext.renderDimension.y();
716378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	extent.depth							= 1;
717378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
718653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	imageParameters.imageType				= VK_IMAGE_TYPE_2D;
719378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.format					= VK_FORMAT_R8G8B8A8_UNORM;
720378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.extent3D				= extent;
721378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.mipLevels				= 1;
722378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.samples					= VK_SAMPLE_COUNT_1_BIT;
723378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.tiling					= VK_IMAGE_TILING_OPTIMAL;
724378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.usage					= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
725378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.sharingMode				= VK_SHARING_MODE_EXCLUSIVE;
726378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.queueFamilyCount		= 1;
727378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.queueFamilyNdxList		= &queueFamilyNdx;
728378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.initialLayout			= VK_IMAGE_LAYOUT_UNDEFINED;
729378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.finalLayout				= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
730378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageParameters.barrierInputMask		= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
731f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createVulkanImage(deviceInterface, testContext.device, testContext.allocator, imageParameters, image, MemoryRequirement::Any);
732378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.imageAllocation				= image.allocation;
733378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.image						= image.image;
734378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
735159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	for (size_t ndx = 0; ndx < image.imageMemoryBarrier.size(); ++ndx)
736159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos		imageBarriers.push_back(image.imageMemoryBarrier[ndx]);
737159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos
738378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParameters.colorFormat		= VK_FORMAT_R8G8B8A8_UNORM;
739378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderPassParameters.colorSamples		= VK_SAMPLE_COUNT_1_BIT;
740f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createColorOnlyRenderPass(deviceInterface, testContext.device, renderPassParameters, testContext.renderPass);
741378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
742378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.location = 0;
743378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.format = VK_FORMAT_R32G32B32A32_SFLOAT;
744378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.stride = sizeof(tcu::Vec4);
745378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDesc.offset = 0;
746378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	vertexDescList.push_back(vertexDesc);
747378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
748378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	createVertexInfo(vertexDescList, bindingList, attrList, vertexInputState);
749378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
750ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&inputAssemblyState, 0xcd, sizeof(inputAssemblyState));
751378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inputAssemblyState.sType					= VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
752378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inputAssemblyState.pNext					= DE_NULL;
7537aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	inputAssemblyState.flags					= 0u;
754378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inputAssemblyState.topology					= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
755f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	inputAssemblyState.primitiveRestartEnable	= false;
756378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
757378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.x									= 0;
758378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.y									= 0;
759378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.width								= (float)testContext.renderDimension.x();
760378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.height								= (float)testContext.renderDimension.y();
761378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.minDepth							= 0;
762378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewport.maxDepth							= 1;
763378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
764378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.offset.x							= 0;
765378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.offset.y							= 0;
766378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.extent.width						= testContext.renderDimension.x();
767378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	scissor.extent.height						= testContext.renderDimension.y();
768378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
769ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&viewportInfo, 0xcd, sizeof(viewportInfo));
770378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.sType							= VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
771378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.pNext							= DE_NULL;
772378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.flags							= 0;
773378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.viewportCount					= 1;
774378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.pViewports						= &viewport;
775378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.scissorCount					= 1;
776378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	viewportInfo.pScissors						= &scissor;
777378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
778ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&rasterState, 0xcd, sizeof(rasterState));
779378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.sType							= VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
780378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.pNext							= DE_NULL;
781378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.flags							= 0;
782378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.depthClampEnable				= VK_TRUE;
783378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.rasterizerDiscardEnable			= VK_FALSE;
784378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.polygonMode						= VK_POLYGON_MODE_FILL;
785378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.cullMode						= VK_CULL_MODE_NONE;
786378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.frontFace						= VK_FRONT_FACE_COUNTER_CLOCKWISE;
787378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.depthBiasEnable					= VK_FALSE;
788378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	rasterState.lineWidth						= 1;
789378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
790ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&multisampleState, 0xcd, sizeof(multisampleState));
791378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.sType						= VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
792378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.pNext						= DE_NULL;
793378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.flags						= 0;
794378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.rasterizationSamples		= VK_SAMPLE_COUNT_1_BIT;
795378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.sampleShadingEnable		= VK_FALSE;
796378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.pSampleMask				= DE_NULL;
797378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.alphaToCoverageEnable		= VK_FALSE;
798378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	multisampleState.alphaToOneEnable			= VK_FALSE;
799378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
800ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&depthStencilState, 0xcd, sizeof(depthStencilState));
801378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.sType						= VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
802378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.pNext						= DE_NULL;
803378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.flags						= 0;
804378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.depthTestEnable			= VK_FALSE;
805378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.depthWriteEnable			= VK_FALSE;
806226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.depthCompareOp			= VK_COMPARE_OP_ALWAYS;
807378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.depthBoundsTestEnable		= VK_FALSE;
808378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	depthStencilState.stencilTestEnable			= VK_FALSE;
809159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.front.failOp				= VK_STENCIL_OP_KEEP;
810159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.front.passOp				= VK_STENCIL_OP_KEEP;
811159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.front.depthFailOp			= VK_STENCIL_OP_KEEP;
812226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.compareOp			= VK_COMPARE_OP_ALWAYS;
813226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.compareMask			= 0u;
814226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.writeMask			= 0u;
815226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	depthStencilState.front.reference			= 0u;
816159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	depthStencilState.back						= depthStencilState.front;
817378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
818ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&blendAttachment, 0xcd, sizeof(blendAttachment));
819378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendAttachment.blendEnable					= VK_FALSE;
820159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.srcColorBlendFactor			= VK_BLEND_FACTOR_ZERO;
821159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.srcAlphaBlendFactor			= VK_BLEND_FACTOR_ZERO;
822159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.dstColorBlendFactor			= VK_BLEND_FACTOR_ZERO;
823159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.dstAlphaBlendFactor			= VK_BLEND_FACTOR_ZERO;
824159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.colorBlendOp				= VK_BLEND_OP_ADD;
825159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendAttachment.alphaBlendOp				= VK_BLEND_OP_ADD;
8267aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	blendAttachment.colorWriteMask				= VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
827378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
828ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&blendState, 0xcd, sizeof(blendState));
829378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.sType							= VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
830378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.pNext							= DE_NULL;
831378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.flags							= 0;
832378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.logicOpEnable					= VK_FALSE;
833159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos	blendState.logicOp							= VK_LOGIC_OP_COPY;
834378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.attachmentCount					= 1;
835378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	blendState.pAttachments						= &blendAttachment;
836378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
837ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&pipelineLayoutState, 0xcd, sizeof(pipelineLayoutState));
838378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.sType					= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
839378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pNext					= DE_NULL;
840378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.flags					= 0;
841378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.setLayoutCount			= 0;
842378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pSetLayouts				= DE_NULL;
843378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pushConstantRangeCount	= 0;
844378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineLayoutState.pPushConstantRanges		= DE_NULL;
845ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	layout = createPipelineLayout(deviceInterface, testContext.device, &pipelineLayoutState, DE_NULL);
846378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
847ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&pipelineState, 0xcd, sizeof(pipelineState));
848378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.sType							= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
849378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pNext							= DE_NULL;
850378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.flags							= 0;
851f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	pipelineState.stageCount					= DE_LENGTH_OF_ARRAY(shaderStageParams);
852f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	pipelineState.pStages						= &shaderStageParams[0];
853378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pVertexInputState				= &vertexInputState;
854378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pInputAssemblyState			= &inputAssemblyState;
855378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pTessellationState			= DE_NULL;
856378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pViewportState				= &viewportInfo;
857378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pRasterizationState			= &rasterState;
858378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pMultisampleState				= &multisampleState;
859378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pDepthStencilState			= &depthStencilState;
860378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.pColorBlendState				= &blendState;
86186a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos	pipelineState.pDynamicState					= (const VkPipelineDynamicStateCreateInfo*)DE_NULL;
862ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	pipelineState.layout						= layout.get();
863ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	pipelineState.renderPass					= testContext.renderPass.get();
864378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.subpass						= 0;
865378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.basePipelineHandle			= DE_NULL;
866378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	pipelineState.basePipelineIndex				= 0;
867378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
868ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&cacheState, 0xcd, sizeof(cacheState));
869378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.sType							= VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
870378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.pNext							= DE_NULL;
871378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.flags							= 0;
872378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.initialDataSize					= 0;
873378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	cacheState.pInitialData						= DE_NULL;
874378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
8756222af852976871f07c00b792cae50eb458d0703Pyry Haulos	testContext.pipelineCache	= createPipelineCache(deviceInterface, testContext.device, &cacheState);
8766222af852976871f07c00b792cae50eb458d0703Pyry Haulos	testContext.pipeline		= createGraphicsPipeline(deviceInterface, testContext.device, testContext.pipelineCache.get(), &pipelineState);
877378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
878ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&fbState, 0xcd, sizeof(fbState));
879378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.sType								= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
880378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.pNext								= DE_NULL;
881378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.flags								= 0;
882ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	fbState.renderPass							= testContext.renderPass.get();
883378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.attachmentCount						= 1;
884378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.pAttachments						= &image.imageView.get();
885378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.width								= (deUint32)testContext.renderDimension.x();
886378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.height								= (deUint32)testContext.renderDimension.y();
887378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	fbState.layers								= 1;
888f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos
889f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	testContext.framebuffer	= createFramebuffer(deviceInterface, testContext.device, &fbState);
890f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	testContext.imageView	= image.imageView;
891378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
892ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&inheritanceInfo, 0xcd, sizeof(inheritanceInfo));
893378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.sType						= VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
894378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.pNext						= DE_NULL;
895ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	inheritanceInfo.renderPass					= testContext.renderPass.get();
896378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.subpass						= 0;
897f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	inheritanceInfo.framebuffer					= *testContext.framebuffer;
898378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	inheritanceInfo.occlusionQueryEnable		= VK_FALSE;
8997aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	inheritanceInfo.queryFlags					= 0u;
9007aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	inheritanceInfo.pipelineStatistics			= 0u;
901378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
902ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	deMemset(&commandBufRecordState, 0xcd, sizeof(commandBufRecordState));
903378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.sType					= VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
904378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.pNext					= DE_NULL;
905378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.flags					= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
906378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	commandBufRecordState.pInheritanceInfo		= &inheritanceInfo;
907378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.beginCommandBuffer(testContext.cmdBuffer.get(), &commandBufRecordState));
908378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
909378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdPipelineBarrier( testContext.cmdBuffer.get(),
910378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_HOST_BIT,
911378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
912f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman										false,
913f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]),
914f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]),
915f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0]));
916378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
917378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
918378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
919378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
920378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
921378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.width				= testContext.renderDimension.x();
922378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.height				= testContext.renderDimension.y();
923378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.vertexBufferSize		= testContext.numVertices;
924378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.vertexBuffer			= testContext.vertexBuffer.get();
925378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.image				= testContext.image.get();
926378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.commandBuffer		= testContext.cmdBuffer.get();
927ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman	renderInfo.renderPass			= testContext.renderPass.get();
928f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	renderInfo.framebuffer			= *testContext.framebuffer;
9296222af852976871f07c00b792cae50eb458d0703Pyry Haulos	renderInfo.pipeline				= *testContext.pipeline;
930378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.mipLevels			= 1;
931378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.queueFamilyNdxList	= &queueFamilyNdx;
932378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.queueFamilyNdxCount	= 1;
933378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.waitEvent			= testContext.waitEvent;
934378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.event				= testContext.event;
935378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	renderInfo.barriers				= &imageBarriers;
936f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	recordRenderPass(deviceInterface, renderInfo);
937378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
938378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdPipelineBarrier(	renderInfo.commandBuffer,
939378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
940378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_TRANSFER_BIT,
941f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman										false,
942f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]),
943f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]),
944f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0]));
945378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
946378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
947378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
948378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
949378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
950378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.commandBuffer		= renderInfo.commandBuffer;
951378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.width				= testContext.renderDimension.x();
952378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.height				= testContext.renderDimension.y();
953378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.image				= renderInfo.image;
954378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.buffer				= testContext.renderBuffer.get();
955378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.size				= testContext.renderSize;
956378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.mipLevel			= 0;
957378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.imageOffset.x		= 0;
958378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.imageOffset.y		= 0;
959378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.imageOffset.z		= 0;
960378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	transferInfo.barriers			= &bufferBarriers;
961f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	copyToCPU(deviceInterface, &transferInfo);
962378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
963378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	deviceInterface.cmdPipelineBarrier(	transferInfo.commandBuffer,
964378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_TRANSFER_BIT,
965378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman										VK_PIPELINE_STAGE_HOST_BIT,
966f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman										false,
967f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]),
968f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]),
969f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos										(deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0]));
970378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
971378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	memoryBarriers.resize(0);
972378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	bufferBarriers.resize(0);
973378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	imageBarriers.resize(0);
974378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
975378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.endCommandBuffer(transferInfo.commandBuffer));
976378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
977378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
978378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstatic void initSubmitInfo (VkSubmitInfo* submitInfo, deUint32 submitInfoCount)
979378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
980378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	for (deUint32 ndx = 0; ndx < submitInfoCount; ndx++)
981378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
982378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].sType					= VK_STRUCTURE_TYPE_SUBMIT_INFO;
983378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pNext					= DE_NULL;
984378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].waitSemaphoreCount		= 0;
985378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pWaitSemaphores			= DE_NULL;
986378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pWaitDstStageMask		= DE_NULL;
987378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].commandBufferCount		= 1;
988378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].signalSemaphoreCount	= 0;
989378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		submitInfo[ndx].pSignalSemaphores		= DE_NULL;
990378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
991378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
992378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
993378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testFences (Context& context)
994378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
995378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TestLog&					log					= context.getTestContext().getLog();
996378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const DeviceInterface&		deviceInterface		= context.getDeviceInterface();
997378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkQueue				queue				= context.getUniversalQueue();
998378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const deUint32				queueFamilyIdx		= context.getUniversalQueueFamilyIndex();
999271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	VkDevice					device				= context.getDevice();
10003241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	VkResult					waitStatus;
1001378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					fenceStatus;
1002f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext					testContext			(deviceInterface, device, queueFamilyIdx, context.getBinaryCollection(), context.getDefaultAllocator());
1003378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSubmitInfo				submitInfo;
1004378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkMappedMemoryRange			range;
1005378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	void*						resultImage;
1006378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1007378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4				vertices[]			=
1008378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1009378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.5f,  0.5f, 0.0f, 1.0f),
1010378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f,  0.5f, 0.0f, 1.0f),
1011378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f)
1012378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1013378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1014378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.vertices = vertices;
1015378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.numVertices = DE_LENGTH_OF_ARRAY(vertices);
1016378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderDimension = tcu::IVec2(256, 256);
1017378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	testContext.renderSize = sizeof(deUint32) * testContext.renderDimension.x() * testContext.renderDimension.y();
1018378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1019f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createCommandBuffer(deviceInterface, device, queueFamilyIdx, &testContext.cmdBuffer, &testContext.commandPool);
1020378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	generateWork(testContext);
1021378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1022378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	initSubmitInfo(&submitInfo, 1);
1023378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	submitInfo.pCommandBuffers		= &testContext.cmdBuffer.get();
1024378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1025271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	// Default status is unsignaled
1026271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[0]);
1027378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (fenceStatus != VK_NOT_READY)
1028378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1029271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives fence 0 should be reset but status is " << getResultName(fenceStatus) << TestLog::EndMessage;
1030378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("Fence in incorrect state");
1031378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1032271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[1]);
1033271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	if (fenceStatus != VK_NOT_READY)
1034271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	{
1035271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives fence 1 should be reset but status is " << getResultName(fenceStatus) << TestLog::EndMessage;
1036271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		return tcu::TestStatus::fail("Fence in incorrect state");
1037271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	}
1038271157f1dfdc1129586f47e8064874d107f3edaeDae Kim
1039271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	VK_CHECK(deviceInterface.queueSubmit(queue, 1, &submitInfo, testContext.fences[0]));
1040378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10413241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait with timeout = 0
1042f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, 0u);
10433241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_SUCCESS && waitStatus != VK_TIMEOUT)
1044378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
10453241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		// Will most likely end with VK_TIMEOUT
10463241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSynchPrimitives failed to wait for a single fence" << TestLog::EndMessage;
10473241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("Failed to wait for a single fence");
1048378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1049378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10503241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait with a reasonable timeout
1051f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, DEFAULT_TIMEOUT);
10523241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_SUCCESS && waitStatus != VK_TIMEOUT)
10533241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	{
10543241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		// \note Wait can end with a timeout if DEFAULT_TIMEOUT is not sufficient
10553241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSynchPrimitives failed to wait for a single fence" << TestLog::EndMessage;
10563241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("Failed to wait for a single fence");
10573241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	}
1058378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10593241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait for work on fences[0] to actually complete
1060f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, std::numeric_limits<deUint64>::max());
10613241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_SUCCESS)
1062378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
10633241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSynchPrimitives failed to wait for a fence" << TestLog::EndMessage;
10643241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("failed to wait for a fence");
1065378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1066378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
10673241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	// Wait until timeout on a fence that has not been submitted
1068f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[1], true, 1);
10693241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos	if (waitStatus != VK_TIMEOUT)
1070378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
10713241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		log << TestLog::Message << "testSyncPrimitives failed to timeout on wait for single fence" << TestLog::EndMessage;
10723241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos		return tcu::TestStatus::fail("failed to timeout on wait for single fence");
1073378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1074378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1075271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	// Check that the fence is signaled after the wait
1076271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[0]);
1077378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (fenceStatus != VK_SUCCESS)
1078378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1079271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives fence should be signaled but status is " << getResultName(fenceStatus) << TestLog::EndMessage;
1080378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("Fence in incorrect state");
1081378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1082378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1083378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1084378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1085378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.memory		= testContext.renderReadBuffer->getMemory();
1086378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1087378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.size			= testContext.renderSize;
1088271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device, 1, &range));
1089378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	resultImage = testContext.renderReadBuffer->getHostPtr();
1090378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1091378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1092378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1093378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1094378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1095378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext.renderDimension.x(),
1096378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext.renderDimension.y(),
1097378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1098378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1099378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1100271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	return TestStatus::pass("synchronization-fences passed");
1101378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1102378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1103378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testSemaphores (Context& context)
1104378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1105378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TestLog&					log					= context.getTestContext().getLog();
1106378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const InstanceInterface&	instanceInterface	= context.getInstanceInterface();
1107378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const VkPhysicalDevice		physicalDevice		= context.getPhysicalDevice();
1108271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	deUint32					queueFamilyIdx;
1109271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	vk::Move<VkDevice>			device				= createTestDevice(instanceInterface, physicalDevice, &queueFamilyIdx);
1110f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	const DeviceDriver			deviceInterface		(instanceInterface, *device);
1111f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	SimpleAllocator				allocator			(deviceInterface,
1112f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos													 *device,
1113f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos													 getPhysicalDeviceMemoryProperties(instanceInterface, physicalDevice));
1114da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	const VkQueue				queue[2]			=
1115da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	{
1116da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi		getDeviceQueue(deviceInterface, *device, queueFamilyIdx, 0),
1117da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi		getDeviceQueue(deviceInterface, *device, queueFamilyIdx, 1)
1118da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	};
1119378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					testStatus;
1120f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext					testContext1		(deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator);
1121f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	TestContext					testContext2		(deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator);
1122da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	Unique<VkSemaphore>			semaphore			(createSemaphore(deviceInterface, *device));
1123378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkSubmitInfo				submitInfo[2];
1124378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkMappedMemoryRange			range;
1125378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	void*						resultImage;
1126226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	const VkPipelineStageFlags	waitDstStageMask	= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
1127378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1128378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4		vertices1[]			=
1129378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1130378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.5f,  0.5f, 0.0f, 1.0f),
1131378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f,  0.5f, 0.0f, 1.0f),
1132378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f)
1133378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1134378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1135378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4		vertices2[]			=
1136378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1137378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
1138378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
1139378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
1140378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1141378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1142271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.vertices			= vertices1;
1143271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.numVertices		= DE_LENGTH_OF_ARRAY(vertices1);
1144271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.renderDimension	= tcu::IVec2(256, 256);
1145271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext1.renderSize			= sizeof(deUint32) * testContext1.renderDimension.x() * testContext1.renderDimension.y();
1146378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1147271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.vertices			= vertices2;
1148271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.numVertices		= DE_LENGTH_OF_ARRAY(vertices2);
1149271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.renderDimension	= tcu::IVec2(256, 256);
1150271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	testContext2.renderSize			= sizeof(deUint32) * testContext2.renderDimension.x() * testContext2.renderDimension.y();
1151378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1152f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createCommandBuffer(deviceInterface, device.get(), queueFamilyIdx, &testContext1.cmdBuffer, &testContext1.commandPool);
1153378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	generateWork(testContext1);
1154378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1155f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos	createCommandBuffer(deviceInterface, device.get(), queueFamilyIdx, &testContext2.cmdBuffer, &testContext2.commandPool);
1156378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	generateWork(testContext2);
1157378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1158378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	initSubmitInfo(submitInfo, DE_LENGTH_OF_ARRAY(submitInfo));
1159378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1160378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	// The difference between the two submit infos is that each will use a unique cmd buffer,
1161378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	// and one will signal a semaphore but not wait on a semaphore, the other will wait on the
1162378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	// semaphore but not signal a semaphore
1163271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[0].pCommandBuffers		= &testContext1.cmdBuffer.get();
1164271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[1].pCommandBuffers		= &testContext2.cmdBuffer.get();
1165378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1166271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[0].signalSemaphoreCount	= 1;
1167271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[0].pSignalSemaphores		= &semaphore.get();
1168271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[1].waitSemaphoreCount	= 1;
1169271157f1dfdc1129586f47e8064874d107f3edaeDae Kim	submitInfo[1].pWaitSemaphores		= &semaphore.get();
1170226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski	submitInfo[1].pWaitDstStageMask		= &waitDstStageMask;
1171378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1172378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.queueSubmit(queue[0], 1, &submitInfo[0], testContext1.fences[0]));
1173378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
11746e70e1764f44364869c497a32671faddf8152293Ilya Zaytsev	testStatus  = deviceInterface.waitForFences(device.get(), 1, &testContext1.fences[0], true, std::numeric_limits<deUint64>::max());
1175378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (testStatus != VK_SUCCESS)
1176378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1177378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		log << TestLog::Message << "testSynchPrimitives failed to wait for a set fence" << TestLog::EndMessage;
1178378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("failed to wait for a set fence");
1179378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1180378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1181378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1182378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1183378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.memory		= testContext1.renderReadBuffer->getMemory();
1184378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1185378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.size			= testContext1.renderSize;
1186378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device.get(), 1, &range));
1187378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	resultImage = testContext1.renderReadBuffer->getHostPtr();
1188378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1189378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1190378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1191378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1192378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1193378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext1.renderDimension.x(),
1194378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext1.renderDimension.y(),
1195378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1196378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1197378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1198378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.queueSubmit(queue[1], 1, &submitInfo[1], testContext2.fences[0]));
1199378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
12006e70e1764f44364869c497a32671faddf8152293Ilya Zaytsev	testStatus  = deviceInterface.waitForFences(device.get(), 1, &testContext2.fences[0], true, std::numeric_limits<deUint64>::max());
1201378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (testStatus != VK_SUCCESS)
1202378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1203378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		log << TestLog::Message << "testSynchPrimitives failed to wait for a set fence" << TestLog::EndMessage;
1204378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("failed to wait for a set fence");
1205378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1206378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1207378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1208378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1209378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.memory		= testContext2.renderReadBuffer->getMemory();
1210378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1211378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.size			= testContext2.renderSize;
1212378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device.get(), 1, &range));
1213378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	resultImage = testContext2.renderReadBuffer->getHostPtr();
1214378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1215378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1216378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1217378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1218378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1219378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext2.renderDimension.x(),
1220378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									testContext2.renderDimension.y(),
1221378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1222378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1223378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1224378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return tcu::TestStatus::pass("synchronization-semaphores passed");
1225378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1226378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1227378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testEvents (Context& context)
1228378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
1229378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	TestLog&					log					= context.getTestContext().getLog();
1230f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	const DeviceInterface&		deviceInterface		= context.getDeviceInterface();
1231f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VkDevice					device				= context.getDevice();
1232f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	const deUint32				queueFamilyIdx		= context.getUniversalQueueFamilyIndex();
1233f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	Allocator&					allocator			= context.getDefaultAllocator();
1234f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VkQueue						queue				= context.getUniversalQueue();
1235378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					testStatus;
1236378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkResult					eventStatus;
1237f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	TestContext					testContext			(deviceInterface, device, queueFamilyIdx, context.getBinaryCollection(), allocator);
1238da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	Unique<VkEvent>				event				(createEvent(deviceInterface, device));
1239f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VkSubmitInfo				submitInfo;
1240378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	VkMappedMemoryRange			range;
1241378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	void*						resultImage;
1242378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1243378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	const tcu::Vec4		vertices1[]			=
1244378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1245378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.5f,  0.5f, 0.0f, 1.0f),
1246378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4(-0.5f,  0.5f, 0.0f, 1.0f),
1247378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f)
1248378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	};
1249378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1250f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.vertices = vertices1;
1251f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.numVertices = DE_LENGTH_OF_ARRAY(vertices1);
1252f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.renderDimension = tcu::IVec2(256, 256);
1253f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.waitEvent = true;
1254f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.event = event.get();
1255f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testContext.renderSize = sizeof(deUint32) * testContext.renderDimension.x() * testContext.renderDimension.y();
1256378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1257f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	createCommandBuffer(deviceInterface, device, queueFamilyIdx, &testContext.cmdBuffer, &testContext.commandPool);
1258f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	generateWork(testContext);
1259378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1260f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	initSubmitInfo(&submitInfo, 1);
1261f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	submitInfo.pCommandBuffers = &testContext.cmdBuffer.get();
1262378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1263f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// 6.3 An event is initially in the unsignaled state
1264f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	eventStatus = deviceInterface.getEventStatus(device, event.get());
1265378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (eventStatus != VK_EVENT_RESET)
1266378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1267271157f1dfdc1129586f47e8064874d107f3edaeDae Kim		log << TestLog::Message << "testSynchronizationPrimitives event should be reset but status is " << getResultName(eventStatus) << TestLog::EndMessage;
1268378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman		return tcu::TestStatus::fail("Event in incorrect status");
1269378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1270378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1271f093f4b9e448947e887868ffc0d23b45c31ee9b0David 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
1272f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// make forward progress as long as the event is not signaled
1273f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VK_CHECK(deviceInterface.queueSubmit(queue, 1, &submitInfo, testContext.fences[0]));
1274378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
12750e54da35ac023351bb8b3bd4f55d0c98d812ef8dPeter Quayle	testStatus  = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, 10000000);
1276f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	if (testStatus != VK_TIMEOUT)
1277378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1278f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		log << TestLog::Message << "testSynchronizationPrimitives failed to wait for set event from host." << TestLog::EndMessage;
1279f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		return tcu::TestStatus::fail("failed to wait for event set from host");
1280378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1281378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1282f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	// Should allow the recorded command buffer to finally make progress
1283f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VK_CHECK(deviceInterface.setEvent(device, event.get()));
1284f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	eventStatus = deviceInterface.getEventStatus(device, event.get());
1285f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	if (eventStatus != VK_EVENT_SET)
1286f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	{
1287f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		log << TestLog::Message << "testEvents failed to transition event to signaled state via setEvent call from host" << TestLog::EndMessage;
1288f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		return tcu::TestStatus::fail("failed to signal event from host");
1289f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	}
1290378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1291f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	testStatus  = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, ~(0ull));
1292378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	if (testStatus != VK_SUCCESS)
1293378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	{
1294f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		log << TestLog::Message << "testSynchronizationPrimitives failed to proceed after set event from host." << TestLog::EndMessage;
1295f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman		return tcu::TestStatus::fail("failed to proceed after event set from host");
1296378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	}
1297378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1298378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.sType			= VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
1299378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.pNext			= DE_NULL;
1300f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	range.memory		= testContext.renderReadBuffer->getMemory();
1301378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	range.offset		= 0;
1302f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	range.size			= testContext.renderSize;
1303f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device, 1, &range));
1304f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman	resultImage = testContext.renderReadBuffer->getHostPtr();
1305378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1306378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	log << TestLog::Image(	"result",
1307378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							"result",
1308378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman							tcu::ConstPixelBufferAccess(tcu::TextureFormat(
1309378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
1310f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman									testContext.renderDimension.x(),
1311f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman									testContext.renderDimension.y(),
1312378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									1,
1313378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman									resultImage));
1314378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1315378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return tcu::TestStatus::pass("synchronization-events passed");
1316378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1317378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1318378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} // anonymous
1319378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
13207aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowskitcu::TestCaseGroup* createSmokeTests (tcu::TestContext& textCtx)
1321378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{
13227aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski	de::MovePtr<tcu::TestCaseGroup> synchTests  (new tcu::TestCaseGroup(textCtx, "smoke", "Synchronization smoke tests"));
1323378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1324378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	addFunctionCaseWithPrograms(synchTests.get(), "fences", "", buildShaders, testFences);
1325378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	addFunctionCaseWithPrograms(synchTests.get(), "semaphores", "", buildShaders, testSemaphores);
1326378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	addFunctionCaseWithPrograms(synchTests.get(), "events", "", buildShaders, testEvents);
1327378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
1328378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman	return synchTests.release();
1329378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}
1330378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman
13317aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski} // synchronization
13327aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski} // vkt
1333