vktRenderPassTests.cpp revision 978d3d585aa549eb1e729b51e9d85fc6477240f9
1c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi/*-------------------------------------------------------------------------
2c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Vulkan Conformance Tests
3c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * ------------------------
4c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
5c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Copyright (c) 2015 Google Inc.
6c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
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
10c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
12c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
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.
18c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
19c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*!
20c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \file
21c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \brief RenderPass tests
22c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*--------------------------------------------------------------------*/
23c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
24c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktRenderPassTests.hpp"
25c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
26c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktTestCaseUtil.hpp"
27c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
28c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDefs.hpp"
29c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDeviceUtil.hpp"
30c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkImageUtil.hpp"
31c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkMemUtil.hpp"
32c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPlatform.hpp"
33c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPrograms.hpp"
34c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkQueryUtil.hpp"
35c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRef.hpp"
36c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRefUtil.hpp"
37c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkStrUtil.hpp"
38c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkTypeUtil.hpp"
39c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
40c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTestLog.hpp"
41c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuResultCollector.hpp"
42c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFormatUtil.hpp"
43c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTextureUtil.hpp"
44c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFloat.hpp"
45c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuMaybe.hpp"
46c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuVectorUtil.hpp"
47c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
48c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deUniquePtr.hpp"
49c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSharedPtr.hpp"
50c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deStringUtil.hpp"
51c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSTLUtil.hpp"
52c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deRandom.hpp"
53c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include <limits>
55c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
56c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing namespace vk;
57c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
58c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Maybe;
59c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::nothing;
60c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::just;
61c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::TestLog;
62c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec2;
63c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec2;
64c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec2;
65c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec4;
66c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec4;
67c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec4;
68c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::BVec4;
69c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::ConstPixelBufferAccess;
70c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::PixelBufferAccess;
71c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
72c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing de::UniquePtr;
73c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
74c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::vector;
75c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::string;
76c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
77c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace vkt
78c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
79c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace
80c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
81c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvienum
82c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
83c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	STENCIL_VALUE = 84u,
84c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Limit integer values that are representable as floats
85c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	MAX_INTEGER_VALUE = ((1u<<22u)-1u)
86c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
87c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
88c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi// Utility functions using flattened structs
89c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFence> createFence (const DeviceInterface& vk, VkDevice device, VkFenceCreateFlags flags)
90c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
91c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkFenceCreateInfo pCreateInfo =
92c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
93c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
94c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
95c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
96c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		flags
97c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
98955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createFence(vk, device, &pCreateInfo);
99c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
10168e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkFramebuffer> createFramebuffer (const DeviceInterface&	vk,
10268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkDevice					device,
10368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkFramebufferCreateFlags	pCreateInfo_flags,
10468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkRenderPass				pCreateInfo_renderPass,
10568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_attachmentCount,
10668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   const VkImageView*		pCreateInfo_pAttachments,
10768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_width,
10868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_height,
10968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_layers)
110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkFramebufferCreateInfo pCreateInfo =
112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
11568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_renderPass,
117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_attachmentCount,
118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pAttachments,
119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_width,
120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_height,
121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_layers,
122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
123955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createFramebuffer(vk, device, &pCreateInfo);
124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
12668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkImage> createImage (const DeviceInterface&	vk,
12768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkDevice					device,
12868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageCreateFlags		pCreateInfo_flags,
12968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageType				pCreateInfo_imageType,
13068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkFormat					pCreateInfo_format,
13168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkExtent3D				pCreateInfo_extent,
13268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_mipLevels,
13368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_arrayLayers,
13468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkSampleCountFlagBits	pCreateInfo_samples,
13568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageTiling			pCreateInfo_tiling,
13668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageUsageFlags		pCreateInfo_usage,
13768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkSharingMode			pCreateInfo_sharingMode,
13868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_queueFamilyCount,
13968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   const deUint32*			pCreateInfo_pQueueFamilyIndices,
14068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageLayout			pCreateInfo_initialLayout)
141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageCreateInfo pCreateInfo =
143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
14668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_imageType,
148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_format,
149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_extent,
150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_mipLevels,
15168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_arrayLayers,
152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_samples,
153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_tiling,
154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_usage,
155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_sharingMode,
156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyCount,
157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pQueueFamilyIndices,
158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_initialLayout
159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
160955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createImage(vk, device, &pCreateInfo);
161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindBufferMemory (const DeviceInterface& vk, VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset)
164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.bindBufferMemory(device, buffer, mem, memOffset));
166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindImageMemory (const DeviceInterface& vk, VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset)
169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.bindImageMemory(device, image, mem, memOffset));
171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
173c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageView (const DeviceInterface&	vk,
174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkDevice				device,
17568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkImageViewCreateFlags	pCreateInfo_flags,
176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkImage					pCreateInfo_image,
177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkImageViewType			pCreateInfo_viewType,
178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkFormat				pCreateInfo_format,
17968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkComponentMapping		pCreateInfo_components,
18068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkImageSubresourceRange	pCreateInfo_subresourceRange)
181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageViewCreateInfo pCreateInfo =
183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
18668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_image,
188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_viewType,
189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_format,
19068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_components,
191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_subresourceRange,
192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
193955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createImageView(vk, device, &pCreateInfo);
194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
19668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkBuffer> createBuffer (const DeviceInterface&	vk,
19768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkDevice				device,
19868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkBufferCreateFlags	pCreateInfo_flags,
19968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkDeviceSize			pCreateInfo_size,
20068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkBufferUsageFlags		pCreateInfo_usage,
20168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkSharingMode			pCreateInfo_sharingMode,
20268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 deUint32				pCreateInfo_queueFamilyCount,
20368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 const deUint32*		pCreateInfo_pQueueFamilyIndices)
204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkBufferCreateInfo pCreateInfo =
206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
20968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_size,
211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_usage,
212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_sharingMode,
213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyCount,
214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pQueueFamilyIndices,
215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
216955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createBuffer(vk, device, &pCreateInfo);
217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
21968e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandPool> createCommandPool (const DeviceInterface&	vk,
22068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkDevice					device,
22168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkCommandPoolCreateFlags	pCreateInfo_flags,
22268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_queueFamilyIndex)
223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
22468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandPoolCreateInfo pCreateInfo =
225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
22668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_flags,
229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyIndex,
230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
231955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createCommandPool(vk, device, &pCreateInfo);
232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
23468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid cmdBeginRenderPass (const DeviceInterface&	vk,
23568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBuffer		cmdBuffer,
23668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRenderPass			pRenderPassBegin_renderPass,
23768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkFramebuffer			pRenderPassBegin_framebuffer,
23868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRect2D				pRenderPassBegin_renderArea,
23968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 deUint32				pRenderPassBegin_clearValueCount,
24068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 const VkClearValue*	pRenderPassBegin_pAttachmentClearValues,
24168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkSubpassContents		contents)
242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkRenderPassBeginInfo pRenderPassBegin =
244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_renderPass,
248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_framebuffer,
249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_renderArea,
25068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pRenderPassBegin_clearValueCount,
251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_pAttachmentClearValues,
252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vk.cmdBeginRenderPass(cmdBuffer, &pRenderPassBegin, contents);
254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
25668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandBuffer> allocateCommandBuffer (const DeviceInterface&	vk,
25768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkDevice				device,
25868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkCommandPool			pCreateInfo_commandPool,
25968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkCommandBufferLevel	pCreateInfo_level)
260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
261955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	const VkCommandBufferAllocateInfo pAllocateInfo =
262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
26368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
26568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_commandPool,
266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_level,
26768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// bufferCount
268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
269955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return allocateCommandBuffer(vk, device, &pAllocateInfo);
270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
27268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid beginCommandBuffer (const DeviceInterface&			vk,
27368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBuffer				cmdBuffer,
27468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBufferUsageFlags		pBeginInfo_flags,
275689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkRenderPass					pInheritanceInfo_renderPass,
276689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 deUint32						pInheritanceInfo_subpass,
277689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkFramebuffer					pInheritanceInfo_framebuffer,
278689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkBool32						pInheritanceInfo_occlusionQueryEnable,
279689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkQueryControlFlags			pInheritanceInfo_queryFlags,
280689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkQueryPipelineStatisticFlags	pInheritanceInfo_pipelineStatistics)
281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
282689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const VkCommandBufferInheritanceInfo	pInheritanceInfo	=
283689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	{
284689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
285689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		DE_NULL,
286689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_renderPass,
287689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_subpass,
288689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_framebuffer,
289689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_occlusionQueryEnable,
290689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_queryFlags,
291689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_pipelineStatistics,
292689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	};
293689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const VkCommandBufferBeginInfo			pBeginInfo			=
294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
29568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pBeginInfo_flags,
298689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		&pInheritanceInfo,
299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.beginCommandBuffer(cmdBuffer, &pBeginInfo));
301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid endCommandBuffer (const DeviceInterface& vk, VkCommandBuffer cmdBuffer)
304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.endCommandBuffer(cmdBuffer));
306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
30868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid queueSubmit (const DeviceInterface& vk, VkQueue queue, deUint32 cmdBufferCount, const VkCommandBuffer* pCmdBuffers, VkFence fence)
309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
31068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkSubmitInfo submitInfo =
31168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	{
31268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_SUBMIT_INFO,
31368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,
31468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,								// waitSemaphoreCount
31568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,	// pWaitSemaphores
316689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
31768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		cmdBufferCount,					// commandBufferCount
31868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCmdBuffers,
31968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,								// signalSemaphoreCount
32068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,	// pSignalSemaphores
32168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	};
32268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence));
323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid waitForFences (const DeviceInterface& vk, VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout)
326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.waitForFences(device, fenceCount, pFences, waitAll, timeout));
328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
330c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkImageAspectFlags getImageAspectFlags (VkFormat vkFormat)
331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat format = mapVkFormat(vkFormat);
333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (format.order)
337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::DS:
339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::D:
342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_DEPTH_BIT;
343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::S:
345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_STENCIL_BIT;
346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_COLOR_BIT;
349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
35268e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryReadFlags (void)
353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
35468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_ACCESS_TRANSFER_READ_BIT
35568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_UNIFORM_READ_BIT
35668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_HOST_READ_BIT
35768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INDEX_READ_BIT
35868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_SHADER_READ_BIT
35968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
36068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INDIRECT_COMMAND_READ_BIT
36168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
36368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
36668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryWriteFlags (void)
367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
36868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_ACCESS_TRANSFER_WRITE_BIT
36968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_HOST_WRITE_BIT
37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_SHADER_WRITE_BIT
37168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
375c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkPipelineStageFlags getAllPipelineStageFlags (void)
376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
37768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_TRANSFER_BIT
379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentReference
393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					AttachmentReference		(deUint32		attachment,
396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout	layout)
397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_attachment	(attachment)
398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_layout		(layout)
399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32		getAttachment			(void) const { return m_attachment;	}
403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout	getImageLayout			(void) const { return m_layout;		}
404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32		m_attachment;
407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout	m_layout;
408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Subpass
411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										Subpass						(VkPipelineBindPoint				pipelineBindPoint,
414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 VkSubpassDescriptionFlags			flags,
415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	inputAttachments,
416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	colorAttachments,
417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	resolveAttachments,
418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 AttachmentReference				depthStencilAttachment,
419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	preserveAttachments)
420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_pipelineBindPoint		(pipelineBindPoint)
421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_flags					(flags)
422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_inputAttachments		(inputAttachments)
423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorAttachments		(colorAttachments)
424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_resolveAttachments		(resolveAttachments)
425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depthStencilAttachment	(depthStencilAttachment)
426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_preserveAttachments		(preserveAttachments)
427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineBindPoint					getPipelineBindPoint		(void) const { return m_pipelineBindPoint;		}
431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			getFlags					(void) const { return m_flags;					}
432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getInputAttachments			(void) const { return m_inputAttachments;		}
433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getColorAttachments			(void) const { return m_colorAttachments;		}
434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getResolveAttachments		(void) const { return m_resolveAttachments;		}
435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const AttachmentReference&			getDepthStencilAttachment	(void) const { return m_depthStencilAttachment;	}
436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getPreserveAttachments		(void) const { return m_preserveAttachments;	}
437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineBindPoint					m_pipelineBindPoint;
440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			m_flags;
441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_inputAttachments;
443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_colorAttachments;
444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_resolveAttachments;
445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	AttachmentReference					m_depthStencilAttachment;
446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_preserveAttachments;
448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassDependency
451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							SubpassDependency	(deUint32				srcPass,
454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 deUint32				dstPass,
455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VkPipelineStageFlags	srcStageMask,
457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VkPipelineStageFlags	dstStageMask,
458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
45968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkAccessFlags			outputMask,
46068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkAccessFlags			inputMask,
461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
46268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkDependencyFlags		flags)
463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_srcPass			(srcPass)
464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dstPass			(dstPass)
465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_srcStageMask	(srcStageMask)
467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dstStageMask	(dstStageMask)
468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_outputMask		(outputMask)
470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_inputMask		(inputMask)
47168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		, m_flags			(flags)
472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				getSrcPass			(void) const { return m_srcPass;		}
476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				getDstPass			(void) const { return m_dstPass;		}
477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	getSrcStageMask		(void) const { return m_srcStageMask;	}
479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	getDstStageMask		(void) const { return m_dstStageMask;	}
480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
48168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			getOutputMask		(void) const { return m_outputMask;		}
48268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			getInputMask		(void) const { return m_inputMask;		}
483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
48468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkDependencyFlags		getFlags			(void) const { return m_flags;		}
485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				m_srcPass;
488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				m_dstPass;
489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	m_srcStageMask;
491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	m_dstStageMask;
492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
49368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			m_outputMask;
49468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			m_inputMask;
49568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkDependencyFlags		m_flags;
496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Attachment
499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						Attachment			(VkFormat				format,
50268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkSampleCountFlagBits	samples,
503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentLoadOp		loadOp,
505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentStoreOp	storeOp,
506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentLoadOp		stencilLoadOp,
508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentStoreOp	stencilStoreOp,
509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout			initialLayout,
511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout			finalLayout)
512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_format			(format)
513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_samples			(samples)
514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_loadOp			(loadOp)
516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_storeOp			(storeOp)
517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencilLoadOp	(stencilLoadOp)
519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencilStoreOp	(stencilStoreOp)
520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_initialLayout	(initialLayout)
522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_finalLayout		(finalLayout)
523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
52668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkFormat				getFormat			(void) const { return m_format;			}
52768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkSampleCountFlagBits	getSamples			(void) const { return m_samples;		}
528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
52968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		getLoadOp			(void) const { return m_loadOp;			}
53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		getStoreOp			(void) const { return m_storeOp;		}
531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		getStencilLoadOp	(void) const { return m_stencilLoadOp;	}
53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		getStencilStoreOp	(void) const { return m_stencilStoreOp;	}
535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
53668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			getInitialLayout	(void) const { return m_initialLayout;	}
53768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			getFinalLayout		(void) const { return m_finalLayout;	}
538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkFormat				m_format;
54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkSampleCountFlagBits	m_samples;
542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		m_loadOp;
54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		m_storeOp;
545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		m_stencilLoadOp;
54768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		m_stencilStoreOp;
548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			m_initialLayout;
55068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			m_finalLayout;
551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderPass
554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										RenderPass		(const vector<Attachment>&			attachments,
557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 const vector<Subpass>&				subpasses,
558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 const vector<SubpassDependency>&	dependencies)
559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_attachments		(attachments)
560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_subpasses		(subpasses)
561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dependencies	(dependencies)
562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Attachment>&			getAttachments	(void) const { return m_attachments;	}
566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&				getSubpasses	(void) const { return m_subpasses;		}
567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<SubpassDependency>&	getDependencies	(void) const { return m_dependencies;	}
568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Attachment>			m_attachments;
571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>				m_subpasses;
572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<SubpassDependency>		m_dependencies;
573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistruct TestConfig
576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum RenderTypes
578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_NONE	= 0,
580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_CLEAR	= (1<<1),
581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_DRAW	= (1<<2)
582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum CommandBufferTypes
585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COMMANDBUFFERTYPES_INLINE		= (1<<0),
587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COMMANDBUFFERTYPES_SECONDARY	= (1<<1)
588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum ImageMemory
591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		IMAGEMEMORY_STRICT		= (1<<0),
593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		IMAGEMEMORY_LAZY		= (1<<1)
594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	TestConfig (const RenderPass&	renderPass_,
597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				RenderTypes			renderTypes_,
598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				CommandBufferTypes	commandBufferTypes_,
599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				ImageMemory			imageMemory_,
600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2&		targetSize_,
601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2&		renderPos_,
602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2&		renderSize_,
603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				deUint32			seed_)
604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: renderPass			(renderPass_)
605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderTypes			(renderTypes_)
606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, commandBufferTypes	(commandBufferTypes_)
607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, imageMemory			(imageMemory_)
608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, targetSize			(targetSize_)
609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderPos				(renderPos_)
610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderSize			(renderSize_)
611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, seed					(seed_)
612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderPass			renderPass;
616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderTypes			renderTypes;
617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	CommandBufferTypes	commandBufferTypes;
618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	ImageMemory			imageMemory;
619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				targetSize;
620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				renderPos;
621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				renderSize;
622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			seed;
623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
625c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::RenderTypes operator| (TestConfig::RenderTypes a, TestConfig::RenderTypes b)
626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::RenderTypes)(((deUint32)a) | ((deUint32)b));
628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
630c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::CommandBufferTypes operator| (TestConfig::CommandBufferTypes a, TestConfig::CommandBufferTypes b)
631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::CommandBufferTypes)(((deUint32)a) | ((deUint32)b));
633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
635c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::ImageMemory operator| (TestConfig::ImageMemory a, TestConfig::ImageMemory b)
636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::ImageMemory)(((deUint32)a) | ((deUint32)b));
638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logRenderPassInfo (TestLog&			log,
641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const RenderPass&	renderPass)
642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::ScopedLogSection section (log, "RenderPass", "RenderPass");
644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	attachmentsSection	(log, "Attachments", "Attachments");
647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Attachment>&	attachments			= renderPass.getAttachments();
648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection	attachmentSection	(log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx));
652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&			attachment			= attachments[attachmentNdx];
653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Format: " << attachment.getFormat() << TestLog::EndMessage;
655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Samples: " << attachment.getSamples() << TestLog::EndMessage;
656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "LoadOp: " << attachment.getLoadOp() << TestLog::EndMessage;
658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StoreOp: " << attachment.getStoreOp() << TestLog::EndMessage;
659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StencilLoadOp: " << attachment.getStencilLoadOp() << TestLog::EndMessage;
661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StencilStoreOp: " << attachment.getStencilStoreOp() << TestLog::EndMessage;
662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "InitialLayout: " << attachment.getInitialLayout() << TestLog::EndMessage;
664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "FinalLayout: " << attachment.getFinalLayout() << TestLog::EndMessage;
665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	subpassesSection	(log, "Subpasses", "Subpasses");
670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Subpass>&		subpasses			= renderPass.getSubpasses();
671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection			subpassSection		(log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx));
675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&						subpass				= subpasses[subpassNdx];
676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	inputAttachments	= subpass.getInputAttachments();
678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	resolveAttachments	= subpass.getResolveAttachments();
680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	preserveAttachments	= subpass.getPreserveAttachments();
681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!inputAttachments.empty())
683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		inputAttachmentsSection	(log, "Inputs", "Inputs");
685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t inputNdx = 0; inputNdx < inputAttachments.size(); inputNdx++)
687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		inputAttachmentSection	(log, "Input" + de::toString(inputNdx), "Input " + de::toString(inputNdx));
689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		inputAttachment			= inputAttachments[inputNdx];
690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << inputAttachment.getAttachment() << TestLog::EndMessage;
692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << inputAttachment.getImageLayout() << TestLog::EndMessage;
693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		depthStencilAttachmentSection	(log, "DepthStencil", "DepthStencil");
699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const AttachmentReference&		depthStencilAttachment			= subpass.getDepthStencilAttachment();
700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				log << TestLog::Message << "Attachment: " << depthStencilAttachment.getAttachment() << TestLog::EndMessage;
702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				log << TestLog::Message << "Layout: " << depthStencilAttachment.getImageLayout() << TestLog::EndMessage;
703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!colorAttachments.empty())
706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		colorAttachmentsSection	(log, "Colors", "Colors");
708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t colorNdx = 0; colorNdx < colorAttachments.size(); colorNdx++)
710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		colorAttachmentSection	(log, "Color" + de::toString(colorNdx), "Color " + de::toString(colorNdx));
712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		colorAttachment			= colorAttachments[colorNdx];
713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << colorAttachment.getAttachment() << TestLog::EndMessage;
715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << colorAttachment.getImageLayout() << TestLog::EndMessage;
716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!resolveAttachments.empty())
720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		resolveAttachmentsSection	(log, "Resolves", "Resolves");
722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t resolveNdx = 0; resolveNdx < resolveAttachments.size(); resolveNdx++)
724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		resolveAttachmentSection	(log, "Resolve" + de::toString(resolveNdx), "Resolve " + de::toString(resolveNdx));
726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		resolveAttachment			= resolveAttachments[resolveNdx];
727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << resolveAttachment.getAttachment() << TestLog::EndMessage;
729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << resolveAttachment.getImageLayout() << TestLog::EndMessage;
730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!preserveAttachments.empty())
734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		preserveAttachmentsSection	(log, "Preserves", "Preserves");
736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t preserveNdx = 0; preserveNdx < preserveAttachments.size(); preserveNdx++)
738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		preserveAttachmentSection	(log, "Preserve" + de::toString(preserveNdx), "Preserve " + de::toString(preserveNdx));
740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		preserveAttachment			= preserveAttachments[preserveNdx];
741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << preserveAttachment.getAttachment() << TestLog::EndMessage;
743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << preserveAttachment.getImageLayout() << TestLog::EndMessage;
744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!renderPass.getDependencies().empty())
751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	dependenciesSection	(log, "Dependencies", "Dependencies");
753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t depNdx = 0; depNdx < renderPass.getDependencies().size(); depNdx++)
755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection	dependencySection	(log, "Dependency" + de::toString(depNdx), "Dependency " + de::toString(depNdx));
757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const SubpassDependency&	dep					= renderPass.getDependencies()[depNdx];
758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Source: " << dep.getSrcPass() << TestLog::EndMessage;
760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Destination: " << dep.getDstPass() << TestLog::EndMessage;
761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Source Stage Mask: " << dep.getSrcStageMask() << TestLog::EndMessage;
763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Destination Stage Mask: " << dep.getDstStageMask() << TestLog::EndMessage;
764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Input Mask: " << dep.getInputMask() << TestLog::EndMessage;
766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Output Mask: " << dep.getOutputMask() << TestLog::EndMessage;
76768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			log << TestLog::Message << "Dependency Flags: " << getDependencyFlagsStr(dep.getFlags()) << TestLog::EndMessage;
768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearColorToString (VkFormat vkFormat, VkClearColorValue value)
773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	std::ostringstream				stream;
779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	stream << "(";
781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.int32[i];
792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.uint32[i];
805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.float32[i];
820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	stream << ")";
830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return stream.str();
832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearValueToString (VkFormat vkFormat, VkClearValue value)
835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat	format	= mapVkFormat(vkFormat);
837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order))
839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		std::ostringstream stream;
841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		stream << "(";
843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << "stencil: " << value.depthStencil.stencil;
846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order) && tcu::hasDepthComponent(format.order))
848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << ", ";
849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << "depth: " << value.depthStencil.depth;
852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		stream << ")";
854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return stream.str();
856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearColorToString(vkFormat, value.color);
859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
861c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearColorValue randomColorClearValue (const Attachment& attachment, de::Random& rng)
862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clearNan		= tcu::Float32::nan().asFloat();
864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(attachment.getFormat());
865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkClearColorValue				clearColor;
868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::IVec4 valueMin = tcu::getFormatMinIntValue(format);
874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::IVec4 valueMax = tcu::getFormatMaxIntValue(format);
875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.int32[ndx] = std::numeric_limits<deInt32>::min();
880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = rng.getInt(valueMin[ndx], valueMax[ndx]);
882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4 valueMax = tcu::getFormatMaxUintValue(format);
889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = std::numeric_limits<deUint32>::max();
894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = rng.getUint32() % valueMax[ndx];
896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormatInfo	formatInfo		= tcu::getTextureFormatInfo(format);
905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.float32[ndx] = clearNan;
910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.float32[ndx] = formatInfo.valueMin[ndx] + rng.getFloat() * (formatInfo.valueMax[ndx] - formatInfo.valueMin[ndx]);
912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return clearColor;
921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
923c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentDescription createAttachmentDescription (const Attachment& attachment)
924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentDescription attachmentDescription =
926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
92768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0,											// flags
928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
92968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getFormat(),						// format
93068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getSamples(),					// samples
931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
93268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getLoadOp(),						// loadOp
93368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getStoreOp(),					// storeOp
934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
93568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getStencilLoadOp(),				// stencilLoadOp
93668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getStencilStoreOp(),				// stencilStoreOp
937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
93868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getInitialLayout(),				// initialLayout
93968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getFinalLayout(),				// finalLayout
940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return attachmentDescription;
943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
945c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentReference createAttachmentReference (const AttachmentReference& referenceInfo)
946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentReference reference =
948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		referenceInfo.getAttachment(),	// attachment;
950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		referenceInfo.getImageLayout()	// layout;
951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return reference;
954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
956c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDescription createSubpassDescription (const Subpass&					subpass,
957689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos											   vector<VkAttachmentReference>*	attachmentReferenceLists,
958689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos											   vector<deUint32>*				preserveAttachmentReferences)
959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
96068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	inputAttachmentReferences			= attachmentReferenceLists[0];
96168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	colorAttachmentReferences			= attachmentReferenceLists[1];
96268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	resolveAttachmentReferences			= attachmentReferenceLists[2];
96368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	depthStencilAttachmentReferences	= attachmentReferenceLists[3];
964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		colorAttachmentReferences.push_back(createAttachmentReference(subpass.getColorAttachments()[attachmentNdx]));
967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		inputAttachmentReferences.push_back(createAttachmentReference(subpass.getInputAttachments()[attachmentNdx]));
970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getResolveAttachments().size(); attachmentNdx++)
972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		resolveAttachmentReferences.push_back(createAttachmentReference(subpass.getResolveAttachments()[attachmentNdx]));
973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
97468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	depthStencilAttachmentReferences.push_back(createAttachmentReference(subpass.getDepthStencilAttachment()));
97568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getPreserveAttachments().size(); attachmentNdx++)
977689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		preserveAttachmentReferences->push_back(subpass.getPreserveAttachments()[attachmentNdx].getAttachment());
978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size());
980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
98268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubpassDescription subpassDescription =
983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
984689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			subpass.getFlags(),																		// flags;
985689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			subpass.getPipelineBindPoint(),															// pipelineBindPoint;
986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
987689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)inputAttachmentReferences.size(),												// inputCount;
988689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0],			// inputAttachments;
989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
990689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)colorAttachmentReferences.size(),												// colorCount;
991689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			colorAttachmentReferences.empty() ? DE_NULL :  &colorAttachmentReferences[0],			// colorAttachments;
992689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0],		// resolveAttachments;
993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
994689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			&depthStencilAttachmentReferences[0],													// pDepthStencilAttachment;
995689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)preserveAttachmentReferences->size(),											// preserveCount;
996689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			preserveAttachmentReferences->empty() ? DE_NULL : &(*preserveAttachmentReferences)[0]	// preserveAttachments;
997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
99968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		return subpassDescription;
1000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1003c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDependency createSubpassDependency	(const SubpassDependency& dependencyInfo)
1004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkSubpassDependency dependency =
1006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getSrcPass(),			// srcSubpass;
1008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getDstPass(),			// destSubpass;
1009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getSrcStageMask(),		// srcStageMask;
1011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getDstStageMask(),		// destStageMask;
1012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getOutputMask(),			// outputMask;
1014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getInputMask(),			// inputMask;
1015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
101668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		dependencyInfo.getFlags()				// dependencyFlags;
1017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return dependency;
1020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1022c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkRenderPass> createRenderPass (const DeviceInterface&	vk,
1023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkDevice				device,
1024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 const RenderPass&		renderPassInfo)
1025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1026689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const size_t							perSubpassAttachmentReferenceLists = 4;
1027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkAttachmentDescription>			attachments;
1028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkSubpassDescription>			subpasses;
1029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkSubpassDependency>				dependencies;
1030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<vector<VkAttachmentReference> >	attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists);
1031689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	vector<vector<deUint32> >				preserveAttachments(renderPassInfo.getSubpasses().size());
1032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
1034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		attachments.push_back(createAttachmentDescription(renderPassInfo.getAttachments()[attachmentNdx]));
1035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
1037689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		subpasses.push_back(createSubpassDescription(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists]), &preserveAttachments[subpassNdx]));
1038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++)
1040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencies.push_back(createSubpassDependency(renderPassInfo.getDependencies()[depNdx]));
1041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
104368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkRenderPassCreateInfo	createInfo	=
104468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
104568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
104668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,
104768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkRenderPassCreateFlags)0u,
104868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)attachments.size(),
104968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(attachments.empty() ? DE_NULL : &attachments[0]),
105068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)subpasses.size(),
105168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(subpasses.empty() ? DE_NULL : &subpasses[0]),
105268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)dependencies.size(),
105368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(dependencies.empty() ? DE_NULL : &dependencies[0])
105468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
105568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
105668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		return createRenderPass(vk, device, &createInfo);
1057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1060c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFramebuffer> createFramebuffer (const DeviceInterface&		vk,
1061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   VkDevice						device,
1062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   VkRenderPass					renderPass,
1063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   const UVec2&					size,
1064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   const vector<VkImageView>&	attachments)
1065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
106668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createFramebuffer(vk, device, 0u, renderPass, (deUint32)attachments.size(), attachments.empty() ? DE_NULL : &attachments[0], size.x(), size.y(), 1u);
1067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1069c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImage> createAttachmentImage (const DeviceInterface&	vk,
1070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkDevice				device,
1071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 deUint32				queueIndex,
1072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 const UVec2&			size,
1073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkFormat				format,
107468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									 VkSampleCountFlagBits	samples,
1075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkImageUsageFlags		usageFlags,
1076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkImageLayout			layout)
1077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1078689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const VkExtent3D size_					= { size.x(), size.y(), 1u };
1079775c33feeee3a8a7cfe1a51447424d4160083fffscygan	VkImageUsageFlags targetUsageFlags		= 0;
1080775c33feeee3a8a7cfe1a51447424d4160083fffscygan	const tcu::TextureFormat textureFormat	= mapVkFormat(format);
108194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos
10829cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan	if (tcu::hasDepthComponent(textureFormat.order) || tcu::hasStencilComponent(textureFormat.order))
1083775c33feeee3a8a7cfe1a51447424d4160083fffscygan	{
10849cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan		targetUsageFlags |= vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1085775c33feeee3a8a7cfe1a51447424d4160083fffscygan	}
108694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	else
1087775c33feeee3a8a7cfe1a51447424d4160083fffscygan	{
10889cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan		targetUsageFlags |= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
1089775c33feeee3a8a7cfe1a51447424d4160083fffscygan	}
10909cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan
109168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createImage(vk, device,
109268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   (VkImageCreateFlags)0,
109368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_IMAGE_TYPE_2D,
109468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   format,
109568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   size_,
109668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1u /* mipLevels */,
109768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1u /* arraySize */,
109868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   samples,
109968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_IMAGE_TILING_OPTIMAL,
110068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   usageFlags | targetUsageFlags,
110168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SHARING_MODE_EXCLUSIVE,
110268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1,
110368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   &queueIndex,
110468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   layout);
1105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<Allocation> createImageMemory (const DeviceInterface&	vk,
1108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   VkDevice					device,
1109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   Allocator&				allocator,
1110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   VkImage					image,
1111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   bool						lazy)
1112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation> allocation (allocator.allocate(getImageMemoryRequirements(vk, device, image), lazy ? MemoryRequirement::LazilyAllocated : MemoryRequirement::Any));
1114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bindImageMemory(vk, device, image, allocation->getMemory(), allocation->getOffset());
1115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return allocation;
1116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1118c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageAttachmentView (const DeviceInterface&	vk,
1119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkDevice				device,
1120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImage				image,
1121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkFormat				format,
1122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageAspectFlags		aspect)
1123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageSubresourceRange range =
1125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		aspect,
1127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1,
1129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1
1131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
113368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createImageView(vk, device, 0u, image, VK_IMAGE_VIEW_TYPE_2D, format, makeComponentMappingRGBA(), range);
1134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1136c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearValue randomClearValue (const Attachment& attachment, de::Random& rng)
1137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float					clearNan	= tcu::Float32::nan().asFloat();
1139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat	format		= mapVkFormat(attachment.getFormat());
1140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order))
1142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkClearValue clearValue;
1144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.depthStencil.depth	= clearNan;
1146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.depthStencil.stencil	= 255;
1147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
1149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValue.depthStencil.stencil	= rng.getInt(0, 255);
1150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
1152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValue.depthStencil.depth	= rng.getFloat();
1153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearValue;
1155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
1157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkClearValue clearValue;
1159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.color = randomColorClearValue(attachment, rng);
1161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearValue;
1163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentResources
1167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	AttachmentResources (const DeviceInterface&		vk,
1170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 VkDevice					device,
1171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 Allocator&					allocator,
1172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 deUint32					queueIndex,
1173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&				size,
1174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const Attachment&			attachmentInfo,
11755b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser						 VkImageUsageFlags			usageFlags)
11765b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		: m_image			(createAttachmentImage(vk, device, queueIndex, size, attachmentInfo.getFormat(), attachmentInfo.getSamples(), usageFlags, VK_IMAGE_LAYOUT_UNDEFINED))
11775b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		, m_imageMemory		(createImageMemory(vk, device, allocator, *m_image, ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0)))
1178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_attachmentView	(createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), getImageAspectFlags(attachmentInfo.getFormat())))
1179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
11805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		if ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0)
1181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat());
1183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order))
1185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1186bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	depthFormat		= getDepthCopyFormat(attachmentInfo.getFormat());
1187bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	stencilFormat	= getStencilCopyFormat(attachmentInfo.getFormat());
1188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferSize			= size.x() * size.y() * depthFormat.getPixelSize();
1190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_secondaryBufferSize	= size.x() * size.y() * stencilFormat.getPixelSize();
1191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
119268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_buffer				= createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferMemory			= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible);
1194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset());
1196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
119768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_secondaryBuffer		= createBuffer(vk, device, 0, m_secondaryBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_secondaryBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_secondaryBuffer), MemoryRequirement::HostVisible);
1199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_secondaryBuffer, m_secondaryBufferMemory->getMemory(), m_secondaryBufferMemory->getOffset());
1201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
1203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferSize	= size.x() * size.y() * format.getPixelSize();
1205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
120668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_buffer		= createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible);
1208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset());
1210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	~AttachmentResources (void)
1215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageView getAttachmentView (void) const
1219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_attachmentView;
1221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImage getImage (void) const
1224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_image;
1226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkBuffer getBuffer (void) const
1229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_buffer != DE_NULL);
1231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_buffer;
1232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize getBufferSize (void) const
1235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_buffer != DE_NULL);
1237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_bufferSize;
1238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Allocation& getResultMemory (void) const
1241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(m_bufferMemory);
1243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_bufferMemory;
1244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkBuffer getSecondaryBuffer (void) const
1247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_secondaryBuffer != DE_NULL);
1249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_secondaryBuffer;
1250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize getSecondaryBufferSize (void) const
1253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_secondaryBuffer != DE_NULL);
1255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_secondaryBufferSize;
1256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Allocation& getSecondaryResultMemory (void) const
1259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(m_secondaryBufferMemory);
1261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_secondaryBufferMemory;
1262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Unique<VkImage>			m_image;
1266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UniquePtr<Allocation>		m_imageMemory;
1267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Unique<VkImageView>		m_attachmentView;
1268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>					m_buffer;
1270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize					m_bufferSize;
1271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>			m_bufferMemory;
1272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>					m_secondaryBuffer;
1274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize					m_secondaryBufferSize;
1275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>			m_secondaryBufferMemory;
1276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid uploadBufferData (const DeviceInterface&	vk,
1279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VkDevice					device,
1280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Allocation&		memory,
1281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   size_t					size,
1282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const void*				data)
1283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkMappedMemoryRange range =
1285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType;
1287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,								// pNext;
1288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		memory.getMemory(),						// mem;
1289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		memory.getOffset(),						// offset;
1290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(VkDeviceSize)size						// size;
1291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void* const ptr = memory.getHostPtr();
1293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deMemcpy(ptr, data, size);
1295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.flushMappedMemoryRanges(device, 1, &range));
1296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
129868e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkImageAspectFlagBits getPrimaryImageAspect (tcu::TextureFormat::ChannelOrder order)
1299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
1301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (order)
1303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::D:
1305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::DS:
130668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_DEPTH_BIT;
1307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::S:
130968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_STENCIL_BIT;
1310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
131268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_COLOR_BIT;
1313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderQuad
1317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderQuad (const Vec4& posA, const Vec4& posB)
1320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_vertices(6)
1321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[0] = posA;
1323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[1] = Vec4(posA[0], posB[1], posA[2], posA[3]);
1324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[2] = posB;
1325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[3] = posB;
1327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[4] = Vec4(posB[0], posA[1], posB[2], posA[3]);
1328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[5] = posA;
1329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4&		getCornerA			(void) const
1332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_vertices[0];
1334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4&		getCornerB			(void) const
1337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_vertices[2];
1339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const void*		getVertexPointer	(void) const
1342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return &m_vertices[0];
1344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	size_t			getVertexDataSize	(void) const
1347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return sizeof(Vec4) * m_vertices.size();
1349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Vec4>	m_vertices;
1353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass ColorClear
1356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	ColorClear	(const UVec2&				offset,
1359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				 const UVec2&				size,
1360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				 const VkClearColorValue&	color)
1361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_offset	(offset)
1362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_size	(size)
1363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_color	(color)
1364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&				getOffset		(void) const { return m_offset;		}
1368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&				getSize			(void) const { return m_size;		}
1369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkClearColorValue&	getColor		(void) const { return m_color;		}
1370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_offset;
1373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_size;
1374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkClearColorValue	m_color;
1375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass DepthStencilClear
1378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DepthStencilClear	(const UVec2&				offset,
1381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&				size,
1382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 float						depth,
1383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 deUint32					stencil)
1384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_offset	(offset)
1385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_size	(size)
1386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depth	(depth)
1387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencil	(stencil)
1388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&		getOffset		(void) const { return m_offset;		}
1392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&		getSize			(void) const { return m_size;		}
1393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	float				getDepth		(void) const { return m_depth;		}
1394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			getStencil		(void) const { return m_stencil;	}
1395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_offset;
1398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_size;
1399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	float				m_depth;
1401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			m_stencil;
1402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderInfo
1405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	SubpassRenderInfo	(const RenderPass&					renderPass,
1408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 deUint32							subpassIndex,
1409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 bool								isSecondary_,
1411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&						viewportOffset,
1413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&						viewportSize,
1414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const Maybe<RenderQuad>&			renderQuad,
1416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<ColorClear>&			colorClears,
1417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const Maybe<DepthStencilClear>&	depthStencilClear)
1418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_viewportOffset		(viewportOffset)
1419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_viewportSize		(viewportSize)
1420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_subpassIndex		(subpassIndex)
1421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_isSecondary			(isSecondary_)
1422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_flags				(renderPass.getSubpasses()[subpassIndex].getFlags())
1423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_renderQuad			(renderQuad)
1424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorClears			(colorClears)
1425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depthStencilClear	(depthStencilClear)
1426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorAttachments	(renderPass.getSubpasses()[subpassIndex].getColorAttachments())
1427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (deUint32 attachmentNdx = 0; attachmentNdx < (deUint32)m_colorAttachments.size(); attachmentNdx++)
1429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_colorAttachmentInfo.push_back(renderPass.getAttachments()[m_colorAttachments[attachmentNdx].getAttachment()]);
1430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
1432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_depthStencilAttachment		= tcu::just(renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment());
1434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_depthStencilAttachmentInfo	= tcu::just(renderPass.getAttachments()[renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment()]);
1435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&						getViewportOffset				(void) const { return m_viewportOffset;		}
1439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&						getViewportSize					(void) const { return m_viewportSize;		}
1440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							getSubpassIndex					(void) const { return m_subpassIndex;		}
1442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool								isSecondary						(void) const { return m_isSecondary;		}
1443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Maybe<RenderQuad>&			getRenderQuad					(void) const { return m_renderQuad;			}
1445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<ColorClear>&			getColorClears					(void) const { return m_colorClears;		}
1446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Maybe<DepthStencilClear>&		getDepthStencilClear			(void) const { return m_depthStencilClear;	}
1447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							getColorAttachmentCount			(void) const { return (deUint32)m_colorAttachments.size(); }
1449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout						getColorAttachmentLayout		(deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getImageLayout(); }
1450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							getColorAttachmentIndex			(deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getAttachment(); }
1451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Attachment&					getColorAttachment				(deUint32 attachmentNdx) const { return m_colorAttachmentInfo[attachmentNdx]; }
1452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<VkImageLayout>				getDepthStencilAttachmentLayout	(void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getImageLayout()) : tcu::nothing<VkImageLayout>(); }
1453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<deUint32>						getDepthStencilAttachmentIndex	(void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getAttachment()) : tcu::nothing<deUint32>(); };
1454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Maybe<Attachment>&			getDepthStencilAttachment		(void) const { return m_depthStencilAttachmentInfo; }
1455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			getSubpassFlags					(void) const { return m_flags; }
1456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2								m_viewportOffset;
1458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2								m_viewportSize;
1459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							m_subpassIndex;
1461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool								m_isSecondary;
1462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			m_flags;
1463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<RenderQuad>					m_renderQuad;
1465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<ColorClear>					m_colorClears;
1466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<DepthStencilClear>			m_depthStencilClear;
1467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_colorAttachments;
1469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Attachment>					m_colorAttachmentInfo;
1470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<AttachmentReference>			m_depthStencilAttachment;
1472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<Attachment>					m_depthStencilAttachmentInfo;
1473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1475c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkPipeline> createSubpassPipeline (const DeviceInterface&		vk,
1476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkDevice					device,
1477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkRenderPass				renderPass,
147868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos										VkShaderModule				vertexShaderModule,
147968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos										VkShaderModule				fragmentShaderModule,
1480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkPipelineLayout			pipelineLayout,
1481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										const SubpassRenderInfo&	renderInfo)
1482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkSpecializationInfo emptyShaderSpecializations =
1484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,			// mapEntryCount
1486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,	// pMap
1487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,			// dataSize
1488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,	// pData
1489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
149168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Maybe<VkSampleCountFlagBits>				rasterSamples;
1492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkPipelineColorBlendAttachmentState>	attachmentBlendStates;
1493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 attachmentNdx = 0; attachmentNdx < renderInfo.getColorAttachmentCount(); attachmentNdx++)
1495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment&			attachment		= renderInfo.getColorAttachment(attachmentNdx);
1497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples());
1499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		rasterSamples = attachment.getSamples();
1501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkPipelineColorBlendAttachmentState	attachmentBlendState =
1504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
150568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_FALSE,																								// blendEnable
150668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_SRC_ALPHA,																				// srcBlendColor
150768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,																	// destBlendColor
150868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_OP_ADD,																						// blendOpColor
150968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE,																					// srcBlendAlpha
151068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE,																					// destBlendAlpha
151168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_OP_ADD,																						// blendOpAlpha
151268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT,	// channelWriteMask
1513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentBlendStates.push_back(attachmentBlendState);
1516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (renderInfo.getDepthStencilAttachment())
1520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment& attachment = *renderInfo.getDepthStencilAttachment();
1522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples());
1524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		rasterSamples = attachment.getSamples();
1525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// If there are no attachment use single sample
1528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!rasterSamples)
152968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		rasterSamples = VK_SAMPLE_COUNT_1_BIT;
1530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineShaderStageCreateInfo shaderStages[2] =
1532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
1535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_NULL,												// pNext
153668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineShaderStageCreateFlags)0u,
153768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,								// stage
153868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vertexShaderModule,										// shader
153968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",
1540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&emptyShaderSpecializations
1541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},
1542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
1544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_NULL,												// pNext
154568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineShaderStageCreateFlags)0u,
154668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
154768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			fragmentShaderModule,									// shader
154868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",
1549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&emptyShaderSpecializations
1550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkVertexInputBindingDescription vertexBinding =
1553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// binding
1555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(deUint32)sizeof(tcu::Vec4),								// strideInBytes
155668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_VERTEX_INPUT_RATE_VERTEX,								// stepRate
1557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkVertexInputAttributeDescription vertexAttrib =
1559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// location
1561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// binding
1562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FORMAT_R32G32B32A32_SFLOAT,								// format
1563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// offsetInBytes
1564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineVertexInputStateCreateInfo vertexInputState =
1566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	//	sType
1568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,													//	pNext
156968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineVertexInputStateCreateFlags)0u,
1570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,															//	bindingCount
1571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexBinding,												//	pVertexBindingDescriptions
1572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,															//	attributeCount
1573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexAttrib,												//	pVertexAttributeDescriptions
1574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState =
1576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
1578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
157968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineInputAssemblyStateCreateFlags)0u,
1580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
1581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// primitiveRestartEnable
1582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkViewport viewport =
1584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(float)renderInfo.getViewportOffset().x(),	(float)renderInfo.getViewportOffset().y(),
1586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(float)renderInfo.getViewportSize().x(),	(float)renderInfo.getViewportSize().y(),
1587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f, 1.0f
1588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkRect2D scissor =
1590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ (deInt32)renderInfo.getViewportOffset().x(),	(deInt32)renderInfo.getViewportOffset().y() },
1592689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		{ renderInfo.getViewportSize().x(),				renderInfo.getViewportSize().y() }
1593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineViewportStateCreateInfo viewportState =
1595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
159868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineViewportStateCreateFlags)0u,
1599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,
1600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&viewport,
1601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,
1602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&scissor
1603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
160468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkPipelineRasterizationStateCreateInfo rasterState =
1605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
160668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// sType
1607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
160868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineRasterizationStateCreateFlags)0u,
1609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,														// depthClipEnable
1610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// rasterizerDiscardEnable
161168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_POLYGON_MODE_FILL,											// fillMode
1612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_CULL_MODE_NONE,												// cullMode
161368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// frontFace
1614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// depthBiasEnable
1615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// depthBias
1616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// depthBiasClamp
1617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// slopeScaledDepthBias
1618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1.0f															// lineWidth
1619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineMultisampleStateCreateInfo multisampleState =
1621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// sType
1623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
162468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineMultisampleStateCreateFlags)0u,
1625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		*rasterSamples,													// rasterSamples
1626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// sampleShadingEnable
1627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// minSampleShading
162868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,														// pSampleMask
162968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,														// alphaToCoverageEnable
163068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,														// alphaToOneEnable
1631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineDepthStencilStateCreateInfo depthStencilState =
1633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
1635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,													// pNext
163668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineDepthStencilStateCreateFlags)0u,
1637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// depthTestEnable
1638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// depthWriteEnable
1639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
1640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,													// depthBoundsEnable
1641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// stencilTestEnable
1642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilFailOp
1644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilPassOp
1645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilDepthFailOp
1646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_COMPARE_OP_ALWAYS,									// stencilCompareOp
1647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilCompareMask
1648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilWriteMask
1649a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz			STENCIL_VALUE											// stencilReference
1650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},															// front
1651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilFailOp
1653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilPassOp
1654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilDepthFailOp
1655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_COMPARE_OP_ALWAYS,									// stencilCompareOp
1656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilCompareMask
1657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilWriteMask
1658a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz			STENCIL_VALUE											// stencilReference
1659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},															// back
1660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		-1.0f,														// minDepthBounds;
1662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1.0f														// maxDepthBounds;
1663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineColorBlendStateCreateInfo blendState =
1665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,			// sType
1667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,															// pNext
166868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineColorBlendStateCreateFlags)0u,
1669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,															// logicOpEnable
1670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_LOGIC_OP_COPY,													// logicOp
1671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(deUint32)attachmentBlendStates.size(),								// attachmentCount
1672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		attachmentBlendStates.empty() ? DE_NULL : &attachmentBlendStates[0],// pAttachments
1673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ 0.0f, 0.0f, 0.0f, 0.0f }											// blendConst
1674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineDynamicStateCreateInfo dynamicState =
1676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
1678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
167968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineDynamicStateCreateFlags)0u,
1680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL
1682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkGraphicsPipelineCreateInfo createInfo =
1684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,		// sType
1686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,												// pNext
168768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineCreateFlags)0u,
1688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		2,														// stageCount
1690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		shaderStages,											// pStages
1691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexInputState,										// pVertexInputState
1693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&inputAssemblyState,									// pInputAssemblyState
1694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,												// pTessellationState
1695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&viewportState,											// pViewportState
1696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&rasterState,											// pRasterState
1697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&multisampleState,										// pMultisampleState
1698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&depthStencilState,										// pDepthStencilState
1699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&blendState,											// pColorBlendState
1700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&dynamicState,											// pDynamicState
1701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pipelineLayout,											// layout
1702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderPass,												// renderPass
1704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderInfo.getSubpassIndex(),							// subpass
1705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,												// basePipelineHandle
1706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u														// basePipelineIndex
1707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return createGraphicsPipeline(vk, device, DE_NULL, &createInfo);
1710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderer
1713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	SubpassRenderer (Context&					context,
1716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 const DeviceInterface&		vk,
1717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 VkDevice					device,
1718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 Allocator&					allocator,
1719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 VkRenderPass				renderPass,
1720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 VkFramebuffer				framebuffer,
172168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					 VkCommandPool				commandBufferPool,
1722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 deUint32					queueFamilyIndex,
1723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 const SubpassRenderInfo&	renderInfo)
1724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_renderInfo	(renderInfo)
1725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32 subpassIndex = renderInfo.getSubpassIndex();
1727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getRenderQuad())
1729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const RenderQuad&					renderQuad				= *renderInfo.getRenderQuad();
1731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkPipelineLayoutCreateInfo	pipelineLayoutParams	=
1732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,	// sType;
1734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,										// pNext;
173568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				(vk::VkPipelineLayoutCreateFlags)0,
1736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0u,												// descriptorSetCount;
1737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,										// pSetLayouts;
1738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0u,												// pushConstantRangeCount;
1739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,										// pPushConstantRanges;
1740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_vertexShaderModule	= createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-vert"), 0u);
1743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_fragmentShaderModule	= createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-frag"), 0u);
1744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_pipelineLayout		= createPipelineLayout(vk, device, &pipelineLayoutParams);
174568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_pipeline				= createSubpassPipeline(vk, device, renderPass, *m_vertexShaderModule, *m_fragmentShaderModule, *m_pipelineLayout, m_renderInfo);
1746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
174768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_vertexBuffer			= createBuffer(vk, device, 0u, (VkDeviceSize)renderQuad.getVertexDataSize(), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 1u, &queueFamilyIndex);
1748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_vertexBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_vertexBuffer), MemoryRequirement::HostVisible);
1749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bindBufferMemory(vk, device, *m_vertexBuffer, m_vertexBufferMemory->getMemory(), m_vertexBufferMemory->getOffset());
1751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			uploadBufferData(vk, device, *m_vertexBufferMemory, renderQuad.getVertexDataSize(), renderQuad.getVertexPointer());
1752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.isSecondary())
1755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
175668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_commandBuffer = allocateCommandBuffer(vk, device, commandBufferPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
175857b41652a8af472d28943d13924edc3a32ec3884scygan			beginCommandBuffer(vk, *m_commandBuffer, vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, renderPass, subpassIndex, framebuffer, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
1759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushRenderCommands(vk, *m_commandBuffer);
1760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *m_commandBuffer);
1761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool isSecondary (void) const
1765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_commandBuffer;
1767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
176968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkCommandBuffer getCommandBuffer (void) const
1770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(isSecondary());
1772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_commandBuffer;
1773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void pushRenderCommands (const DeviceInterface&		vk,
177668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkCommandBuffer			commandBuffer)
1777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!m_renderInfo.getColorClears().empty())
1779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<ColorClear>&	colorClears	(m_renderInfo.getColorClears());
1781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (deUint32 attachmentNdx = 0; attachmentNdx < m_renderInfo.getColorAttachmentCount(); attachmentNdx++)
1783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const ColorClear&		colorClear	= colorClears[attachmentNdx];
178568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkClearAttachment	attachment	=
1786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
178768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_ASPECT_COLOR_BIT,
178868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					attachmentNdx,
178968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					makeClearValue(colorClear.getColor()),
179068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				};
179168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkClearRect		rect		=
179268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{
179368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{
179468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						{ (deInt32)colorClear.getOffset().x(),	(deInt32)colorClear.getOffset().y()	},
1795689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						{ colorClear.getSize().x(),				colorClear.getSize().y()			}
179668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					},					// rect
179768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0u,					// baseArrayLayer
179868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					1u,					// layerCount
1799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
1800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
180168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect);
1802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (m_renderInfo.getDepthStencilClear())
1806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const DepthStencilClear&		depthStencilClear	= *m_renderInfo.getDepthStencilClear();
180868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const deUint32					attachmentNdx		= m_renderInfo.getColorAttachmentCount();
18094c7a3aad422a9a456debcbf83f0af165c2471f5cscygan			tcu::TextureFormat				format				= mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat());
181068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkClearAttachment			attachment			=
1811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
18124c7a3aad422a9a456debcbf83f0af165c2471f5cscygan				(VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0)
18134c7a3aad422a9a456debcbf83f0af165c2471f5cscygan					| (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)),
181468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				attachmentNdx,
181568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				makeClearValueDepthStencil(depthStencilClear.getDepth(), depthStencilClear.getStencil())
1816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
181768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkClearRect				rect				=
1818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
181968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{
182068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{ (deInt32)depthStencilClear.getOffset().x(),	(deInt32)depthStencilClear.getOffset().y()	},
1821689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos					{ depthStencilClear.getSize().x(),				depthStencilClear.getSize().y()				}
182268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				},							// rect
182368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,							// baseArrayLayer
182468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,							// layerCount
1825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
182768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect);
1828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (m_renderInfo.getRenderQuad())
1831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkDeviceSize	offset			= 0;
1833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBuffer		vertexBuffer	= *m_vertexBuffer;
1834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
1836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdBindVertexBuffers(commandBuffer, 0u, 1u, &vertexBuffer, &offset);
1837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u);
1838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const SubpassRenderInfo				m_renderInfo;
184368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Move<VkCommandBuffer>				m_commandBuffer;
1844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkPipeline>					m_pipeline;
1845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkPipelineLayout>				m_pipelineLayout;
1846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkShaderModule>				m_vertexShaderModule;
1848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkShaderModule>				m_fragmentShaderModule;
1850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>						m_vertexBuffer;
1852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>				m_vertexBufferMemory;
1853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushImageInitializationCommands (const DeviceInterface&								vk,
185668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									  VkCommandBuffer										commandBuffer,
1857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<Attachment>&								attachmentInfo,
1858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
1859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  deUint32												queueIndex,
1860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<Maybe<VkClearValue> >&					clearValues)
1861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	initializeLayouts;
1864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
1866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!clearValues[attachmentNdx])
1868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
1869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
1871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,								// sType;
1873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,															// pNext;
1874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
187568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),											// srcAccessMask
187668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),											// dstAccessMask
1877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_IMAGE_LAYOUT_UNDEFINED,											// oldLayout
187968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,								// newLayout;
1880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// srcQueueFamilyIndex;
1882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// destQueueFamilyIndex;
1883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getImage(),						// image;
1885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{																	// subresourceRange;
1886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),	// aspect;
1887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseMipLevel;
1888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1,																// mipLevels;
1889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseArraySlice;
1890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1																// arraySize;
1891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
1892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			initializeLayouts.push_back(barrier);
1895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!initializeLayouts.empty())
18985b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT,
18995b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser								  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
1900689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
1901689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkBufferMemoryBarrier*)DE_NULL,
1902689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)initializeLayouts.size(), &initializeLayouts[0]);
1903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
1906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!clearValues[attachmentNdx])
1908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			continue;
1909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat format = mapVkFormat(attachmentInfo[attachmentNdx].getFormat());
1911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (hasStencilComponent(format.order) || hasDepthComponent(format.order))
1913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float						clearNan		= tcu::Float32::nan().asFloat();
1915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float						clearDepth		= hasDepthComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.depth : clearNan;
1916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32					clearStencil	= hasStencilComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.stencil : ~0u;
1917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkClearDepthStencilValue	depthStencil	=
1918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearDepth,
1920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearStencil
1921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageSubresourceRange range =
1923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1924d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz				(VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0)
1925d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz									 | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)),
1926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
1927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1,
1928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
1929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1
1930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
193268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearDepthStencilImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencil, 1, &range);
1933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
1935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageSubresourceRange	range		=
1937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
193868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,				// aspectMask;
1939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,										// baseMipLevel;
1940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1,										// mipLevels;
194168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0,										// baseArrayLayer;
194268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1										// layerCount;
1943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkClearColorValue			clearColor	= clearValues[attachmentNdx]->color;
1945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
194668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearColorImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &range);
1947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	renderPassLayouts;
1952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
1954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
1956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,								// sType;
1958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,															// pNext;
1959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
196068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),											// srcAccessMask
196168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),											// dstAccessMask
1962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearValues[attachmentNdx] ?
196468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
1965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					: VK_IMAGE_LAYOUT_UNDEFINED,									// oldLayout
1966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentInfo[attachmentNdx].getInitialLayout(),					// newLayout;
1968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// srcQueueFamilyIndex;
1970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// destQueueFamilyIndex;
1971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getImage(),						// image;
1973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{																	// subresourceRange;
1974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),	// aspect;
1975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseMipLevel;
1976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1,																// mipLevels;
1977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseArraySlice;
1978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1																// arraySize;
1979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
1980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			renderPassLayouts.push_back(barrier);
1983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!renderPassLayouts.empty())
19865b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT,
19875b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser								  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
1988689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
1989689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkBufferMemoryBarrier*)DE_NULL,
1990689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)renderPassLayouts.size(), &renderPassLayouts[0]);
1991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushRenderPassCommands (const DeviceInterface&								vk,
199568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkCommandBuffer									commandBuffer,
1996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 VkRenderPass										renderPass,
1997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 VkFramebuffer										framebuffer,
1998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const vector<de::SharedPtr<SubpassRenderer> >&		subpassRenderers,
1999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const UVec2&										renderPos,
2000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const UVec2&										renderSize,
2001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const vector<Maybe<VkClearValue> >&				renderPassClearValues,
2002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 TestConfig::RenderTypes							render)
2003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float				clearNan				= tcu::Float32::nan().asFloat();
2005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkClearValue>	attachmentClearValues;
2006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassClearValues.size(); attachmentNdx++)
2008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPassClearValues[attachmentNdx])
2010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentClearValues.push_back(*renderPassClearValues[attachmentNdx]);
2011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentClearValues.push_back(makeClearValueColorF32(clearNan, clearNan, clearNan, clearNan));
2013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkRect2D renderArea =
2017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2018689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ (deInt32)renderPos.x(),	(deInt32)renderPos.y()	},
2019689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ renderSize.x(),			renderSize.y()			}
2020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
2021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpassRenderers.size(); subpassNdx++)
2023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
202468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkSubpassContents	contents = subpassRenderers[subpassNdx]->isSecondary() ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE;
2025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpassNdx == 0)
2027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				cmdBeginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, (deUint32)attachmentClearValues.size(), attachmentClearValues.empty() ? DE_NULL : &attachmentClearValues[0], contents);
2028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				vk.cmdNextSubpass(commandBuffer, contents);
2030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (render)
2032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
203368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				if (contents == VK_SUBPASS_CONTENTS_INLINE)
2034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpassRenderers[subpassNdx]->pushRenderCommands(vk, commandBuffer);
2036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
203768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				else if (contents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS)
2038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
203968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					const VkCommandBuffer cmd = subpassRenderers[subpassNdx]->getCommandBuffer();
2040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vk.cmdExecuteCommands(commandBuffer, 1, &cmd);
2041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
2043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_FATAL("Invalid contents");
2044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vk.cmdEndRenderPass(commandBuffer);
2048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushReadImagesToBuffers (const DeviceInterface&								vk,
205268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							  VkCommandBuffer										commandBuffer,
2053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  deUint32												queueIndex,
2054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
2056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<Attachment>&								attachmentInfo,
2057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<bool>&									isLazy,
2058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const UVec2&											targetSize)
2060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	imageBarriers;
2063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isLazy[attachmentNdx])
2067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
2070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// sType
2072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,											// pNext
2073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
207468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),							// srcAccessMask
207568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),							// dstAccessMask
2076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentInfo[attachmentNdx].getFinalLayout(),		// oldLayout
207868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,				// newLayout
2079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,											// srcQueueFamilyIndex
2081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,											// destQueueFamilyIndex
2082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getImage(),		// image
2084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{													// subresourceRange
2085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),	// aspect;
2086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,										// baseMipLevel
2087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1,										// mipLevels
2088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,										// baseArraySlice
2089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1										// arraySize
2090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			imageBarriers.push_back(barrier);
2094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!imageBarriers.empty())
2097689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			vk.cmdPipelineBarrier(commandBuffer,
2098689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2099689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2100689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (VkDependencyFlags)0,
2101689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
2102689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkBufferMemoryBarrier*)DE_NULL,
2103689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)imageBarriers.size(), &imageBarriers[0]);
2104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (isLazy[attachmentNdx])
2109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			continue;
2110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat::ChannelOrder	order	= mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order;
2112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkBufferImageCopy					rect	=
2113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferOffset
2115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferRowLength
2116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferImageHeight
2117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{							// imageSubresource
2118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				getPrimaryImageAspect(mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order),	// aspect
211994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos				0,						// mipLevel
2120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,						// arraySlice
2121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1						// arraySize
2122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			},
212394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			{ 0, 0, 0 },				// imageOffset
2124689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ targetSize.x(), targetSize.y(), 1u }		// imageExtent
2125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
2126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
212768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getBuffer(), 1, &rect);
2128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::TextureFormat::DS == order)
2130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBufferImageCopy stencilRect =
2132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0, // bufferOffset
2134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0, // bufferRowLength
2135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0, // bufferImageHeight
213668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{									// imageSubresource
213768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_ASPECT_STENCIL_BIT,	// aspect
213868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0,								// mipLevel
213968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0,								// arraySlice
2140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1						// arraySize
2141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				},
214294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos				{ 0, 0, 0 },				// imageOffset
2143689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ targetSize.x(), targetSize.y(), 1u }		// imageExtent
2144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
214668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getSecondaryBuffer(), 1, &stencilRect);
2147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkBufferMemoryBarrier>	bufferBarriers;
2152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isLazy[attachmentNdx])
2156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat::ChannelOrder	order			= mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order;
2159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBufferMemoryBarrier				bufferBarrier	=
2160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,
2163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
216468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),
216568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),
2166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,
2168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,
2169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getBuffer(),
2171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
2172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getBufferSize()
2173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bufferBarriers.push_back(bufferBarrier);
2176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::TextureFormat::DS == order)
2178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkBufferMemoryBarrier secondaryBufferBarrier =
2180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_NULL,
2183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
218468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					getAllMemoryWriteFlags(),
218568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					getAllMemoryReadFlags(),
2186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					queueIndex,
2188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					queueIndex,
2189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getSecondaryBuffer(),
2191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,
2192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getSecondaryBufferSize()
2193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
2194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bufferBarriers.push_back(secondaryBufferBarrier);
2196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bufferBarriers.push_back(bufferBarrier);
2199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!bufferBarriers.empty())
2202689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			vk.cmdPipelineBarrier(commandBuffer,
2203689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2204689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2205689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (VkDependencyFlags)0,
2206689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
2207689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)bufferBarriers.size(), &bufferBarriers[0],
2208689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkImageMemoryBarrier*)DE_NULL);
2209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid clear (const PixelBufferAccess& access, const VkClearValue& value)
2213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat&	format	= access.getFormat();
2215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasDepthComponent(format.order) || tcu::hasStencilComponent(format.order))
2217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
2219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clearDepth(access, value.depthStencil.depth);
2220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
2222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clearStencil(access, value.depthStencil.stencil);
2223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
2225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT
2227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				|| tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT
2228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				|| tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT)
2229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::Vec4		color	(value.color.float32[0],
2231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.float32[1],
2232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.float32[2],
2233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.float32[3]);
2234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::isSRGB(format))
2236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::clear(access, tcu::linearToSRGB(color));
2237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::clear(access, color);
2239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
2241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::UVec4	color	(value.color.uint32[0],
2243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.uint32[1],
2244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.uint32[2],
2245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.uint32[3]);
2246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clear(access, color);
2248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
2250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::IVec4	color	(value.color.int32[0],
2252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.int32[1],
2253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.int32[2],
2254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.int32[3]);
2255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clear(access, color);
2257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
2260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2263c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVec4 computeUvs (const IVec2& posA, const IVec2& posB, const IVec2& pos)
2264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float u = de::clamp((float)(pos.x() - posA.x()) / (float)(posB.x() - posA.x()), 0.0f, 1.0f);
2266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float v = de::clamp((float)(pos.y() - posA.y()) / (float)(posB.y() - posA.y()), 0.0f, 1.0f);
2267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return Vec4(u, v, u * v, (u + v) / 2.0f);
2269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid renderReferenceImages (vector<tcu::TextureLevel>&			referenceAttachments,
2272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const RenderPass&					renderPassInfo,
2273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						targetSize,
2274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<Maybe<VkClearValue> >&	imageClearValues,
2275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<Maybe<VkClearValue> >&	renderPassClearValues,
2276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<SubpassRenderInfo>&	subpassRenderInfo,
2277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						renderPos,
2278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						renderSize)
2279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&	subpasses		= renderPassInfo.getSubpasses();
2281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>			attachmentUsed	(renderPassInfo.getAttachments().size(), false);
2282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	referenceAttachments.resize(renderPassInfo.getAttachments().size());
2284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
2286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment				attachment					= renderPassInfo.getAttachments()[attachmentNdx];
2288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat		format						= mapVkFormat(attachment.getFormat());
2289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormatInfo	textureInfo					= tcu::getTextureFormatInfo(format);
2290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		tcu::TextureLevel&				reference					= referenceAttachments[attachmentNdx];
2291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool						isDepthOrStencilAttachment	= hasDepthComponent(format.order) || hasStencilComponent(format.order);
2292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		reference = tcu::TextureLevel(format, targetSize.x(), targetSize.y());
2294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (imageClearValues[attachmentNdx])
2296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clear(reference.getAccess(), *imageClearValues[attachmentNdx]);
2297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Fill with grid if image contentst are undefined before renderpass
2300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isDepthOrStencilAttachment)
2301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasDepthComponent(format.order))
2303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), 2, textureInfo.valueMin, textureInfo.valueMax);
2304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasStencilComponent(format.order))
2306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), 2, textureInfo.valueMin, textureInfo.valueMax);
2307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::fillWithGrid(reference.getAccess(), 2, textureInfo.valueMin, textureInfo.valueMax);
2310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
2314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&						subpass				= subpasses[subpassNdx];
2316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const SubpassRenderInfo&			renderInfo			= subpassRenderInfo[subpassNdx];
2317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
2318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Apply load op if attachment was used for the first time
2320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < colorAttachments.size(); attachmentNdx++)
2321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32 attachmentIndex = colorAttachments[attachmentNdx].getAttachment();
2323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!attachmentUsed[attachmentIndex])
2325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&	attachment	= renderPassInfo.getAttachments()[attachmentIndex];
2327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&	reference	= referenceAttachments[attachmentIndex];
2328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(!tcu::hasDepthComponent(reference.getFormat().order));
2330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(!tcu::hasStencilComponent(reference.getFormat().order));
2331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
2333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clear(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]);
2334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
2335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat());
2337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax);
2339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentUsed[attachmentIndex] = true;
2342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
234594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		// Apply load op to depth/stencil attachment if it was used for the first time
2346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED && !attachmentUsed[subpass.getDepthStencilAttachment().getAttachment()])
2347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment();
2349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Apply load op if attachment was used for the first time
2351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!attachmentUsed[attachmentIndex])
2352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&	attachment	= renderPassInfo.getAttachments()[attachmentIndex];
2354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&	reference		= referenceAttachments[attachmentIndex];
2355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasDepthComponent(reference.getFormat().order))
2357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
2359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]);
2360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
2361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat());
2363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						tcu::fillWithGrid(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax);
2365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasStencilComponent(reference.getFormat().order))
2369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
2371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]);
2372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
2373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat());
2375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						tcu::fillWithGrid(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax);
2377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentUsed[attachmentIndex] = true;
2382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t colorClearNdx = 0; colorClearNdx < renderInfo.getColorClears().size(); colorClearNdx++)
2385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const ColorClear&	colorClear	= renderInfo.getColorClears()[colorClearNdx];
2387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2			offset		= colorClear.getOffset();
2388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2			size		= colorClear.getSize();
2389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::TextureLevel&	reference	= referenceAttachments[subpass.getColorAttachments()[colorClearNdx].getAttachment()];
2390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VkClearValue		value;
2391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			value.color = colorClear.getColor();
2393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clear(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), value);
2395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getDepthStencilClear())
2398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const DepthStencilClear&	dsClear		= *renderInfo.getDepthStencilClear();
2400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2					offset		= dsClear.getOffset();
2401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2					size		= dsClear.getSize();
2402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::TextureLevel&			reference	= referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()];
2403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(reference.getFormat().order))
2405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearDepth(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getDepth());
2406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasStencilComponent(reference.getFormat().order))
2408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearStencil(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getStencil());
2409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getRenderQuad())
2412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const RenderQuad&	renderQuad	= *renderInfo.getRenderQuad();
2414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4			posA		= renderQuad.getCornerA();
2415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4			posB		= renderQuad.getCornerB();
2416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec2			origin		= Vec2((float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y()) + Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
2417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec2			p			= Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
2418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec2			posAI		((deInt32)(origin.x() + (p.x() * posA.x())),
2419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 (deInt32)(origin.y() + (p.y() * posA.y())));
2420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec2			posBI		((deInt32)(origin.x() + (p.x() * posB.x())),
2421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 (deInt32)(origin.y() + (p.y() * posB.y())));
2422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++)
2424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment				attachment			= renderPassInfo.getAttachments()[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()];
2426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::TextureFormatInfo	textureInfo			= tcu::getTextureFormatInfo(mapVkFormat(attachment.getFormat()));
2427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&				referenceTexture	= referenceAttachments[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()];
2428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const bool						srgb				= tcu::isSRGB(referenceTexture.getFormat());
2429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const PixelBufferAccess	reference			= referenceTexture.getAccess();
2430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMin			= (float)(-MAX_INTEGER_VALUE);
2431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMax			= (float)(MAX_INTEGER_VALUE);
2432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMax			(de::clamp(textureInfo.valueMax[0], clampMin, clampMax),
2433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMax[1], clampMin, clampMax),
2434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMax[2], clampMin, clampMax),
2435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMax[3], clampMin, clampMax));
2436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMin			(de::clamp(textureInfo.valueMin[0], clampMin, clampMax),
2438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMin[1], clampMin, clampMax),
2439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMin[2], clampMin, clampMax),
2440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMin[3], clampMin, clampMax));
2441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.x() < posBI.x());
2443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.y() < posBI.y());
2444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int y = posAI.y(); y <= (int)posBI.y(); y++)
2446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int x = posAI.x(); x <= (int)posBI.x(); x++)
2447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	uvs		= computeUvs(posAI, posBI, IVec2(x, y));
2449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	color	= valueMax * uvs + valueMin * (Vec4(1.0f) - uvs);
2450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (srgb)
2452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixel(tcu::linearToSRGB(color), x, y);
2453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixel(color, x, y);
2455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
2459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&				referenceTexture	= referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()];
2461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const PixelBufferAccess	reference			= referenceTexture.getAccess();
2462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.x() < posBI.x());
2464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.y() < posBI.y());
2465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int y = posAI.y(); y <= (int)posBI.y(); y++)
2467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int x = posAI.x(); x <= (int)posBI.x(); x++)
2468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4 uvs = computeUvs(posAI, posBI, IVec2(x, y));
2470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::hasDepthComponent(reference.getFormat().order))
2472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixDepth(uvs.x(), x, y);
2473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::hasStencilComponent(reference.getFormat().order))
2475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixStencil(STENCIL_VALUE, x, y);
2476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Mark all attachments that were used but not stored as undefined
2482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
2483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment				attachment	= renderPassInfo.getAttachments()[attachmentNdx];
2485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat		format		= mapVkFormat(attachment.getFormat());
2486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormatInfo	textureInfo	= tcu::getTextureFormatInfo(format);
2487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		tcu::TextureLevel&				reference	= referenceAttachments[attachmentNdx];
2488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentUsed[attachmentNdx] && renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
2490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax);
2491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2494c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMaybe<deUint32> findColorAttachment (const Subpass&				subpass,
2495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 deUint32					attachmentIndex)
2496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpass.getColorAttachments().size(); colorAttachmentNdx++)
2498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (subpass.getColorAttachments()[colorAttachmentNdx].getAttachment() == attachmentIndex)
2500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::just((deUint32)colorAttachmentNdx);
2501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return tcu::nothing<deUint32>();
2504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviint calcFloatDiff (float a, float b)
2507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		au		= tcu::Float32(a).bits();
2509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		bu		= tcu::Float32(b).bits();
2510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool			asign	= (au & (0x1u << 31u)) != 0u;
2512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool			bsign	= (bu & (0x1u << 31u)) != 0u;
2513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		avalue	= (au & ((0x1u << 31u) - 1u));
2515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		bvalue	= (bu & ((0x1u << 31u) - 1u));
2516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (asign != bsign)
2518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return avalue + bvalue + 1u;
2519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else if (avalue < bvalue)
2520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return bvalue - avalue;
2521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
2522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return avalue - bvalue;
2523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToDepthClearValue (const ConstPixelBufferAccess&	access,
2526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								x,
2527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								y,
2528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									float							ref)
2529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= tcu::getEffectiveDepthStencilTextureFormat(access.getFormat(), tcu::Sampler::MODE_DEPTH);
2531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
2532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
2534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const int	bitDepth	= tcu::getTextureFormatBitDepth(format).x();
2539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	depth		= access.getPixDepth(x, y);
2540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	threshold	= 2.0f / (float)((1 << bitDepth) - 1);
2541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return deFloatAbs(depth - ref) <= threshold;
2543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	depth			= access.getPixDepth(x, y);
2548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const int	mantissaBits	= tcu::getTextureFormatMantissaBitDepth(format).x();
2549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const int	threshold		= 10 * 1 << (23 - mantissaBits);
2550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_ASSERT(mantissaBits <= 23);
2552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return calcFloatDiff(depth, ref) <= threshold;
2554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
2557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Invalid channel class");
2558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return false;
2559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToStencilClearValue (const ConstPixelBufferAccess&	access,
2563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  int							x,
2564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  int							y,
2565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  deUint32						ref)
2566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32 stencil = access.getPixStencil(x, y);
2568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return stencil == ref;
2570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToColorClearValue (const ConstPixelBufferAccess&	access,
2573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								x,
2574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								y,
2575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									const VkClearColorValue&		ref)
2576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= access.getFormat();
2578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
2579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const BVec4						channelMask		= tcu::getTextureFormatChannelMask(format);
2580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
2582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	bitDepth	(tcu::getTextureFormatBitDepth(format));
2587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	resColor	(access.getPixel(x, y));
2588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	refColor	(ref.float32[0],
2589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.float32[1],
2590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.float32[2],
2591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.float32[3]);
2592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	threshold	(bitDepth[0] > 0 ? 20.0f / (float)((1 << bitDepth[0]) - 1) : 1.0f,
2593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 bitDepth[1] > 0 ? 20.0f / (float)((1 << bitDepth[1]) - 1) : 1.0f,
2594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 bitDepth[2] > 0 ? 20.0f / (float)((1 << bitDepth[2]) - 1) : 1.0f,
2595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 bitDepth[3] > 0 ? 20.0f / (float)((1 << bitDepth[3]) - 1) : 1.0f);
2596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::isSRGB(access.getFormat()))
2598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, tcu::linearToSRGB(refColor)), threshold), channelMask), channelMask));
2599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask));
2601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
2604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4	resColor	(access.getPixelUint(x, y));
2606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4	refColor	(ref.uint32[0],
2607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.uint32[1],
2608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.uint32[2],
2609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.uint32[3]);
2610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4	threshold	(1);
2611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask));
2613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
2616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	resColor	(access.getPixelInt(x, y));
2618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	refColor	(ref.int32[0],
2619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.int32[1],
2620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.int32[2],
2621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.int32[3]);
2622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	threshold	(1);
2623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask));
2625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	resColor		(access.getPixel(x, y));
2630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	refColor		(ref.float32[0],
2631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 ref.float32[1],
2632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 ref.float32[2],
2633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 ref.float32[3]);
2634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	mantissaBits	(tcu::getTextureFormatMantissaBitDepth(format));
2635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	threshold		(10 * IVec4(1) << (23 - mantissaBits));
2636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_ASSERT(tcu::allEqual(greaterThanEqual(threshold, IVec4(0)), BVec4(true)));
2638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
2640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (calcFloatDiff(resColor[ndx], refColor[ndx]) > threshold[ndx] && channelMask[ndx])
2642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					return false;
2643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return true;
2646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
2649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Invalid channel class");
2650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return false;
2651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass PixelStatus
2655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
2657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum Status
2658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_UNDEFINED	= 0,
2660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_OK			= 1,
2661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_FAIL			= 2,
2662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_LAST
2664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
2665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			PixelStatus			(Status color, Status depth, Status stencil)
2667a31a3468328457a54ad3bf068896986b5789c4cfPyry Haulos				: m_status	((deUint8)((color << COLOR_OFFSET)
2668277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser					| (depth << DEPTH_OFFSET)
2669277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser					| (stencil << STENCIL_OFFSET)))
2670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Status	getColorStatus		(void) const { return (Status)((m_status & COLOR_MASK) >> COLOR_OFFSET); }
2674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Status	getDepthStatus		(void) const { return (Status)((m_status & DEPTH_MASK) >> DEPTH_OFFSET); }
2675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Status	getStencilStatus	(void) const { return (Status)((m_status & STENCIL_MASK) >> STENCIL_OFFSET); }
2676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void	setColorStatus		(Status status)
2678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(getColorStatus() == STATUS_UNDEFINED);
26805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		m_status |= (deUint8)(status << COLOR_OFFSET);
2681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void	setDepthStatus		(Status status)
2684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(getDepthStatus() == STATUS_UNDEFINED);
2686682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos		m_status |= (deUint8)(status << DEPTH_OFFSET);
2687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void	setStencilStatus	(Status status)
2690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(getStencilStatus() == STATUS_UNDEFINED);
2692682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos		m_status |= (deUint8)(status << STENCIL_OFFSET);
2693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
2696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum
2697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COLOR_OFFSET	= 0,
2699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DEPTH_OFFSET	= 2,
2700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STENCIL_OFFSET	= 4,
2701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COLOR_MASK		= (3<<COLOR_OFFSET),
2703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DEPTH_MASK		= (3<<DEPTH_OFFSET),
2704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STENCIL_MASK	= (3<<STENCIL_OFFSET),
2705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
2706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint8	m_status;
2707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
2708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthRenderQuad (const ConstPixelBufferAccess&	result,
2710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posA,
2711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posB,
2712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   vector<PixelStatus>&				status)
2713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = posA.y(); y <= posB.y(); y++)
2715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = posA.x(); x <= posB.x(); x++)
2716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED)
2720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	minUvs		= computeUvs(posA, posB, IVec2(x-1, y-1));
2722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	maxUvs		= computeUvs(posA, posB, IVec2(x+1, y+1));
2723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool	softCheck	= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	resDepth	= result.getPixDepth(x, y);
2726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (resDepth >= minUvs.x() && resDepth <= maxUvs.x())
2728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
2729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (!softCheck)
2730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL);
2731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilRenderQuad (const ConstPixelBufferAccess&		result,
2736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const IVec2&						posA,
2737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const IVec2&						posB,
2738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 vector<PixelStatus>&				status)
2739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = posA.y(); y <= posB.y(); y++)
2741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = posA.x(); x <= posB.x(); x++)
2742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED)
2746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool	softCheck	= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (result.getPixStencil(x, y) == STENCIL_VALUE)
2751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
2752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (!softCheck)
2753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL);
2754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorRenderQuad (const ConstPixelBufferAccess&	result,
2759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posA,
2760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posB,
2761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   vector<PixelStatus>&				status)
2762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat&		format				= result.getFormat();
2764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						srgb				= tcu::isSRGB(format);
2765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass		= tcu::getTextureChannelClass(format.type);
2766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormatInfo	textureInfo			= tcu::getTextureFormatInfo(format);
2767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clampMin			= (float)(-MAX_INTEGER_VALUE);
2768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clampMax			= (float)(MAX_INTEGER_VALUE);
2769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4						valueMax			(de::clamp(textureInfo.valueMax[0], clampMin, clampMax),
2770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMax[1], clampMin, clampMax),
2771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMax[2], clampMin, clampMax),
2772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMax[3], clampMin, clampMax));
2773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4						valueMin			(de::clamp(textureInfo.valueMin[0], clampMin, clampMax),
2775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMin[1], clampMin, clampMax),
2776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMin[2], clampMin, clampMax),
2777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMin[3], clampMin, clampMax));
2778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const BVec4						channelMask			= tcu::getTextureFormatChannelMask(format);
2779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2780d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz	IVec4						formatBitDepths = tcu::getTextureFormatBitDepth(format);
2781d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz	Vec4						threshold = Vec4(1.0f) / Vec4((float)(1 << formatBitDepths.x()),
2782d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz																(float)(1 << formatBitDepths.y()),
2783d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz																(float)(1 << formatBitDepths.z()),
2784d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz																(float)(1 << formatBitDepths.w()));
2785d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz
2786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
2787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int y = posA.y(); y <= posB.y(); y++)
2793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int x = posA.x(); x <= posB.x(); x++)
2794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
279986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					const Vec4	minDiff		= Vec4(1.0f) / (IVec4(1) << tcu::getTextureFormatMantissaBitDepth(format)).cast<float>();
2800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minUvs		= computeUvs(posA, posB, IVec2(x-1, y-1));
2801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxUvs		= computeUvs(posA, posB, IVec2(x+1, y+1));
2802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool	softCheck	= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	resColor	(result.getPixel(x, y));
2806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
280786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					Vec4	minRefColor	= srgb ? tcu::linearToSRGB(valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs))
280886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi											 : valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs) - threshold;
280986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					Vec4	maxRefColor	= srgb ? tcu::linearToSRGB(valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs))
281086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi											 : valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs) + threshold;
281186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
281286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					// Take into account rounding and quantization
281386abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					if (channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT)
281486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					{
281586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi						minRefColor = tcu::min(minRefColor * (Vec4(1.0f) - minDiff), minRefColor * (Vec4(1.0f) + minDiff));
281686abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi						maxRefColor = tcu::max(maxRefColor * (Vec4(1.0f) - minDiff), maxRefColor * (Vec4(1.0f) + minDiff));
281786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					}
281886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					else
281986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					{
282086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi						minRefColor = minRefColor - minDiff;
282186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi						maxRefColor = maxRefColor + minDiff;
282286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi					}
2823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[0] <= maxRefColor[0]);
2825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[1] <= maxRefColor[1]);
2826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[2] <= maxRefColor[2]);
2827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[3] <= maxRefColor[3]);
2828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::anyNotEqual(tcu::logicalAnd(
2830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											tcu::logicalAnd(greaterThanEqual(resColor, minRefColor),
2831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															lessThanEqual(resColor, maxRefColor)),
2832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											channelMask), channelMask))
2833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						if (!softCheck)
2835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
2843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
2846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int y = posA.y(); y <= posB.y(); y++)
2848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int x = posA.x(); x <= posB.x(); x++)
2849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minUvs			= computeUvs(posA, posB, IVec2(x-1, y-1));
2855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxUvs			= computeUvs(posA, posB, IVec2(x+1, y+1));
2856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool	softCheck		= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const UVec4	resColor		(result.getPixelUint(x, y));
2860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minRefColorF	= valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs);
2862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxRefColorF	= valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs);
2863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const UVec4	minRefColor		(minRefColorF.asUint());
2865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const UVec4	maxRefColor		(maxRefColorF.asUint());
2866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[0] <= maxRefColor[0]);
2868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[1] <= maxRefColor[1]);
2869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[2] <= maxRefColor[2]);
2870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[3] <= maxRefColor[3]);
2871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::anyNotEqual(tcu::logicalAnd(
2873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											tcu::logicalAnd(greaterThanEqual(resColor, minRefColor),
2874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															lessThanEqual(resColor, maxRefColor)),
2875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											channelMask), channelMask))
2876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						if (!softCheck)
2878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
2886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
2889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int y = posA.y(); y <= posB.y(); y++)
2891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int x = posA.x(); x <= posB.x(); x++)
2892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minUvs			= computeUvs(posA, posB, IVec2(x-1, y-1));
2898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxUvs			= computeUvs(posA, posB, IVec2(x+1, y+1));
2899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool	softCheck		= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const IVec4	resColor		(result.getPixelInt(x, y));
2903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minRefColorF	= valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs);
2905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxRefColorF	= valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs);
2906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const IVec4	minRefColor		(minRefColorF.asInt());
2908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const IVec4	maxRefColor		(maxRefColorF.asInt());
2909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[0] <= maxRefColor[0]);
2911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[1] <= maxRefColor[1]);
2912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[2] <= maxRefColor[2]);
2913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[3] <= maxRefColor[3]);
2914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::anyNotEqual(tcu::logicalAnd(
2916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											tcu::logicalAnd(greaterThanEqual(resColor, minRefColor),
2917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															lessThanEqual(resColor, maxRefColor)),
2918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											channelMask), channelMask))
2919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						if (!softCheck)
2921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
2929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
2932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Invalid channel class");
2933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorClear (const ConstPixelBufferAccess&	result,
2937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					offset,
2938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					size,
2939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  vector<PixelStatus>&			status,
2940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const VkClearColorValue&		color)
2941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(offset.x() + size.x() <= (deUint32)result.getWidth());
2943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(offset.y() + size.y() <= (deUint32)result.getHeight());
2944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(result.getWidth() * result.getHeight() == (int)status.size());
2946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++)
2948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++)
2949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(x + y * result.getWidth() < (int)status.size());
2953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (comparePixelToColorClearValue(result, x, y, color))
2957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthClear (const ConstPixelBufferAccess&	result,
2965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					offset,
2966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					size,
2967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  vector<PixelStatus>&			status,
2968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  float							depth)
2969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++)
2971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++)
2972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus&	pixelStatus	= status[x + y * result.getWidth()];
2974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED)
2976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (comparePixelToDepthClearValue(result, x, y, depth))
2978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
2979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL);
2981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilClear (const ConstPixelBufferAccess&	result,
2986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const UVec2&					offset,
2987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const UVec2&					size,
2988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						vector<PixelStatus>&			status,
2989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						deUint32						stencil)
2990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++)
2992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++)
2993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus&	pixelStatus	= status[x + y * result.getWidth()];
2995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED)
2997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (comparePixelToStencilClearValue(result, x, y, stencil))
2999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
3000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL);
3002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool verifyAttachment (const ConstPixelBufferAccess&		result,
3007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Maybe<ConstPixelBufferAccess>&	secondaryResult,
3008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const RenderPass&					renderPassInfo,
3009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Maybe<VkClearValue>&			renderPassClearValue,
3010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Maybe<VkClearValue>&			imageClearValue,
3011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const vector<Subpass>&				subpasses,
3012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const vector<SubpassRenderInfo>&		subpassRenderInfo,
3013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const PixelBufferAccess&				errorImage,
3014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   deUint32								attachmentIndex,
3015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const UVec2&							renderPos,
3016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const UVec2&							renderSize)
3017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat&		format				= result.getFormat();
3019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						hasDepth			= tcu::hasDepthComponent(format.order);
3020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						hasStencil			= tcu::hasStencilComponent(format.order);
3021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						isColorFormat		= !hasDepth && !hasStencil;
3022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const PixelStatus				initialStatus		(isColorFormat ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK,
3023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 hasDepth ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK,
3024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 hasStencil ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK);
3025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool							attachmentIsUsed	= false;
3027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<PixelStatus>				status				(result.getWidth() * result.getHeight(), initialStatus);
3028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	tcu::clear(errorImage, Vec4(0.0f, 1.0f, 0.0f, 1.0f));
3029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Check if attachment is used
3031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int subpassNdx = 0; subpassNdx < (int)subpasses.size(); subpassNdx++)
3032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&			subpass			= subpasses[subpassNdx];
3034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Maybe<deUint32>	attachmentNdx	= findColorAttachment(subpass, attachmentIndex);
3035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex)
3037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentIsUsed = true;
3038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Set all pixels that have undefined values to OK
3041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							|| (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)))
3043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++)
3045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++)
3046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			PixelStatus& pixelStatus = status[x + y * result.getWidth()];
3048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
3051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
3055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
3058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Check renderpass rendering results
3063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE
3064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		|| (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE))
3065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Check subpass rendering results
3067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (int subpassNdx = (int)subpasses.size() - 1; subpassNdx >= 0; subpassNdx--)
3068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&				subpass			= subpasses[subpassNdx];
3070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const SubpassRenderInfo&	renderInfo		= subpassRenderInfo[subpassNdx];
3071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Maybe<deUint32>		attachmentNdx	= findColorAttachment(subpass, attachmentIndex);
3072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Check rendered quad
3074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (renderInfo.getRenderQuad() && (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex))
3075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderQuad&	renderQuad	= *renderInfo.getRenderQuad();
3077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4			posA		= renderQuad.getCornerA();
3078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4			posB		= renderQuad.getCornerB();
3079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec2			origin		= Vec2((float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y()) + Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
3080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec2			p			= Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
3081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const IVec2			posAI		((deInt32)(origin.x() + (p.x() * posA.x())),
3082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 (deInt32)(origin.y() + (p.y() * posA.y())));
3083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const IVec2			posBI		((deInt32)(origin.x() + (p.x() * posB.x())),
3084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 (deInt32)(origin.y() + (p.y() * posB.y())));
3085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (isColorFormat)
3087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkColorRenderQuad(result, posAI, posBI, status);
3088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
3089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (hasDepth)
3091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						checkDepthRenderQuad(result, posAI, posBI, status);
3092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (hasDepth && hasStencil)
3094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						checkStencilRenderQuad(*secondaryResult, posAI, posBI, status);
3095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (hasStencil)
3096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						checkStencilRenderQuad(result, posAI, posBI, status);
3097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Check color attachment clears
3101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (attachmentNdx && !renderInfo.getColorClears().empty())
3102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const ColorClear& clear = renderInfo.getColorClears()[*attachmentNdx];
3104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkColorClear(result, clear.getOffset(), clear.getSize(), status, clear.getColor());
3106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Check depth/stencil attachment clears
3109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex && renderInfo.getDepthStencilClear())
3110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const DepthStencilClear clear = *renderInfo.getDepthStencilClear();
3112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth)
3114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkDepthClear(result, clear.getOffset(), clear.getSize(), status, clear.getDepth());
3115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && hasStencil)
3117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(*secondaryResult, clear.getOffset(), clear.getSize(), status, clear.getStencil());
3118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (hasStencil)
3119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(result, clear.getOffset(), clear.getSize(), status, clear.getStencil());
3120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Check renderpas clear results
3124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentIsUsed && renderPassClearValue)
3125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isColorFormat)
3127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkColorClear(result, renderPos, renderSize, status, renderPassClearValue->color);
3130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkDepthClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.depth);
3135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(*secondaryResult, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil);
3138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil);
3140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Set all pixels that have undefined values fater renderpass to OK
3145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							|| (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)))
3147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++)
3149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++)
3150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			PixelStatus& pixelStatus = status[x + y * result.getWidth()];
3152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED
3154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				&& isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
3156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED
3159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					&& hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
3161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED
3163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					&& hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
3165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (imageClearValue)
3170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (isColorFormat)
3172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			checkColorClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->color);
3173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (hasDepth)
3176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkDepthClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.depth);
3177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (hasDepth && hasStencil)
3179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkStencilClear(*secondaryResult, UVec2(0, 0), UVec2(secondaryResult->getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil);
3180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (hasStencil)
3181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkStencilClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil);
3182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		bool isOk = true;
3187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int y = 0; y < result.getHeight(); y++)
3189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int x = 0; x < result.getWidth(); x++)
3190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const PixelStatus& pixelStatus = status[x + y * result.getWidth()];
3192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isColorFormat)
3194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() != PixelStatus::STATUS_OK)
3196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
3198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						errorImage.setPixel(Vec4(1.0f, 1.0f, 0.0f, 1.0f), x, y);
3199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (pixelStatus.getColorStatus() == PixelStatus::STATUS_FAIL)
3200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
3201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					isOk = false;
3203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && pixelStatus.getDepthStatus() != PixelStatus::STATUS_OK)
3208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
3210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					isOk = false;
3211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasStencil && pixelStatus.getStencilStatus() != PixelStatus::STATUS_OK)
3214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
3216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					isOk = false;
3217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return isOk;
3222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool logAndVerifyImages (TestLog&											log,
3226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const DeviceInterface&								vk,
3227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 VkDevice											device,
3228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
3229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<bool>&								attachmentIsLazy,
3230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const RenderPass&									renderPassInfo,
3231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<Maybe<VkClearValue> >&				renderPassClearValues,
3232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<Maybe<VkClearValue> >&				imageClearValues,
3233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<SubpassRenderInfo>&					subpassRenderInfo,
3234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&										targetSize,
3235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const TestConfig&									config)
3236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<tcu::TextureLevel>	referenceAttachments;
3238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool						isOk					= true;
3239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Reference images fill undefined pixels with grid pattern." << TestLog::EndMessage;
3241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderReferenceImages(referenceAttachments, renderPassInfo, targetSize, imageClearValues, renderPassClearValues, subpassRenderInfo, config.renderPos, config.renderSize);
3243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
3245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!attachmentIsLazy[attachmentNdx])
3247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment			attachment		= renderPassInfo.getAttachments()[attachmentNdx];
3249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
3250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order))
3252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3253bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	depthFormat		= getDepthCopyFormat(attachment.getFormat());
3254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			depthBufferSize	= targetSize.x() * targetSize.y() * depthFormat.getPixelSize();
3255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				void* const					depthPtr		= attachmentResources[attachmentNdx]->getResultMemory().getHostPtr();
3256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3257bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	stencilFormat		= getStencilCopyFormat(attachment.getFormat());
3258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			stencilBufferSize	= targetSize.x() * targetSize.y() * stencilFormat.getPixelSize();
3259a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz				void* const					stencilPtr			= attachmentResources[attachmentNdx]->getSecondaryResultMemory().getHostPtr();
3260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkMappedMemoryRange	ranges[] =
3262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,								// sType;
3265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						DE_NULL,															// pNext;
3266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getResultMemory().getMemory(),	// mem;
3267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getResultMemory().getOffset(),	// offset;
3268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						depthBufferSize														// size;
3269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					},
3270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,										// sType;
3272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						DE_NULL,																	// pNext;
3273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getSecondaryResultMemory().getMemory(),	// mem;
3274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getSecondaryResultMemory().getOffset(),	// offset;
3275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						stencilBufferSize															// size;
3276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_CHECK(vk.invalidateMappedMemoryRanges(device, 2u, ranges));
3279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3281bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz					const ConstPixelBufferAccess	depthAccess		(depthFormat, targetSize.x(), targetSize.y(), 1, depthPtr);
3282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const ConstPixelBufferAccess	stencilAccess	(stencilFormat, targetSize.x(), targetSize.y(), 1, stencilPtr);
3283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::TextureLevel				errorImage		(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
3284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Depth", "Attachment " + de::toString(attachmentNdx) + " Depth", depthAccess);
3286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Stencil", "Attachment " + de::toString(attachmentNdx) + " Stencil", stencilAccess);
3287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
3289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
3291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						&& !verifyAttachment(depthAccess, tcu::just(stencilAccess), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize))
3292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
3294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						isOk = false;
3295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			bufferSize	= targetSize.x() * targetSize.y() * format.getPixelSize();
3301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				void* const					ptr			= attachmentResources[attachmentNdx]->getResultMemory().getHostPtr();
3302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkMappedMemoryRange	range	=
3304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,								// sType;
3306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_NULL,															// pNext;
3307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getResultMemory().getMemory(),	// mem;
3308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getResultMemory().getOffset(),	// offset;
3309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					bufferSize															// size;
3310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_CHECK(vk.invalidateMappedMemoryRanges(device, 1u, &range));
3312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const ConstPixelBufferAccess	access		(format, targetSize.x(), targetSize.y(), 1, ptr);
3315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::TextureLevel				errorImage	(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
3316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access);
3318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
3319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
3321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						&& !verifyAttachment(access, tcu::nothing<ConstPixelBufferAccess>(), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize))
3322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
3324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						isOk = false;
3325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return isOk;
3332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string getAttachmentType (VkFormat vkFormat)
3335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
3337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
3338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
3340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
3342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "ivec4";
3343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
3345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "uvec4";
3346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
3348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
3349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
3350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "vec4";
3351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
3353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
3354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "";
3355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid createTestShaders (SourceCollections& dst, TestConfig config)
3359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (config.renderTypes & TestConfig::RENDERTYPES_DRAW)
3361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Subpass>&	subpasses	= config.renderPass.getSubpasses();
3363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
3365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&		subpass		= subpasses[subpassNdx];
3367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			std::ostringstream	vertexShader;
3368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			std::ostringstream	fragmentShader;
3369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vertexShader << "#version 310 es\n"
3371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "layout(location = 0) in highp vec4 a_position;\n"
3372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "layout(location = 0) out highp vec2 v_color;\n"
3373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "void main (void) {\n"
3374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\thighp float a = 0.5 + a_position.x;\n"
3375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\thighp float b = 0.5 + a_position.y;\n"
3376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\tv_color = vec2(a, b);\n"
3377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\tgl_Position = a_position;\n"
3378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "}\n";
3379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader << "#version 310 es\n"
3381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   << "layout(location = 0) in highp vec2 v_color;\n";
3382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
3384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n";
3387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader	<< "void main (void) {\n"
3390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							<< "\thighp vec4 scale = vec4(v_color.x, v_color.y, v_color.x * v_color.y, (v_color.x + v_color.y) / 2.0);\n";
3391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
3393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::TextureFormat		format			= mapVkFormat(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::TextureFormatInfo	formatInfo		= tcu::getTextureFormatInfo(format);
3396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMin		= (float)(-MAX_INTEGER_VALUE);
3397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMax		= (float)(MAX_INTEGER_VALUE);
3398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMax		(de::clamp(formatInfo.valueMax[0], clampMin, clampMax),
3399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMax[1], clampMin, clampMax),
3400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMax[2], clampMin, clampMax),
3401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMax[3], clampMin, clampMax));
3402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMin		(de::clamp(formatInfo.valueMin[0], clampMin, clampMax),
3404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMin[1], clampMin, clampMax),
3405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMin[2], clampMin, clampMax),
3406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMin[3], clampMin, clampMax));
3407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const std::string				attachmentType	= getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(vec4" << valueMin << " + vec4" << (valueMax - valueMin)  << " * scale);\n";
3410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader << "}\n";
3413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			dst.glslSources.add(de::toString(subpassNdx) + "-vert") << glu::VertexSource(vertexShader.str());
3415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			dst.glslSources.add(de::toString(subpassNdx) + "-frag") << glu::FragmentSource(fragmentShader.str());
3416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeAttachmentIsLazy (vector<bool>& attachmentIsLazy, const vector<Attachment>& attachments, TestConfig::ImageMemory imageMemory)
3421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool lastAttachmentWasLazy = false;
3423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachments[attachmentNdx].getLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD
3427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStoreOp() != VK_ATTACHMENT_STORE_OP_STORE
3428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStencilLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD
3429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStencilStoreOp() != VK_ATTACHMENT_STORE_OP_STORE)
3430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (imageMemory == TestConfig::IMAGEMEMORY_LAZY || (imageMemory & TestConfig::IMAGEMEMORY_LAZY && !lastAttachmentWasLazy))
3432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentIsLazy.push_back(true);
3434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				lastAttachmentWasLazy = true;
3435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (imageMemory & TestConfig::IMAGEMEMORY_STRICT)
3437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentIsLazy.push_back(false);
3439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				lastAttachmentWasLazy = false;
3440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_FATAL("Unknown imageMemory");
3443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentIsLazy.push_back(false);
3446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
34495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasserenum AttachmentRefType
34505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
34515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_COLOR,
34525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_DEPTH_STENCIL,
34535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_INPUT,
34545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_RESOLVE,
34555b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser};
34565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
34575b6f20515e6e8dadec3be728a2d0994535ba1016Mais AlnasserVkImageUsageFlags getImageUsageFromLayout(VkImageLayout layout)
34585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
34595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	switch (layout)
34605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
34615b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_GENERAL:
34625b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_PREINITIALIZED:
34635b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return 0;
34645b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
34655b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
34665b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
34675b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
34685b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
34695b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
34705b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
34715b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
34725b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
34735b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
34745b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_TRANSFER_DST_BIT;
34755b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		default:
34765b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			DE_FATAL("Unexpected image layout");
34775b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return 0;
34785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
34795b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
34805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
34815b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, size_t count, const AttachmentReference* references)
34825b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
34835b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	for (size_t referenceNdx = 0; referenceNdx < count; ++referenceNdx)
34845b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
34855b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		const deUint32 attachment = references[referenceNdx].getAttachment();
34865b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
34875b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		if (attachment != VK_ATTACHMENT_UNUSED)
34885b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		{
34895b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			VkImageUsageFlags usage;
34905b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
34915b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			switch (refType)
34925b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			{
34935b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_COLOR:
34945b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_RESOLVE:
34955b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
34965b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
34975b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_DEPTH_STENCIL:
34985b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
34995b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
35005b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_INPUT:
35015b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
35025b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
35035b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				default:
35045b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					DE_FATAL("Unexpected attachment reference type");
35055b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = 0;
35065b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
35075b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			}
35085b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35095b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			attachmentImageUsage[attachment] |= usage;
35105b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		}
35115b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
35125b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
35135b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35145b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, const vector<AttachmentReference>& references)
35155b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
35165b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	if (!references.empty())
35175b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
35185b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, refType, references.size(), &references[0]);
35195b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
35205b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
35215b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
3522277e50dc77528b67562f54c5813b6370e355b614Mais Alnasservoid initializeAttachmentImageUsage (Context &context, vector<VkImageUsageFlags>& attachmentImageUsage, const RenderPass& renderPassInfo, const vector<bool>& attachmentIsLazy, const vector<Maybe<VkClearValue> >& clearValues)
35235b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
35245b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	attachmentImageUsage.resize(renderPassInfo.getAttachments().size(), VkImageUsageFlags(0));
35255b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35265b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); ++subpassNdx)
35275b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
35285b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		const Subpass& subpass = renderPassInfo.getSubpasses()[subpassNdx];
35295b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35305b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_COLOR, subpass.getColorAttachments());
35315b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_DEPTH_STENCIL, 1, &subpass.getDepthStencilAttachment());
35325b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_INPUT, subpass.getInputAttachments());
35335b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_RESOLVE, subpass.getResolveAttachments());
35345b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
35355b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35365b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
35375b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
35385b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		const Attachment& attachment = renderPassInfo.getAttachments()[attachmentNdx];
35395b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
3540277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser		const VkFormatProperties		formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), attachment.getFormat());
3541277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser		const VkFormatFeatureFlags		supportedFeatures = formatProperties.optimalTilingFeatures;
3542277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser
3543277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser		if ((supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0)
3544277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser			attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_SAMPLED_BIT;
3545277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser
3546277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser		if ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0)
3547277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser			attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_STORAGE_BIT;
3548277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser
35495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getInitialLayout());
35505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getFinalLayout());
35515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		if (!attachmentIsLazy[attachmentNdx])
35535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		{
35545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			if (clearValues[attachmentNdx])
35555b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
35565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
35575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
35585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		}
35595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
35605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
35615b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
3562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassIsSecondary (vector<bool>& subpassIsSecondary, const vector<Subpass>& subpasses, TestConfig::CommandBufferTypes commandBuffer)
3563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool lastSubpassWasSecondary = false;
3565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
3567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary))
3569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpassIsSecondary.push_back(true);
3571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			lastSubpassWasSecondary = true;
3572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (commandBuffer & TestConfig::COMMANDBUFFERTYPES_INLINE)
3574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpassIsSecondary.push_back(false);
3576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			lastSubpassWasSecondary = false;
3577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown commandBuffer");
3580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeImageClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments, const vector<bool>& isLazy)
3584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!isLazy[attachmentNdx])
3588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng)));
3589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(nothing<VkClearValue>());
3591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeRenderPassClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments)
3595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachments[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR
3599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			|| attachments[attachmentNdx].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng)));
3602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(nothing<VkClearValue>());
3605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassClearValues (de::Random& rng, vector<vector<VkClearColorValue> >& clearValues, const RenderPass& renderPass)
3609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	clearValues.resize(renderPass.getSubpasses().size());
3611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++)
3613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&						subpass				= renderPass.getSubpasses()[subpassNdx];
3615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
3616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValues[subpassNdx].resize(colorAttachments.size());
3618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++)
3620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const AttachmentReference&	attachmentRef	= colorAttachments[attachmentRefNdx];
3622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&			attachment		= renderPass.getAttachments()[attachmentRef.getAttachment()];
3623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues[subpassNdx][attachmentRefNdx] = randomColorClearValue(attachment, rng);
3625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logSubpassRenderInfo (TestLog&					log,
3630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const SubpassRenderInfo&	info)
3631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Viewport, offset: " << info.getViewportOffset() << ", size: " << info.getViewportSize() << TestLog::EndMessage;
3633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.isSecondary())
3635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Subpass uses secondary command buffers" << TestLog::EndMessage;
3636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
3637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Subpass uses inlined commands" << TestLog::EndMessage;
3638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 attachmentNdx = 0; attachmentNdx < info.getColorClears().size(); attachmentNdx++)
3640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const ColorClear&	colorClear	= info.getColorClears()[attachmentNdx];
3642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Clearing color attachment " << attachmentNdx
3644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ". Offset: " << colorClear.getOffset()
3645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Size: " << colorClear.getSize()
3646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Color: " << clearColorToString(info.getColorAttachment(attachmentNdx).getFormat(), colorClear.getColor()) << TestLog::EndMessage;
3647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.getDepthStencilClear())
3650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const DepthStencilClear&	depthStencilClear	= *info.getDepthStencilClear();
3652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Clearing depth stencil attachment"
3654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ". Offset: " << depthStencilClear.getOffset()
3655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Size: " << depthStencilClear.getSize()
3656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Depth: " << depthStencilClear.getDepth()
3657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Stencil: " << depthStencilClear.getStencil() << TestLog::EndMessage;
3658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.getRenderQuad())
3661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderQuad&	renderQuad	= *info.getRenderQuad();
3663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Rendering gradient quad to " << renderQuad.getCornerA() << " -> " << renderQuad.getCornerB() << TestLog::EndMessage;
3665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logTestCaseInfo (TestLog&									log,
3669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const TestConfig&							config,
3670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<bool>&						attachmentIsLazy,
3671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<Maybe<VkClearValue> >&		imageClearValues,
3672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<Maybe<VkClearValue> >&		renderPassClearValues,
3673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<SubpassRenderInfo>&			subpassRenderInfo)
3674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const RenderPass&	renderPass	= config.renderPass;
3676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	logRenderPassInfo(log, renderPass);
3678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(attachmentIsLazy.size() == renderPass.getAttachments().size());
3680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(imageClearValues.size() == renderPass.getAttachments().size());
3681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(renderPassClearValues.size() == renderPass.getAttachments().size());
3682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "TargetSize: " << config.targetSize << TestLog::EndMessage;
3684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Render area, Offset: " << config.renderPos << ", Size: " << config.renderSize << TestLog::EndMessage;
3685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentIsLazy.size(); attachmentNdx++)
3687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	section	(log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx));
3689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentIsLazy[attachmentNdx])
3691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Is lazy." << TestLog::EndMessage;
3692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (imageClearValues[attachmentNdx])
3694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Image is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *imageClearValues[attachmentNdx]) << " before rendering." << TestLog::EndMessage;
3695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPass.getAttachments()[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR && renderPassClearValues[attachmentNdx])
3697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Attachment is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *renderPassClearValues[attachmentNdx]) << " in the beginning of the render pass." << TestLog::EndMessage;
3698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++)
3701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection section (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx));
3703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		logSubpassRenderInfo(log, subpassRenderInfo[subpassNdx]);
3705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassRenderInfo (vector<SubpassRenderInfo>& renderInfos, de::Random& rng, const RenderPass& renderPass, const TestConfig& config)
3709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes	commandBuffer			= config.commandBufferTypes;
3711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&					subpasses				= renderPass.getSubpasses();
3712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool									lastSubpassWasSecondary	= false;
3713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 subpassNdx = 0; subpassNdx < (deUint32)subpasses.size(); subpassNdx++)
3715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&				subpass				= subpasses[subpassNdx];
3717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool					subpassIsSecondary	= commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY
3718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														|| (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary) ? true : false;
3719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const UVec2					viewportSize		((config.renderSize * UVec2(2)) / UVec2(3));
3720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const UVec2					viewportOffset		(config.renderPos.x() + (subpassNdx % 2) * (config.renderSize.x() / 3),
3721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 config.renderPos.y() + ((subpassNdx / 2) % 2) * (config.renderSize.y() / 3));
3722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<ColorClear>			colorClears;
3724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Maybe<DepthStencilClear>	depthStencilClear;
3725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Maybe<RenderQuad>			renderQuad;
3726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		lastSubpassWasSecondary		= subpassIsSecondary;
3728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (config.renderTypes & TestConfig::RENDERTYPES_CLEAR)
3730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
3732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++)
3734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const AttachmentReference&	attachmentRef	= colorAttachments[attachmentRefNdx];
3736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&			attachment		= renderPass.getAttachments()[attachmentRef.getAttachment()];
3737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2					size			((viewportSize * UVec2(2)) / UVec2(3));
3738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2					offset			(viewportOffset.x() + ((deUint32)attachmentRefNdx % 2u) * (viewportSize.x() / 3u),
3739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															 viewportOffset.y() + (((deUint32)attachmentRefNdx / 2u) % 2u) * (viewportSize.y() / 3u));
3740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkClearColorValue		color			= randomColorClearValue(attachment, rng);
3741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				colorClears.push_back(ColorClear(offset, size, color));
3743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
3746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&	attachment		= renderPass.getAttachments()[subpass.getDepthStencilAttachment().getAttachment()];
3748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2			size			((viewportSize * UVec2(2)) / UVec2(3));
3749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2			offset			(viewportOffset.x() + ((deUint32)colorAttachments.size() % 2u) * (viewportSize.x() / 3u),
3750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi													 viewportOffset.y() + (((deUint32)colorAttachments.size() / 2u) % 2u) * (viewportSize.y() / 3u));
3751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkClearValue	value			= randomClearValue(attachment, rng);
3752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				depthStencilClear = tcu::just(DepthStencilClear(offset, size, value.depthStencil.depth, value.depthStencil.stencil));
3754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (config.renderTypes & TestConfig::RENDERTYPES_DRAW)
3758b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes		{
3759b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes			// (-0.5,-0.5) - (0.5,0.5) rounded to pixel edges
3760b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes			const float x = (float)(viewportSize.x() / 4) / (float)(viewportSize.x() / 2);
3761b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes			const float y = (float)(viewportSize.y() / 4) / (float)(viewportSize.y() / 2);
3762b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes			renderQuad = tcu::just(RenderQuad(tcu::Vec4(-x, -y, 0.0f, 1.0f), tcu::Vec4(x, y, 1.0f, 1.0f)));
3763b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes		}
3764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderInfos.push_back(SubpassRenderInfo(renderPass, subpassNdx, subpassIsSecondary, viewportOffset, viewportSize, renderQuad, colorClears, depthStencilClear));
3766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkTextureFormatSupport (TestLog&					log,
3770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								const InstanceInterface&	vk,
3771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								VkPhysicalDevice			device,
3772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								const vector<Attachment>&	attachments)
3773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool supported = true;
3775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment&			attachment					= attachments[attachmentNdx];
3779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat	format						= mapVkFormat(attachment.getFormat());
3780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool					isDepthOrStencilAttachment	= hasDepthComponent(format.order) || hasStencilComponent(format.order);
3781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkFormatFeatureFlags	flags						= isDepthOrStencilAttachment? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
3782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkFormatProperties			properties;
3783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
378468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.getPhysicalDeviceFormatProperties(device, attachment.getFormat(), &properties);
3785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if ((properties.optimalTilingFeatures & flags) != flags)
3787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			supported = false;
3789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Format: " << attachment.getFormat() << " not supported as " << (isDepthOrStencilAttachment ? "depth stencil attachment" : "color attachment") << TestLog::EndMessage;
3790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!supported)
3794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TCU_THROW(NotSupportedError, "Format not supported");
3795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestStatus renderPassTest (Context& context, TestConfig config)
3798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							targetSize			= config.targetSize;
3800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							renderPos			= config.renderPos;
3801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							renderSize			= config.renderSize;
3802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const RenderPass&					renderPassInfo		= config.renderPass;
3803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	TestLog&							log					= context.getTestContext().getLog();
3805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random							rng					(config.seed);
3806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>						attachmentIsLazy;
38085b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	vector<VkImageUsageFlags>			attachmentImageUsage;
3809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Maybe<VkClearValue> >		imageClearValues;
3810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Maybe<VkClearValue> >		renderPassClearValues;
3811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>						subpassIsSecondary;
3813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<SubpassRenderInfo>			subpassRenderInfo;
3814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<vector<VkClearColorValue> >	subpassColorClearValues;
3815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeAttachmentIsLazy(attachmentIsLazy, renderPassInfo.getAttachments(), config.imageMemory);
3817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeImageClearValues(rng, imageClearValues, renderPassInfo.getAttachments(), attachmentIsLazy);
3818277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser	initializeAttachmentImageUsage(context, attachmentImageUsage, renderPassInfo, attachmentIsLazy, imageClearValues);
3819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeRenderPassClearValues(rng, renderPassClearValues, renderPassInfo.getAttachments());
3820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassIsSecondary(subpassIsSecondary, renderPassInfo.getSubpasses(), config.commandBufferTypes);
3822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassClearValues(rng, subpassColorClearValues, renderPassInfo);
3823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassRenderInfo(subpassRenderInfo, rng, renderPassInfo, config);
3824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	logTestCaseInfo(log, config, attachmentIsLazy, imageClearValues, renderPassClearValues, subpassRenderInfo);
3826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	checkTextureFormatSupport(log, context.getInstanceInterface(), context.getPhysicalDevice(), config.renderPass.getAttachments());
3828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
383086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		const vk::VkPhysicalDeviceProperties properties = vk::getPhysicalDeviceProperties(context.getInstanceInterface(), context.getPhysicalDevice());
383186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
383286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		log << TestLog::Message << "Max color attachments: " << properties.limits.maxColorAttachments << TestLog::EndMessage;
383386abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
383486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
383586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		{
383686abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi			 if (renderPassInfo.getSubpasses()[subpassNdx].getColorAttachments().size() > (size_t)properties.limits.maxColorAttachments)
383786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi				 TCU_THROW(NotSupportedError, "Subpass uses more than maxColorAttachments.");
383886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		}
383986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi	}
384086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
384186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi	{
3842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkDevice								device								= context.getDevice();
3843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const DeviceInterface&						vk									= context.getDeviceInterface();
3844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkQueue								queue								= context.getUniversalQueue();
3845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32								queueIndex							= context.getUniversalQueueFamilyIndex();
3846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Allocator&									allocator							= context.getDefaultAllocator();
3847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Unique<VkRenderPass>					renderPass							(createRenderPass(vk, device, renderPassInfo));
384968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandPool>					commandBufferPool					(createCommandPool(vk, device, queueIndex, 0));
385068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				initializeImagesCommandBuffer		(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
385168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				renderCommandBuffer					(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
385268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				readImagesToBuffersCommandBuffer	(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
3853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<de::SharedPtr<AttachmentResources> >	attachmentResources;
3855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<de::SharedPtr<SubpassRenderer> >		subpassRenderers;
3856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageView>							attachmentViews;
3857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
3859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&	attachmentInfo	= renderPassInfo.getAttachments()[attachmentNdx];
3861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
38625b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			attachmentResources.push_back(de::SharedPtr<AttachmentResources>(new AttachmentResources(vk, device, allocator, queueIndex, targetSize, attachmentInfo, attachmentImageUsage[attachmentNdx])));
3863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentViews.push_back(attachmentResources[attachmentNdx]->getAttachmentView());
3864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
386668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		beginCommandBuffer(vk, *initializeImagesCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
3867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pushImageInitializationCommands(vk, *initializeImagesCommandBuffer, renderPassInfo.getAttachments(), attachmentResources, queueIndex, imageClearValues);
3868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		endCommandBuffer(vk, *initializeImagesCommandBuffer);
3869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, *renderPass, targetSize, attachmentViews));
3872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
3874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				subpassRenderers.push_back(de::SharedPtr<SubpassRenderer>(new SubpassRenderer(context, vk, device, allocator, *renderPass, *framebuffer, *commandBufferPool, queueIndex, subpassRenderInfo[subpassNdx])));
3875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
387668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			beginCommandBuffer(vk, *renderCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
3877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushRenderPassCommands(vk, *renderCommandBuffer, *renderPass, *framebuffer, subpassRenderers, renderPos, renderSize, renderPassClearValues, config.renderTypes);
3878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *renderCommandBuffer);
3879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
388068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			beginCommandBuffer(vk, *readImagesToBuffersCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
3881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushReadImagesToBuffers(vk, *readImagesToBuffersCommandBuffer, queueIndex, attachmentResources, renderPassInfo.getAttachments(), attachmentIsLazy, targetSize);
3882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *readImagesToBuffersCommandBuffer);
3883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
388468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkCommandBuffer commandBuffers[] =
3885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*initializeImagesCommandBuffer,
3887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*renderCommandBuffer,
3888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*readImagesToBuffersCommandBuffer
3889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Unique<VkFence>	fence		(createFence(vk, device, 0u));
3891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueSubmit(vk, queue, DE_LENGTH_OF_ARRAY(commandBuffers), commandBuffers, *fence);
3893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				waitForFences(vk, device, 1, &fence.get(), VK_TRUE, ~0ull);
3894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (logAndVerifyImages(log, vk, device, attachmentResources, attachmentIsLazy, renderPassInfo, renderPassClearValues, imageClearValues, subpassRenderInfo, targetSize, config))
3898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::TestStatus::pass("Pass");
3899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::TestStatus::fail("Result verification failed");
3901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
390418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreColorFormats[] =
3905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
390668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_FORMAT_R5G6B5_UNORM_PACK16,
3907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_UNORM,
3908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_SNORM,
3909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_UINT,
3910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_SINT,
3911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_UNORM,
3912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_SNORM,
3913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_UINT,
3914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_SINT,
3915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_UNORM,
3916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SNORM,
3917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_UINT,
3918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SINT,
3919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SRGB,
392018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_UNORM_PACK32,
392118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SNORM_PACK32,
392218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_UINT_PACK32,
392318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SINT_PACK32,
392418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SRGB_PACK32,
392518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_B8G8R8A8_UNORM,
392618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_B8G8R8A8_SRGB,
392718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2R10G10B10_UNORM_PACK32,
392818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2B10G10R10_UNORM_PACK32,
392918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2B10G10R10_UINT_PACK32,
3930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_UNORM,
3931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SNORM,
3932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_UINT,
3933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SINT,
3934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SFLOAT,
3935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_UNORM,
3936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SNORM,
3937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_UINT,
3938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SINT,
3939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SFLOAT,
3940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_UNORM,
3941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SNORM,
3942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_UINT,
3943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SINT,
3944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SFLOAT,
3945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_UINT,
3946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_SINT,
3947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_SFLOAT,
3948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_UINT,
3949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_SINT,
3950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_SFLOAT,
3951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_UINT,
3952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_SINT,
3953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_SFLOAT
3954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
3955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
395618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreDepthStencilFormats[] =
3957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_D16_UNORM,
395918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
396068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_FORMAT_X8_D24_UNORM_PACK32,
3961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_D32_SFLOAT,
396218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
396318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_D24_UNORM_S8_UINT,
396418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_D32_SFLOAT_S8_UINT
3965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
3966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentTestCaseGroup (tcu::TestContext& testCtx)
3968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
396986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi	const deUint32 attachmentCounts[] = { 1, 3, 4, 8 };
3970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentLoadOp loadOps[] =
3971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_LOAD,
3973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,
3974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE
3975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentStoreOp storeOps[] =
3978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,
3980775c33feeee3a8a7cfe1a51447424d4160083fffscygan		VK_ATTACHMENT_STORE_OP_DONT_CARE
3981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
398300d994858ab64bb5e1c6cb534bb049dcbb9269descygan	const VkImageLayout initialAndFinalColorLayouts[] =
3984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
3986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
398700d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
398800d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
398900d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
399000d994858ab64bb5e1c6cb534bb049dcbb9269descygan	};
399100d994858ab64bb5e1c6cb534bb049dcbb9269descygan
399200d994858ab64bb5e1c6cb534bb049dcbb9269descygan	const VkImageLayout initialAndFinalDepthStencilLayouts[] =
399300d994858ab64bb5e1c6cb534bb049dcbb9269descygan	{
399400d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_GENERAL,
3995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
3997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
399868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
399968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
4000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout subpassLayouts[] =
4003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout depthStencilLayouts[] =
4009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
4012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::RenderTypes renderCommands[] =
4015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_NONE,
4017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR,
4018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_DRAW,
4019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW,
4020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes commandBuffers[] =
4023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE,
4025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_SECONDARY,
4026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY
4027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::ImageMemory imageMemories[] =
4030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT,
4032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_LAZY,
4033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY
4034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSizes[] =
4037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(64, 64),
4039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(63, 65)
4040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPositions[] =
4043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(0, 0),
4045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(3, 17)
4046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSizes[] =
4049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(32, 32),
4051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(60, 47)
4052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random rng (1433774382u);
4055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "attachment", "Attachment format and count tests with load and store ops and image layouts"));
4056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentCountNdx = 0; attachmentCountNdx < DE_LENGTH_OF_ARRAY(attachmentCounts); attachmentCountNdx++)
4058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32					attachmentCount			= attachmentCounts[attachmentCountNdx];
4060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32					testCaseCount			= (attachmentCount == 1 ? 100 : 200);
4061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	attachmentCountGroup	(new tcu::TestCaseGroup(testCtx, de::toString(attachmentCount).c_str(), de::toString(attachmentCount).c_str()));
4062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++)
4064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool					useDepthStencil		= rng.getBool();
4066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VkImageLayout				depthStencilLayout	= VK_IMAGE_LAYOUT_GENERAL;
4067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Attachment>			attachments;
4068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<AttachmentReference>	colorAttachmentReferences;
4069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++)
4071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
407268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
407318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
4074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
407700d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
407800d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
4079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkImageLayout			subpassLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (useDepthStencil)
4089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
409018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkSampleCountFlagBits	sampleCount			= VK_SAMPLE_COUNT_1_BIT;
409118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format				= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats));
4092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp				= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp				= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
409500d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			initialLayout		= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts));
409600d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			finalizeLayout		= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts));
4097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp		= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp		= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				depthStencilLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(depthStencilLayouts), DE_ARRAY_END(depthStencilLayouts));
4102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
4107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
4108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
4109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const vector<Subpass>					subpasses		(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference((useDepthStencil ? (deUint32)(attachments.size() - 1) : VK_ATTACHMENT_UNUSED), depthStencilLayout), vector<AttachmentReference>()));
4110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const vector<SubpassDependency>			deps;
4111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const string							testCaseName	= de::toString(attachmentCountNdx * testCaseCount + testCaseNdx);
4113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass						renderPass		(attachments, subpasses, deps);
4114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
4115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
4116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
4117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(attachmentCountGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 1293809));
4119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(attachmentCountGroup.release());
4123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentAllocationTestGroup (tcu::TestContext& testCtx)
4129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32 attachmentCounts[] = { 4, 8 };
4131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentLoadOp loadOps[] =
4132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_LOAD,
4134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,
4135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE
4136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentStoreOp storeOps[] =
4139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,
4141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_DONT_CARE
4142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
414424fb688e68b85c2752c5ab81d8292a1fed1e9addscygan	const VkImageLayout initialAndFinalColorLayouts[] =
4145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
414824fb688e68b85c2752c5ab81d8292a1fed1e9addscygan		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
414924fb688e68b85c2752c5ab81d8292a1fed1e9addscygan		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
415024fb688e68b85c2752c5ab81d8292a1fed1e9addscygan		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
415124fb688e68b85c2752c5ab81d8292a1fed1e9addscygan	};
415224fb688e68b85c2752c5ab81d8292a1fed1e9addscygan
4153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout subpassLayouts[] =
4154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum AllocationType
4160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass uses one more attachmen than previous one
4162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW,
4163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass uses one less attachment than previous one
4164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_SHRINK,
4165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass drops one attachment and picks up new one
4166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_ROLL,
4167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Start by growing and end by shrinking
4168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW_SHRINK
4169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const AllocationType allocationTypes[] =
4172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW,
4174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_SHRINK,
4175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_ROLL,
4176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW_SHRINK
4177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const char* const allocationTypeStr[] =
4180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"grow",
4182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"shrink",
4183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"roll",
4184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"grow_shrink"
4185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::RenderTypes renderCommands[] =
4188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_NONE,
4190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR,
4191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_DRAW,
4192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW,
4193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes commandBuffers[] =
4196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE,
4198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_SECONDARY,
4199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY
4200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::ImageMemory imageMemories[] =
4203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT,
4205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_LAZY,
4206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY
4207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSizes[] =
4210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(64, 64),
4212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(63, 65)
4213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPositions[] =
4216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(0, 0),
4218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(3, 17)
4219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSizes[] =
4222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(32, 32),
4224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(60, 47)
4225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "attachment_allocation", "Attachment allocation tests"));
4228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random						rng		(3700649827u);
4229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t allocationTypeNdx = 0; allocationTypeNdx < DE_LENGTH_OF_ARRAY(allocationTypes); allocationTypeNdx++)
4231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const AllocationType			allocationType		= allocationTypes[allocationTypeNdx];
4233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const size_t					testCaseCount		= 100;
4234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	allocationTypeGroup	(new tcu::TestCaseGroup(testCtx, allocationTypeStr[allocationTypeNdx], allocationTypeStr[allocationTypeNdx]));
4235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++)
4237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32		attachmentCount	= rng.choose<deUint32>(DE_ARRAY_BEGIN(attachmentCounts), DE_ARRAY_END(attachmentCounts));
4239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Attachment>	attachments;
4240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Subpass>		subpasses;
4241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++)
4243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
424468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
424518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
4246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
424924fb688e68b85c2752c5ab81d8292a1fed1e9addscygan				const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
425024fb688e68b85c2752c5ab81d8292a1fed1e9addscygan				const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
4251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (allocationType == ALLOCATIONTYPE_GROW)
4259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++)
4265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>()));
4272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (allocationType == ALLOCATIONTYPE_SHRINK)
4275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
4281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>()));
4288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (allocationType == ALLOCATIONTYPE_ROLL)
4291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount / 2; subpassNdx++)
4293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount / 2; attachmentNdx++)
4297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)(subpassNdx + attachmentNdx), subpassLayout));
4301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>()));
4304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (allocationType == ALLOCATIONTYPE_GROW_SHRINK)
4307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++)
4313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>()));
4320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
4327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>()));
4334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
4337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_FATAL("Unknown allocation type");
4338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
4341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
4342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
4343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const string							testCaseName	= de::toString(testCaseNdx);
4345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
4346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
4347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
4348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				vector<SubpassDependency>				deps;
4350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4351433aad756646dacd9b9bdd863fda3578977e254escygan				for (size_t subpassNdx = 0; subpassNdx < subpasses.size() - 1; subpassNdx++)
4352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool byRegion				= rng.getBool();
4354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					deps.push_back(SubpassDependency((deUint32)subpassNdx, (deUint32)subpassNdx + 1,
4355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi													 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
4356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
4357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
4358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
4359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi													 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
4361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
4362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
4363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
4364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
436568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
436668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, // \todo [pyry] Correct?
4367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4368682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos													 byRegion ? (VkBool32)VK_TRUE : (VkBool32)VK_FALSE));
4369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass					renderPass		(attachments, subpasses, deps);
4372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329));
4374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(allocationTypeGroup.release());
4378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createSimpleTestGroup (tcu::TestContext& testCtx)
4384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2						targetSize	(64, 64);
4386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2						renderPos	(0, 0);
4387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2						renderSize	(64, 64);
4388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	group		(new tcu::TestCaseGroup(testCtx, "simple", "Simple basic render pass tests"));
4389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color
4391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_R8G8B8A8_UNORM,
439368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
4406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "color", "Single color attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// depth
4413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
441468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_X8_D24_UNORM_PACK32,
441568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
4422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "depth", "Single depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// stencil
4435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_S8_UINT,
443768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
4444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "stencil", "Single stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// depth_stencil
4457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_D24_UNORM_S8_UINT,
445968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
4466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "depth_stencil", "Single depth stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_depth
4479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
4481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
448368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
449068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			Attachment(VK_FORMAT_X8_D24_UNORM_PACK32,
449168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
4499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
4501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_depth", "Color and depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_stencil
4514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
4516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
451868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
4525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_S8_UINT,
452668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
4534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
4536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_stencil", "Color and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_depth_stencil
4550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
4552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
455468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
4561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_D24_UNORM_S8_UINT,
456268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
4570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
4572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_depth_stencil", "Color, depth and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string formatToName (VkFormat format)
4588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const std::string	formatStr	= de::toString(format);
4590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const std::string	prefix		= "VK_FORMAT_";
4591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(formatStr.substr(0, prefix.length()) == prefix);
4593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return de::toLower(formatStr.substr(prefix.length()));
4595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createFormatTestGroup(tcu::TestContext& testCtx)
4598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "formats", "Tests for different image formats."));
4600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSize	(64, 64);
4602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPos	(0, 0);
4603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSize	(64, 64);
4604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const struct
4606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const char* const			str;
4608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkAttachmentLoadOp	op;
4609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	} loadOps[] =
4610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear",		VK_ATTACHMENT_LOAD_OP_CLEAR		},
4612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "load",		VK_ATTACHMENT_LOAD_OP_LOAD		},
4613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "dont_care",	VK_ATTACHMENT_LOAD_OP_DONT_CARE	}
4614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const struct
4617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		 const char* const				str;
4619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		 const TestConfig::RenderTypes	types;
4620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	} renderTypes[] =
4621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear",		TestConfig::RENDERTYPES_CLEAR								},
4623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "draw",		TestConfig::RENDERTYPES_DRAW								},
4624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear_draw",	TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW	}
4625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
462718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	// Color formats
462818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreColorFormats); formatNdx++)
4629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
463018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		const VkFormat					format		= s_coreColorFormats[formatNdx];
4631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str()));
4632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
4634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkAttachmentLoadOp		loadOp	= loadOps[loadOpNdx].op;
4636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
4637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
4639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass	renderPass	(vector<Attachment>(1, Attachment(format,
464168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																				  VK_SAMPLE_COUNT_1_BIT,
4642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  loadOp,
4643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_STORE_OP_STORE,
4644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			0u,
4650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(),
4651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(),
4653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
4654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>())),
4655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 vector<SubpassDependency>());
465618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
465718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(loadOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
465818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			}
465918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
466018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			formatGroup->addChild(loadOpGroup.release());
466118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		}
466218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
466318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		group->addChild(formatGroup.release());
466418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	}
466518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
466618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	// Depth stencil formats
466718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreDepthStencilFormats); formatNdx++)
466818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	{
466918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		const VkFormat					format		= s_coreDepthStencilFormats[formatNdx];
467018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str()));
467118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
467218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
467318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		{
467418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			const VkAttachmentLoadOp		loadOp	= loadOps[loadOpNdx].op;
467518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
467618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
467718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
467818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			{
467918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const RenderPass	renderPass	(vector<Attachment>(1, Attachment(format,
468018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_SAMPLE_COUNT_1_BIT,
468118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
468218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_ATTACHMENT_STORE_OP_DONT_CARE,
468318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  loadOp,
468418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_ATTACHMENT_STORE_OP_STORE,
468518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
468618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
468718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi												 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
468818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			0u,
468918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
469018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
469118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
469218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
469318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>())),
469418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi												 vector<SubpassDependency>());
4695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(loadOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
4697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			formatGroup->addChild(loadOpGroup.release());
4700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(formatGroup.release());
4703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // anonymous
4709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestCaseGroup* createRenderPassTests (tcu::TestContext& testCtx)
4711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	renderpassTests	(new tcu::TestCaseGroup(testCtx, "renderpass", "RenderPass Tests"));
4713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createSimpleTestGroup(testCtx).release());
4715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createFormatTestGroup(testCtx).release());
4716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createAttachmentTestCaseGroup(testCtx).release());
4717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createAttachmentAllocationTestGroup(testCtx).release());
4718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return renderpassTests.release();
4720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // vkt
4723