vktRenderPassTests.cpp revision 18cca0001c3ce503dcc339c839ed85be639e11e5
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 *
7c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Permission is hereby granted, free of charge, to any person obtaining a
8c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * copy of this software and/or associated documentation files (the
9c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * "Materials"), to deal in the Materials without restriction, including
10c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * without limitation the rights to use, copy, modify, merge, publish,
11c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * distribute, sublicense, and/or sell copies of the Materials, and to
12c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * permit persons to whom the Materials are furnished to do so, subject to
13c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * the following conditions:
14c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
15c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * The above copyright notice(s) and this permission notice shall be
16c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * included in all copies or substantial portions of the Materials.
17c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
18c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * The Materials are Confidential Information as defined by the
19c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Khronos Membership Agreement until designated non-confidential by
20c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Khronos, at which point this condition clause shall be removed.
21c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
22c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
26c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
29c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
30c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*!
31c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \file
32c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \brief RenderPass tests
33c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*--------------------------------------------------------------------*/
34c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
35c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktRenderPassTests.hpp"
36c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
37c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktTestCaseUtil.hpp"
38c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
39c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDefs.hpp"
40c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDeviceUtil.hpp"
41c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkImageUtil.hpp"
42c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkMemUtil.hpp"
43c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPlatform.hpp"
44c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPrograms.hpp"
45c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkQueryUtil.hpp"
46c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRef.hpp"
47c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRefUtil.hpp"
48c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkStrUtil.hpp"
49c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkTypeUtil.hpp"
50c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
51c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTestLog.hpp"
52c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuResultCollector.hpp"
53c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFormatUtil.hpp"
54c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTextureUtil.hpp"
55c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFloat.hpp"
56c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuMaybe.hpp"
57c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuVectorUtil.hpp"
58c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
59c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deUniquePtr.hpp"
60c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSharedPtr.hpp"
61c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deStringUtil.hpp"
62c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSTLUtil.hpp"
63c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deRandom.hpp"
64c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
65c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include <limits>
66c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
67c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing namespace vk;
68c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
69c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Maybe;
70c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::nothing;
71c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::just;
72c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::TestLog;
73c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec2;
74c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec2;
75c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec2;
76c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec4;
77c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec4;
78c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec4;
79c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::BVec4;
80c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::ConstPixelBufferAccess;
81c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::PixelBufferAccess;
82c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
83c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing de::UniquePtr;
84c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
85c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::vector;
86c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::string;
87c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
88c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace vkt
89c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
90c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace
91c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
92c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvienum
93c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
94c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	STENCIL_VALUE = 84u,
95c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Limit integer values that are representable as floats
96c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	MAX_INTEGER_VALUE = ((1u<<22u)-1u)
97c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
98c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
99c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi// Utility functions using flattened structs
100c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFence> createFence (const DeviceInterface& vk, VkDevice device, VkFenceCreateFlags flags)
101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkFenceCreateInfo pCreateInfo =
103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		flags
108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
109955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createFence(vk, device, &pCreateInfo);
110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
11268e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkFramebuffer> createFramebuffer (const DeviceInterface&	vk,
11368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkDevice					device,
11468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkFramebufferCreateFlags	pCreateInfo_flags,
11568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkRenderPass				pCreateInfo_renderPass,
11668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_attachmentCount,
11768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   const VkImageView*		pCreateInfo_pAttachments,
11868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_width,
11968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_height,
12068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_layers)
121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkFramebufferCreateInfo pCreateInfo =
123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
12668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_renderPass,
128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_attachmentCount,
129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pAttachments,
130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_width,
131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_height,
132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_layers,
133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
134955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createFramebuffer(vk, device, &pCreateInfo);
135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
13768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkImage> createImage (const DeviceInterface&	vk,
13868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkDevice					device,
13968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageCreateFlags		pCreateInfo_flags,
14068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageType				pCreateInfo_imageType,
14168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkFormat					pCreateInfo_format,
14268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkExtent3D				pCreateInfo_extent,
14368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_mipLevels,
14468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_arrayLayers,
14568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkSampleCountFlagBits	pCreateInfo_samples,
14668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageTiling			pCreateInfo_tiling,
14768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageUsageFlags		pCreateInfo_usage,
14868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkSharingMode			pCreateInfo_sharingMode,
14968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_queueFamilyCount,
15068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   const deUint32*			pCreateInfo_pQueueFamilyIndices,
15168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageLayout			pCreateInfo_initialLayout)
152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageCreateInfo pCreateInfo =
154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
15768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_imageType,
159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_format,
160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_extent,
161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_mipLevels,
16268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_arrayLayers,
163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_samples,
164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_tiling,
165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_usage,
166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_sharingMode,
167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyCount,
168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pQueueFamilyIndices,
169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_initialLayout
170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
171955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createImage(vk, device, &pCreateInfo);
172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindBufferMemory (const DeviceInterface& vk, VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset)
175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.bindBufferMemory(device, buffer, mem, memOffset));
177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindImageMemory (const DeviceInterface& vk, VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset)
180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.bindImageMemory(device, image, mem, memOffset));
182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
184c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageView (const DeviceInterface&	vk,
185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkDevice				device,
18668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkImageViewCreateFlags	pCreateInfo_flags,
187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkImage					pCreateInfo_image,
188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkImageViewType			pCreateInfo_viewType,
189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkFormat				pCreateInfo_format,
19068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkComponentMapping		pCreateInfo_components,
19168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkImageSubresourceRange	pCreateInfo_subresourceRange)
192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageViewCreateInfo pCreateInfo =
194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
19768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_image,
199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_viewType,
200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_format,
20168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_components,
202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_subresourceRange,
203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
204955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createImageView(vk, device, &pCreateInfo);
205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
20768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkBuffer> createBuffer (const DeviceInterface&	vk,
20868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkDevice				device,
20968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkBufferCreateFlags	pCreateInfo_flags,
21068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkDeviceSize			pCreateInfo_size,
21168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkBufferUsageFlags		pCreateInfo_usage,
21268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkSharingMode			pCreateInfo_sharingMode,
21368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 deUint32				pCreateInfo_queueFamilyCount,
21468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 const deUint32*		pCreateInfo_pQueueFamilyIndices)
215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkBufferCreateInfo pCreateInfo =
217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
22068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_size,
222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_usage,
223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_sharingMode,
224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyCount,
225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pQueueFamilyIndices,
226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
227955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createBuffer(vk, device, &pCreateInfo);
228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
23068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandPool> createCommandPool (const DeviceInterface&	vk,
23168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkDevice					device,
23268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkCommandPoolCreateFlags	pCreateInfo_flags,
23368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_queueFamilyIndex)
234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
23568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandPoolCreateInfo pCreateInfo =
236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
23768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_flags,
240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyIndex,
241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
242955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createCommandPool(vk, device, &pCreateInfo);
243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
24568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid cmdBeginRenderPass (const DeviceInterface&	vk,
24668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBuffer		cmdBuffer,
24768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRenderPass			pRenderPassBegin_renderPass,
24868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkFramebuffer			pRenderPassBegin_framebuffer,
24968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRect2D				pRenderPassBegin_renderArea,
25068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 deUint32				pRenderPassBegin_clearValueCount,
25168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 const VkClearValue*	pRenderPassBegin_pAttachmentClearValues,
25268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkSubpassContents		contents)
253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkRenderPassBeginInfo pRenderPassBegin =
255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_renderPass,
259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_framebuffer,
260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_renderArea,
26168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pRenderPassBegin_clearValueCount,
262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_pAttachmentClearValues,
263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vk.cmdBeginRenderPass(cmdBuffer, &pRenderPassBegin, contents);
265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
26768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandBuffer> allocateCommandBuffer (const DeviceInterface&	vk,
26868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkDevice				device,
26968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkCommandPool			pCreateInfo_commandPool,
27068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkCommandBufferLevel	pCreateInfo_level)
271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
272955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	const VkCommandBufferAllocateInfo pAllocateInfo =
273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
27468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
27668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_commandPool,
277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_level,
27868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// bufferCount
279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
280955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return allocateCommandBuffer(vk, device, &pAllocateInfo);
281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
28368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid beginCommandBuffer (const DeviceInterface&			vk,
28468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBuffer				cmdBuffer,
28568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBufferUsageFlags		pBeginInfo_flags,
28668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRenderPass					pBeginInfo_renderPass,
28768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 deUint32						pBeginInfo_subpass,
28868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkFramebuffer					pBeginInfo_framebuffer,
28968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkBool32						pBeginInfo_occlusionQueryEnable,
29068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkQueryControlFlags			pBeginInfo_queryFlags,
29168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkQueryPipelineStatisticFlags	pBeginInfo_pipelineStatistics)
292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
29368e7282426d639b54d15c4710d97ba97e72c76efPyry 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,
298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pBeginInfo_renderPass,
299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pBeginInfo_subpass,
300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pBeginInfo_framebuffer,
30168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pBeginInfo_occlusionQueryEnable,
30268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pBeginInfo_queryFlags,
30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pBeginInfo_pipelineStatistics,
304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.beginCommandBuffer(cmdBuffer, &pBeginInfo));
306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
30868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid endCommandBuffer (const DeviceInterface& vk, VkCommandBuffer cmdBuffer)
309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.endCommandBuffer(cmdBuffer));
311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
31368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid queueSubmit (const DeviceInterface& vk, VkQueue queue, deUint32 cmdBufferCount, const VkCommandBuffer* pCmdBuffers, VkFence fence)
314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
31568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkSubmitInfo submitInfo =
31668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	{
31768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_SUBMIT_INFO,
31868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,
31968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,								// waitSemaphoreCount
32068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,	// pWaitSemaphores
32168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		cmdBufferCount,					// commandBufferCount
32268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCmdBuffers,
32368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,								// signalSemaphoreCount
32468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,	// pSignalSemaphores
32568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	};
32668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence));
327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid waitForFences (const DeviceInterface& vk, VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout)
330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.waitForFences(device, fenceCount, pFences, waitAll, timeout));
332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
334c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkImageAspectFlags getImageAspectFlags (VkFormat vkFormat)
335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat format = mapVkFormat(vkFormat);
337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (format.order)
341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::DS:
343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::D:
346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_DEPTH_BIT;
347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::S:
349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_STENCIL_BIT;
350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_COLOR_BIT;
353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
35668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryReadFlags (void)
357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
35868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_ACCESS_TRANSFER_READ_BIT
35968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_UNIFORM_READ_BIT
36068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_HOST_READ_BIT
36168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INDEX_READ_BIT
36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_SHADER_READ_BIT
36368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
36468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INDIRECT_COMMAND_READ_BIT
36568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
36668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
36768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
37068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryWriteFlags (void)
371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_ACCESS_TRANSFER_WRITE_BIT
37368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_HOST_WRITE_BIT
37468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_SHADER_WRITE_BIT
37568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
37668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
379c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkPipelineStageFlags getAllPipelineStageFlags (void)
380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
38168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_TRANSFER_BIT
383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentReference
397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					AttachmentReference		(deUint32		attachment,
400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout	layout)
401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_attachment	(attachment)
402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_layout		(layout)
403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32		getAttachment			(void) const { return m_attachment;	}
407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout	getImageLayout			(void) const { return m_layout;		}
408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32		m_attachment;
411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout	m_layout;
412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Subpass
415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										Subpass						(VkPipelineBindPoint				pipelineBindPoint,
418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 VkSubpassDescriptionFlags			flags,
419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	inputAttachments,
420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	colorAttachments,
421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	resolveAttachments,
422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 AttachmentReference				depthStencilAttachment,
423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	preserveAttachments)
424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_pipelineBindPoint		(pipelineBindPoint)
425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_flags					(flags)
426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_inputAttachments		(inputAttachments)
427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorAttachments		(colorAttachments)
428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_resolveAttachments		(resolveAttachments)
429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depthStencilAttachment	(depthStencilAttachment)
430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_preserveAttachments		(preserveAttachments)
431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineBindPoint					getPipelineBindPoint		(void) const { return m_pipelineBindPoint;		}
435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			getFlags					(void) const { return m_flags;					}
436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getInputAttachments			(void) const { return m_inputAttachments;		}
437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getColorAttachments			(void) const { return m_colorAttachments;		}
438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getResolveAttachments		(void) const { return m_resolveAttachments;		}
439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const AttachmentReference&			getDepthStencilAttachment	(void) const { return m_depthStencilAttachment;	}
440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getPreserveAttachments		(void) const { return m_preserveAttachments;	}
441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineBindPoint					m_pipelineBindPoint;
444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			m_flags;
445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_inputAttachments;
447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_colorAttachments;
448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_resolveAttachments;
449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	AttachmentReference					m_depthStencilAttachment;
450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_preserveAttachments;
452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassDependency
455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							SubpassDependency	(deUint32				srcPass,
458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 deUint32				dstPass,
459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VkPipelineStageFlags	srcStageMask,
461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VkPipelineStageFlags	dstStageMask,
462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
46368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkAccessFlags			outputMask,
46468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkAccessFlags			inputMask,
465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
46668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkDependencyFlags		flags)
467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_srcPass			(srcPass)
468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dstPass			(dstPass)
469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_srcStageMask	(srcStageMask)
471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dstStageMask	(dstStageMask)
472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_outputMask		(outputMask)
474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_inputMask		(inputMask)
47568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		, m_flags			(flags)
476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				getSrcPass			(void) const { return m_srcPass;		}
480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				getDstPass			(void) const { return m_dstPass;		}
481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	getSrcStageMask		(void) const { return m_srcStageMask;	}
483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	getDstStageMask		(void) const { return m_dstStageMask;	}
484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
48568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			getOutputMask		(void) const { return m_outputMask;		}
48668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			getInputMask		(void) const { return m_inputMask;		}
487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
48868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkDependencyFlags		getFlags			(void) const { return m_flags;		}
489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				m_srcPass;
492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				m_dstPass;
493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	m_srcStageMask;
495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	m_dstStageMask;
496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
49768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			m_outputMask;
49868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			m_inputMask;
49968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkDependencyFlags		m_flags;
500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Attachment
503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						Attachment			(VkFormat				format,
50668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkSampleCountFlagBits	samples,
507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentLoadOp		loadOp,
509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentStoreOp	storeOp,
510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentLoadOp		stencilLoadOp,
512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkAttachmentStoreOp	stencilStoreOp,
513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout			initialLayout,
515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout			finalLayout)
516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_format			(format)
517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_samples			(samples)
518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_loadOp			(loadOp)
520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_storeOp			(storeOp)
521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencilLoadOp	(stencilLoadOp)
523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencilStoreOp	(stencilStoreOp)
524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_initialLayout	(initialLayout)
526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_finalLayout		(finalLayout)
527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkFormat				getFormat			(void) const { return m_format;			}
53168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkSampleCountFlagBits	getSamples			(void) const { return m_samples;		}
532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		getLoadOp			(void) const { return m_loadOp;			}
53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		getStoreOp			(void) const { return m_storeOp;		}
535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
53768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		getStencilLoadOp	(void) const { return m_stencilLoadOp;	}
53868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		getStencilStoreOp	(void) const { return m_stencilStoreOp;	}
539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			getInitialLayout	(void) const { return m_initialLayout;	}
54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			getFinalLayout		(void) const { return m_finalLayout;	}
542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkFormat				m_format;
54568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkSampleCountFlagBits	m_samples;
546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		m_loadOp;
54868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		m_storeOp;
549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
55068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		m_stencilLoadOp;
55168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		m_stencilStoreOp;
552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
55368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			m_initialLayout;
55468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			m_finalLayout;
555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderPass
558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										RenderPass		(const vector<Attachment>&			attachments,
561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 const vector<Subpass>&				subpasses,
562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 const vector<SubpassDependency>&	dependencies)
563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_attachments		(attachments)
564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_subpasses		(subpasses)
565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dependencies	(dependencies)
566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Attachment>&			getAttachments	(void) const { return m_attachments;	}
570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&				getSubpasses	(void) const { return m_subpasses;		}
571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<SubpassDependency>&	getDependencies	(void) const { return m_dependencies;	}
572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Attachment>			m_attachments;
575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>				m_subpasses;
576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<SubpassDependency>		m_dependencies;
577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistruct TestConfig
580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum RenderTypes
582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_NONE	= 0,
584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_CLEAR	= (1<<1),
585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_DRAW	= (1<<2)
586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum CommandBufferTypes
589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COMMANDBUFFERTYPES_INLINE		= (1<<0),
591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COMMANDBUFFERTYPES_SECONDARY	= (1<<1)
592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum ImageMemory
595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		IMAGEMEMORY_STRICT		= (1<<0),
597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		IMAGEMEMORY_LAZY		= (1<<1)
598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	TestConfig (const RenderPass&	renderPass_,
601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				RenderTypes			renderTypes_,
602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				CommandBufferTypes	commandBufferTypes_,
603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				ImageMemory			imageMemory_,
604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2&		targetSize_,
605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2&		renderPos_,
606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2&		renderSize_,
607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				deUint32			seed_)
608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: renderPass			(renderPass_)
609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderTypes			(renderTypes_)
610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, commandBufferTypes	(commandBufferTypes_)
611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, imageMemory			(imageMemory_)
612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, targetSize			(targetSize_)
613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderPos				(renderPos_)
614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderSize			(renderSize_)
615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, seed					(seed_)
616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderPass			renderPass;
620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderTypes			renderTypes;
621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	CommandBufferTypes	commandBufferTypes;
622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	ImageMemory			imageMemory;
623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				targetSize;
624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				renderPos;
625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				renderSize;
626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			seed;
627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
629c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::RenderTypes operator| (TestConfig::RenderTypes a, TestConfig::RenderTypes b)
630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::RenderTypes)(((deUint32)a) | ((deUint32)b));
632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
634c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::CommandBufferTypes operator| (TestConfig::CommandBufferTypes a, TestConfig::CommandBufferTypes b)
635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::CommandBufferTypes)(((deUint32)a) | ((deUint32)b));
637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
639c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::ImageMemory operator| (TestConfig::ImageMemory a, TestConfig::ImageMemory b)
640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::ImageMemory)(((deUint32)a) | ((deUint32)b));
642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logRenderPassInfo (TestLog&			log,
645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const RenderPass&	renderPass)
646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::ScopedLogSection section (log, "RenderPass", "RenderPass");
648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	attachmentsSection	(log, "Attachments", "Attachments");
651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Attachment>&	attachments			= renderPass.getAttachments();
652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection	attachmentSection	(log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx));
656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&			attachment			= attachments[attachmentNdx];
657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Format: " << attachment.getFormat() << TestLog::EndMessage;
659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Samples: " << attachment.getSamples() << TestLog::EndMessage;
660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "LoadOp: " << attachment.getLoadOp() << TestLog::EndMessage;
662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StoreOp: " << attachment.getStoreOp() << TestLog::EndMessage;
663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StencilLoadOp: " << attachment.getStencilLoadOp() << TestLog::EndMessage;
665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StencilStoreOp: " << attachment.getStencilStoreOp() << TestLog::EndMessage;
666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "InitialLayout: " << attachment.getInitialLayout() << TestLog::EndMessage;
668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "FinalLayout: " << attachment.getFinalLayout() << TestLog::EndMessage;
669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	subpassesSection	(log, "Subpasses", "Subpasses");
674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Subpass>&		subpasses			= renderPass.getSubpasses();
675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection			subpassSection		(log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx));
679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&						subpass				= subpasses[subpassNdx];
680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	inputAttachments	= subpass.getInputAttachments();
682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	resolveAttachments	= subpass.getResolveAttachments();
684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	preserveAttachments	= subpass.getPreserveAttachments();
685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!inputAttachments.empty())
687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		inputAttachmentsSection	(log, "Inputs", "Inputs");
689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t inputNdx = 0; inputNdx < inputAttachments.size(); inputNdx++)
691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		inputAttachmentSection	(log, "Input" + de::toString(inputNdx), "Input " + de::toString(inputNdx));
693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		inputAttachment			= inputAttachments[inputNdx];
694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << inputAttachment.getAttachment() << TestLog::EndMessage;
696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << inputAttachment.getImageLayout() << TestLog::EndMessage;
697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		depthStencilAttachmentSection	(log, "DepthStencil", "DepthStencil");
703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const AttachmentReference&		depthStencilAttachment			= subpass.getDepthStencilAttachment();
704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				log << TestLog::Message << "Attachment: " << depthStencilAttachment.getAttachment() << TestLog::EndMessage;
706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				log << TestLog::Message << "Layout: " << depthStencilAttachment.getImageLayout() << TestLog::EndMessage;
707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!colorAttachments.empty())
710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		colorAttachmentsSection	(log, "Colors", "Colors");
712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t colorNdx = 0; colorNdx < colorAttachments.size(); colorNdx++)
714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		colorAttachmentSection	(log, "Color" + de::toString(colorNdx), "Color " + de::toString(colorNdx));
716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		colorAttachment			= colorAttachments[colorNdx];
717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << colorAttachment.getAttachment() << TestLog::EndMessage;
719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << colorAttachment.getImageLayout() << TestLog::EndMessage;
720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!resolveAttachments.empty())
724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		resolveAttachmentsSection	(log, "Resolves", "Resolves");
726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t resolveNdx = 0; resolveNdx < resolveAttachments.size(); resolveNdx++)
728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		resolveAttachmentSection	(log, "Resolve" + de::toString(resolveNdx), "Resolve " + de::toString(resolveNdx));
730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		resolveAttachment			= resolveAttachments[resolveNdx];
731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << resolveAttachment.getAttachment() << TestLog::EndMessage;
733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << resolveAttachment.getImageLayout() << TestLog::EndMessage;
734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!preserveAttachments.empty())
738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::ScopedLogSection		preserveAttachmentsSection	(log, "Preserves", "Preserves");
740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t preserveNdx = 0; preserveNdx < preserveAttachments.size(); preserveNdx++)
742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::ScopedLogSection		preserveAttachmentSection	(log, "Preserve" + de::toString(preserveNdx), "Preserve " + de::toString(preserveNdx));
744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const AttachmentReference&		preserveAttachment			= preserveAttachments[preserveNdx];
745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << preserveAttachment.getAttachment() << TestLog::EndMessage;
747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << preserveAttachment.getImageLayout() << TestLog::EndMessage;
748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!renderPass.getDependencies().empty())
755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	dependenciesSection	(log, "Dependencies", "Dependencies");
757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t depNdx = 0; depNdx < renderPass.getDependencies().size(); depNdx++)
759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection	dependencySection	(log, "Dependency" + de::toString(depNdx), "Dependency " + de::toString(depNdx));
761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const SubpassDependency&	dep					= renderPass.getDependencies()[depNdx];
762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Source: " << dep.getSrcPass() << TestLog::EndMessage;
764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Destination: " << dep.getDstPass() << TestLog::EndMessage;
765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Source Stage Mask: " << dep.getSrcStageMask() << TestLog::EndMessage;
767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Destination Stage Mask: " << dep.getDstStageMask() << TestLog::EndMessage;
768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Input Mask: " << dep.getInputMask() << TestLog::EndMessage;
770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Output Mask: " << dep.getOutputMask() << TestLog::EndMessage;
77168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			log << TestLog::Message << "Dependency Flags: " << getDependencyFlagsStr(dep.getFlags()) << TestLog::EndMessage;
772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearColorToString (VkFormat vkFormat, VkClearColorValue value)
777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	std::ostringstream				stream;
783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	stream << "(";
785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.int32[i];
796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.uint32[i];
809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.float32[i];
824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	stream << ")";
834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return stream.str();
836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearValueToString (VkFormat vkFormat, VkClearValue value)
839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat	format	= mapVkFormat(vkFormat);
841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order))
843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		std::ostringstream stream;
845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		stream << "(";
847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << "stencil: " << value.depthStencil.stencil;
850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order) && tcu::hasDepthComponent(format.order))
852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << ", ";
853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << "depth: " << value.depthStencil.depth;
856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		stream << ")";
858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return stream.str();
860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearColorToString(vkFormat, value.color);
863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
865c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearColorValue randomColorClearValue (const Attachment& attachment, de::Random& rng)
866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clearNan		= tcu::Float32::nan().asFloat();
868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(attachment.getFormat());
869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkClearColorValue				clearColor;
872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::IVec4 valueMin = tcu::getFormatMinIntValue(format);
878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::IVec4 valueMax = tcu::getFormatMaxIntValue(format);
879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.int32[ndx] = std::numeric_limits<deInt32>::min();
884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = rng.getInt(valueMin[ndx], valueMax[ndx]);
886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4 valueMax = tcu::getFormatMaxUintValue(format);
893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = std::numeric_limits<deUint32>::max();
898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = rng.getUint32() % valueMax[ndx];
900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormatInfo	formatInfo		= tcu::getTextureFormatInfo(format);
909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.float32[ndx] = clearNan;
914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.float32[ndx] = formatInfo.valueMin[ndx] + rng.getFloat() * (formatInfo.valueMax[ndx] - formatInfo.valueMin[ndx]);
916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return clearColor;
925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
927c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentDescription createAttachmentDescription (const Attachment& attachment)
928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentDescription attachmentDescription =
930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
93168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0,											// flags
932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
93368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getFormat(),						// format
93468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getSamples(),					// samples
935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
93668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getLoadOp(),						// loadOp
93768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getStoreOp(),					// storeOp
938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
93968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getStencilLoadOp(),				// stencilLoadOp
94068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getStencilStoreOp(),				// stencilStoreOp
941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
94268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getInitialLayout(),				// initialLayout
94368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		attachment.getFinalLayout(),				// finalLayout
944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return attachmentDescription;
947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
949c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentReference createAttachmentReference (const AttachmentReference& referenceInfo)
950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentReference reference =
952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		referenceInfo.getAttachment(),	// attachment;
954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		referenceInfo.getImageLayout()	// layout;
955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return reference;
958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
960c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDescription createSubpassDescription (const Subpass&					subpass,
961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											   vector<VkAttachmentReference>*	attachmentReferenceLists)
962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
96368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	inputAttachmentReferences			= attachmentReferenceLists[0];
96468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	colorAttachmentReferences			= attachmentReferenceLists[1];
96568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	resolveAttachmentReferences			= attachmentReferenceLists[2];
96668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	depthStencilAttachmentReferences	= attachmentReferenceLists[3];
96768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	preserveAttachmentReferences		= attachmentReferenceLists[4];
968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		colorAttachmentReferences.push_back(createAttachmentReference(subpass.getColorAttachments()[attachmentNdx]));
971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		inputAttachmentReferences.push_back(createAttachmentReference(subpass.getInputAttachments()[attachmentNdx]));
974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getResolveAttachments().size(); attachmentNdx++)
976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		resolveAttachmentReferences.push_back(createAttachmentReference(subpass.getResolveAttachments()[attachmentNdx]));
977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
97868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	depthStencilAttachmentReferences.push_back(createAttachmentReference(subpass.getDepthStencilAttachment()));
97968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getPreserveAttachments().size(); attachmentNdx++)
981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		preserveAttachmentReferences.push_back(createAttachmentReference(subpass.getPreserveAttachments()[attachmentNdx]));
982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size());
984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
98668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubpassDescription subpassDescription =
987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpass.getFlags(),																	// flags;
98968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			subpass.getPipelineBindPoint(),														// pipelineBindPoint;
990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			(deUint32)inputAttachmentReferences.size(),											// inputCount;
992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0],		// inputAttachments;
993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			(deUint32)colorAttachmentReferences.size(),											// colorCount;
995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			colorAttachmentReferences.empty() ? DE_NULL :  &colorAttachmentReferences[0],		// colorAttachments;
996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0],	// resolveAttachments;
997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
99868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			&depthStencilAttachmentReferences[0],												// pDepthStencilAttachment;
999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			(deUint32)preserveAttachmentReferences.size(),										// preserveCount;
1000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			preserveAttachmentReferences.empty() ? DE_NULL : &preserveAttachmentReferences[0]	// preserveAttachments;
1001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
1002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
100368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		return subpassDescription;
1004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1007c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDependency createSubpassDependency	(const SubpassDependency& dependencyInfo)
1008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkSubpassDependency dependency =
1010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getSrcPass(),			// srcSubpass;
1012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getDstPass(),			// destSubpass;
1013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getSrcStageMask(),		// srcStageMask;
1015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getDstStageMask(),		// destStageMask;
1016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getOutputMask(),			// outputMask;
1018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencyInfo.getInputMask(),			// inputMask;
1019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
102068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		dependencyInfo.getFlags()				// dependencyFlags;
1021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return dependency;
1024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1026c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkRenderPass> createRenderPass (const DeviceInterface&	vk,
1027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkDevice				device,
1028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 const RenderPass&		renderPassInfo)
1029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
103068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const size_t							perSubpassAttachmentReferenceLists = 5;
1031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkAttachmentDescription>			attachments;
1032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkSubpassDescription>			subpasses;
1033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkSubpassDependency>				dependencies;
1034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<vector<VkAttachmentReference> >	attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists);
1035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
1037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		attachments.push_back(createAttachmentDescription(renderPassInfo.getAttachments()[attachmentNdx]));
1038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
1040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		subpasses.push_back(createSubpassDescription(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists])));
1041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++)
1043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencies.push_back(createSubpassDependency(renderPassInfo.getDependencies()[depNdx]));
1044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
104668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkRenderPassCreateInfo	createInfo	=
104768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
104868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
104968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,
105068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkRenderPassCreateFlags)0u,
105168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)attachments.size(),
105268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(attachments.empty() ? DE_NULL : &attachments[0]),
105368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)subpasses.size(),
105468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(subpasses.empty() ? DE_NULL : &subpasses[0]),
105568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)dependencies.size(),
105668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(dependencies.empty() ? DE_NULL : &dependencies[0])
105768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
105868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
105968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		return createRenderPass(vk, device, &createInfo);
1060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1063c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFramebuffer> createFramebuffer (const DeviceInterface&		vk,
1064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   VkDevice						device,
1065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   VkRenderPass					renderPass,
1066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   const UVec2&					size,
1067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   const vector<VkImageView>&	attachments)
1068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
106968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createFramebuffer(vk, device, 0u, renderPass, (deUint32)attachments.size(), attachments.empty() ? DE_NULL : &attachments[0], size.x(), size.y(), 1u);
1070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1072c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImage> createAttachmentImage (const DeviceInterface&	vk,
1073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkDevice				device,
1074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 deUint32				queueIndex,
1075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 const UVec2&			size,
1076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkFormat				format,
107768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									 VkSampleCountFlagBits	samples,
1078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkImageUsageFlags		usageFlags,
1079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkImageLayout			layout)
1080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1081775c33feeee3a8a7cfe1a51447424d4160083fffscygan	const VkExtent3D size_					= { (deInt32)size.x(), (deInt32)size.y(), 1 };
1082775c33feeee3a8a7cfe1a51447424d4160083fffscygan	VkImageUsageFlags targetUsageFlags		= 0;
1083775c33feeee3a8a7cfe1a51447424d4160083fffscygan	const tcu::TextureFormat textureFormat	= mapVkFormat(format);
108494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos
10859cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan	if (tcu::hasDepthComponent(textureFormat.order) || tcu::hasStencilComponent(textureFormat.order))
1086775c33feeee3a8a7cfe1a51447424d4160083fffscygan	{
10879cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan		targetUsageFlags |= vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1088775c33feeee3a8a7cfe1a51447424d4160083fffscygan	}
108994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	else
1090775c33feeee3a8a7cfe1a51447424d4160083fffscygan	{
10919cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan		targetUsageFlags |= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
1092775c33feeee3a8a7cfe1a51447424d4160083fffscygan	}
10939cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan
109468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createImage(vk, device,
109568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   (VkImageCreateFlags)0,
109668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_IMAGE_TYPE_2D,
109768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   format,
109868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   size_,
109968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1u /* mipLevels */,
110068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1u /* arraySize */,
110168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   samples,
110268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_IMAGE_TILING_OPTIMAL,
110368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   usageFlags | targetUsageFlags,
110468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SHARING_MODE_EXCLUSIVE,
110568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1,
110668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   &queueIndex,
110768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   layout);
1108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<Allocation> createImageMemory (const DeviceInterface&	vk,
1111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   VkDevice					device,
1112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   Allocator&				allocator,
1113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   VkImage					image,
1114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   bool						lazy)
1115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation> allocation (allocator.allocate(getImageMemoryRequirements(vk, device, image), lazy ? MemoryRequirement::LazilyAllocated : MemoryRequirement::Any));
1117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bindImageMemory(vk, device, image, allocation->getMemory(), allocation->getOffset());
1118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return allocation;
1119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1121c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageAttachmentView (const DeviceInterface&	vk,
1122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkDevice				device,
1123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImage				image,
1124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkFormat				format,
1125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageAspectFlags		aspect)
1126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageSubresourceRange range =
1128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		aspect,
1130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1,
1132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1
1134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
113668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createImageView(vk, device, 0u, image, VK_IMAGE_VIEW_TYPE_2D, format, makeComponentMappingRGBA(), range);
1137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1139c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearValue randomClearValue (const Attachment& attachment, de::Random& rng)
1140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float					clearNan	= tcu::Float32::nan().asFloat();
1142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat	format		= mapVkFormat(attachment.getFormat());
1143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order))
1145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkClearValue clearValue;
1147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.depthStencil.depth	= clearNan;
1149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.depthStencil.stencil	= 255;
1150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
1152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValue.depthStencil.stencil	= rng.getInt(0, 255);
1153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
1155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValue.depthStencil.depth	= rng.getFloat();
1156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearValue;
1158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
1160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkClearValue clearValue;
1162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.color = randomColorClearValue(attachment, rng);
1164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearValue;
1166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentResources
1170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	AttachmentResources (const DeviceInterface&		vk,
1173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 VkDevice					device,
1174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 Allocator&					allocator,
1175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 deUint32					queueIndex,
1176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&				size,
1177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const Attachment&			attachmentInfo,
1178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 bool						lazy)
1179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_image			(createAttachmentImage(vk, device, queueIndex, size, attachmentInfo.getFormat(), attachmentInfo.getSamples(), lazy ? VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT : 0, VK_IMAGE_LAYOUT_UNDEFINED))
1180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_imageMemory		(createImageMemory(vk, device, allocator, *m_image, lazy))
1181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_attachmentView	(createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), getImageAspectFlags(attachmentInfo.getFormat())))
1182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!lazy)
1184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat());
1186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order))
1188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1189bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	depthFormat		= getDepthCopyFormat(attachmentInfo.getFormat());
1190bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	stencilFormat	= getStencilCopyFormat(attachmentInfo.getFormat());
1191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferSize			= size.x() * size.y() * depthFormat.getPixelSize();
1193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_secondaryBufferSize	= size.x() * size.y() * stencilFormat.getPixelSize();
1194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
119568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_buffer				= createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferMemory			= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible);
1197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset());
1199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
120068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_secondaryBuffer		= createBuffer(vk, device, 0, m_secondaryBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_secondaryBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_secondaryBuffer), MemoryRequirement::HostVisible);
1202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_secondaryBuffer, m_secondaryBufferMemory->getMemory(), m_secondaryBufferMemory->getOffset());
1204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
1206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferSize	= size.x() * size.y() * format.getPixelSize();
1208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
120968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_buffer		= createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible);
1211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset());
1213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	~AttachmentResources (void)
1218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageView getAttachmentView (void) const
1222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_attachmentView;
1224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImage getImage (void) const
1227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_image;
1229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkBuffer getBuffer (void) const
1232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_buffer != DE_NULL);
1234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_buffer;
1235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize getBufferSize (void) const
1238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_buffer != DE_NULL);
1240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_bufferSize;
1241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Allocation& getResultMemory (void) const
1244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(m_bufferMemory);
1246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_bufferMemory;
1247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkBuffer getSecondaryBuffer (void) const
1250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_secondaryBuffer != DE_NULL);
1252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_secondaryBuffer;
1253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize getSecondaryBufferSize (void) const
1256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_secondaryBuffer != DE_NULL);
1258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_secondaryBufferSize;
1259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Allocation& getSecondaryResultMemory (void) const
1262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(m_secondaryBufferMemory);
1264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_secondaryBufferMemory;
1265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Unique<VkImage>			m_image;
1269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UniquePtr<Allocation>		m_imageMemory;
1270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Unique<VkImageView>		m_attachmentView;
1271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>					m_buffer;
1273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize					m_bufferSize;
1274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>			m_bufferMemory;
1275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>					m_secondaryBuffer;
1277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize					m_secondaryBufferSize;
1278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>			m_secondaryBufferMemory;
1279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid uploadBufferData (const DeviceInterface&	vk,
1282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VkDevice					device,
1283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Allocation&		memory,
1284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   size_t					size,
1285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const void*				data)
1286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkMappedMemoryRange range =
1288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType;
1290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,								// pNext;
1291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		memory.getMemory(),						// mem;
1292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		memory.getOffset(),						// offset;
1293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(VkDeviceSize)size						// size;
1294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void* const ptr = memory.getHostPtr();
1296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deMemcpy(ptr, data, size);
1298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.flushMappedMemoryRanges(device, 1, &range));
1299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
130168e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkImageAspectFlagBits getPrimaryImageAspect (tcu::TextureFormat::ChannelOrder order)
1302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
1304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (order)
1306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::D:
1308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::DS:
130968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_DEPTH_BIT;
1310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::S:
131268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_STENCIL_BIT;
1313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
131568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_COLOR_BIT;
1316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderQuad
1320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderQuad (const Vec4& posA, const Vec4& posB)
1323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_vertices(6)
1324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[0] = posA;
1326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[1] = Vec4(posA[0], posB[1], posA[2], posA[3]);
1327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[2] = posB;
1328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[3] = posB;
1330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[4] = Vec4(posB[0], posA[1], posB[2], posA[3]);
1331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[5] = posA;
1332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4&		getCornerA			(void) const
1335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_vertices[0];
1337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4&		getCornerB			(void) const
1340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_vertices[2];
1342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const void*		getVertexPointer	(void) const
1345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return &m_vertices[0];
1347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	size_t			getVertexDataSize	(void) const
1350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return sizeof(Vec4) * m_vertices.size();
1352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Vec4>	m_vertices;
1356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass ColorClear
1359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	ColorClear	(const UVec2&				offset,
1362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				 const UVec2&				size,
1363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				 const VkClearColorValue&	color)
1364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_offset	(offset)
1365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_size	(size)
1366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_color	(color)
1367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&				getOffset		(void) const { return m_offset;		}
1371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&				getSize			(void) const { return m_size;		}
1372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkClearColorValue&	getColor		(void) const { return m_color;		}
1373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_offset;
1376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_size;
1377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkClearColorValue	m_color;
1378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass DepthStencilClear
1381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DepthStencilClear	(const UVec2&				offset,
1384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&				size,
1385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 float						depth,
1386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 deUint32					stencil)
1387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_offset	(offset)
1388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_size	(size)
1389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depth	(depth)
1390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencil	(stencil)
1391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&		getOffset		(void) const { return m_offset;		}
1395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&		getSize			(void) const { return m_size;		}
1396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	float				getDepth		(void) const { return m_depth;		}
1397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			getStencil		(void) const { return m_stencil;	}
1398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_offset;
1401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				m_size;
1402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	float				m_depth;
1404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			m_stencil;
1405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderInfo
1408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	SubpassRenderInfo	(const RenderPass&					renderPass,
1411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 deUint32							subpassIndex,
1412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 bool								isSecondary_,
1414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&						viewportOffset,
1416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&						viewportSize,
1417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const Maybe<RenderQuad>&			renderQuad,
1419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<ColorClear>&			colorClears,
1420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const Maybe<DepthStencilClear>&	depthStencilClear)
1421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_viewportOffset		(viewportOffset)
1422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_viewportSize		(viewportSize)
1423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_subpassIndex		(subpassIndex)
1424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_isSecondary			(isSecondary_)
1425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_flags				(renderPass.getSubpasses()[subpassIndex].getFlags())
1426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_renderQuad			(renderQuad)
1427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorClears			(colorClears)
1428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depthStencilClear	(depthStencilClear)
1429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorAttachments	(renderPass.getSubpasses()[subpassIndex].getColorAttachments())
1430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (deUint32 attachmentNdx = 0; attachmentNdx < (deUint32)m_colorAttachments.size(); attachmentNdx++)
1432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_colorAttachmentInfo.push_back(renderPass.getAttachments()[m_colorAttachments[attachmentNdx].getAttachment()]);
1433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
1435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_depthStencilAttachment		= tcu::just(renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment());
1437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_depthStencilAttachmentInfo	= tcu::just(renderPass.getAttachments()[renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment()]);
1438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&						getViewportOffset				(void) const { return m_viewportOffset;		}
1442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2&						getViewportSize					(void) const { return m_viewportSize;		}
1443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							getSubpassIndex					(void) const { return m_subpassIndex;		}
1445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool								isSecondary						(void) const { return m_isSecondary;		}
1446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Maybe<RenderQuad>&			getRenderQuad					(void) const { return m_renderQuad;			}
1448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<ColorClear>&			getColorClears					(void) const { return m_colorClears;		}
1449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Maybe<DepthStencilClear>&		getDepthStencilClear			(void) const { return m_depthStencilClear;	}
1450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							getColorAttachmentCount			(void) const { return (deUint32)m_colorAttachments.size(); }
1452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout						getColorAttachmentLayout		(deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getImageLayout(); }
1453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							getColorAttachmentIndex			(deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getAttachment(); }
1454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Attachment&					getColorAttachment				(deUint32 attachmentNdx) const { return m_colorAttachmentInfo[attachmentNdx]; }
1455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<VkImageLayout>				getDepthStencilAttachmentLayout	(void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getImageLayout()) : tcu::nothing<VkImageLayout>(); }
1456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<deUint32>						getDepthStencilAttachmentIndex	(void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getAttachment()) : tcu::nothing<deUint32>(); };
1457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Maybe<Attachment>&			getDepthStencilAttachment		(void) const { return m_depthStencilAttachmentInfo; }
1458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			getSubpassFlags					(void) const { return m_flags; }
1459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2								m_viewportOffset;
1461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2								m_viewportSize;
1462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32							m_subpassIndex;
1464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool								m_isSecondary;
1465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			m_flags;
1466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<RenderQuad>					m_renderQuad;
1468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<ColorClear>					m_colorClears;
1469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<DepthStencilClear>			m_depthStencilClear;
1470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_colorAttachments;
1472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Attachment>					m_colorAttachmentInfo;
1473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<AttachmentReference>			m_depthStencilAttachment;
1475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Maybe<Attachment>					m_depthStencilAttachmentInfo;
1476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1478c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkPipeline> createSubpassPipeline (const DeviceInterface&		vk,
1479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkDevice					device,
1480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkRenderPass				renderPass,
148168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos										VkShaderModule				vertexShaderModule,
148268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos										VkShaderModule				fragmentShaderModule,
1483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkPipelineLayout			pipelineLayout,
1484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										const SubpassRenderInfo&	renderInfo)
1485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkSpecializationInfo emptyShaderSpecializations =
1487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,			// mapEntryCount
1489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,	// pMap
1490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,			// dataSize
1491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,	// pData
1492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
149468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Maybe<VkSampleCountFlagBits>				rasterSamples;
1495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkPipelineColorBlendAttachmentState>	attachmentBlendStates;
1496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 attachmentNdx = 0; attachmentNdx < renderInfo.getColorAttachmentCount(); attachmentNdx++)
1498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment&			attachment		= renderInfo.getColorAttachment(attachmentNdx);
1500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples());
1502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		rasterSamples = attachment.getSamples();
1504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkPipelineColorBlendAttachmentState	attachmentBlendState =
1507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
150868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_FALSE,																								// blendEnable
150968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_SRC_ALPHA,																				// srcBlendColor
151068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,																	// destBlendColor
151168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_OP_ADD,																						// blendOpColor
151268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE,																					// srcBlendAlpha
151368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE,																					// destBlendAlpha
151468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_OP_ADD,																						// blendOpAlpha
151568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT,	// channelWriteMask
1516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentBlendStates.push_back(attachmentBlendState);
1519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (renderInfo.getDepthStencilAttachment())
1523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment& attachment = *renderInfo.getDepthStencilAttachment();
1525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples());
1527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		rasterSamples = attachment.getSamples();
1528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// If there are no attachment use single sample
1531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!rasterSamples)
153268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		rasterSamples = VK_SAMPLE_COUNT_1_BIT;
1533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineShaderStageCreateInfo shaderStages[2] =
1535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
1538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_NULL,												// pNext
153968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineShaderStageCreateFlags)0u,
154068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,								// stage
154168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vertexShaderModule,										// shader
154268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",
1543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&emptyShaderSpecializations
1544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},
1545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
1547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_NULL,												// pNext
154868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineShaderStageCreateFlags)0u,
154968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
155068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			fragmentShaderModule,									// shader
155168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",
1552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&emptyShaderSpecializations
1553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkVertexInputBindingDescription vertexBinding =
1556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// binding
1558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(deUint32)sizeof(tcu::Vec4),								// strideInBytes
155968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_VERTEX_INPUT_RATE_VERTEX,								// stepRate
1560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkVertexInputAttributeDescription vertexAttrib =
1562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// location
1564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// binding
1565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FORMAT_R32G32B32A32_SFLOAT,								// format
1566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// offsetInBytes
1567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineVertexInputStateCreateInfo vertexInputState =
1569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	//	sType
1571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,													//	pNext
157268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineVertexInputStateCreateFlags)0u,
1573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,															//	bindingCount
1574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexBinding,												//	pVertexBindingDescriptions
1575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,															//	attributeCount
1576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexAttrib,												//	pVertexAttributeDescriptions
1577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState =
1579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
1581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
158268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineInputAssemblyStateCreateFlags)0u,
1583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
1584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// primitiveRestartEnable
1585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkViewport viewport =
1587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(float)renderInfo.getViewportOffset().x(),	(float)renderInfo.getViewportOffset().y(),
1589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(float)renderInfo.getViewportSize().x(),	(float)renderInfo.getViewportSize().y(),
1590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f, 1.0f
1591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkRect2D scissor =
1593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ (deInt32)renderInfo.getViewportOffset().x(),	(deInt32)renderInfo.getViewportOffset().y() },
1595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ (deInt32)renderInfo.getViewportSize().x(),	(deInt32)renderInfo.getViewportSize().y() }
1596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineViewportStateCreateInfo viewportState =
1598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
160168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineViewportStateCreateFlags)0u,
1602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,
1603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&viewport,
1604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,
1605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&scissor
1606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
160768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkPipelineRasterizationStateCreateInfo rasterState =
1608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
160968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// sType
1610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
161168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineRasterizationStateCreateFlags)0u,
1612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,														// depthClipEnable
1613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// rasterizerDiscardEnable
161468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_POLYGON_MODE_FILL,											// fillMode
1615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_CULL_MODE_NONE,												// cullMode
161668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// frontFace
1617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// depthBiasEnable
1618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// depthBias
1619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// depthBiasClamp
1620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// slopeScaledDepthBias
1621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1.0f															// lineWidth
1622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineMultisampleStateCreateInfo multisampleState =
1624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// sType
1626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
162768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineMultisampleStateCreateFlags)0u,
1628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		*rasterSamples,													// rasterSamples
1629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// sampleShadingEnable
1630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// minSampleShading
163168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,														// pSampleMask
163268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,														// alphaToCoverageEnable
163368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,														// alphaToOneEnable
1634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineDepthStencilStateCreateInfo depthStencilState =
1636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
1638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,													// pNext
163968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineDepthStencilStateCreateFlags)0u,
1640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// depthTestEnable
1641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// depthWriteEnable
1642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
1643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,													// depthBoundsEnable
1644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// stencilTestEnable
1645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilFailOp
1647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilPassOp
1648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilDepthFailOp
1649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_COMPARE_OP_ALWAYS,									// stencilCompareOp
1650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilCompareMask
1651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilWriteMask
1652a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz			STENCIL_VALUE											// stencilReference
1653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},															// front
1654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilFailOp
1656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilPassOp
1657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilDepthFailOp
1658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_COMPARE_OP_ALWAYS,									// stencilCompareOp
1659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilCompareMask
1660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilWriteMask
1661a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz			STENCIL_VALUE											// stencilReference
1662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},															// back
1663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		-1.0f,														// minDepthBounds;
1665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1.0f														// maxDepthBounds;
1666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineColorBlendStateCreateInfo blendState =
1668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,			// sType
1670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,															// pNext
167168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineColorBlendStateCreateFlags)0u,
1672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,															// logicOpEnable
1673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_LOGIC_OP_COPY,													// logicOp
1674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(deUint32)attachmentBlendStates.size(),								// attachmentCount
1675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		attachmentBlendStates.empty() ? DE_NULL : &attachmentBlendStates[0],// pAttachments
1676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ 0.0f, 0.0f, 0.0f, 0.0f }											// blendConst
1677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineDynamicStateCreateInfo dynamicState =
1679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
1681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
168268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineDynamicStateCreateFlags)0u,
1683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL
1685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkGraphicsPipelineCreateInfo createInfo =
1687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,		// sType
1689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,												// pNext
169068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineCreateFlags)0u,
1691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		2,														// stageCount
1693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		shaderStages,											// pStages
1694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexInputState,										// pVertexInputState
1696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&inputAssemblyState,									// pInputAssemblyState
1697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,												// pTessellationState
1698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&viewportState,											// pViewportState
1699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&rasterState,											// pRasterState
1700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&multisampleState,										// pMultisampleState
1701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&depthStencilState,										// pDepthStencilState
1702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&blendState,											// pColorBlendState
1703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&dynamicState,											// pDynamicState
1704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pipelineLayout,											// layout
1705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderPass,												// renderPass
1707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderInfo.getSubpassIndex(),							// subpass
1708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,												// basePipelineHandle
1709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u														// basePipelineIndex
1710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return createGraphicsPipeline(vk, device, DE_NULL, &createInfo);
1713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderer
1716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
1718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	SubpassRenderer (Context&					context,
1719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 const DeviceInterface&		vk,
1720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 VkDevice					device,
1721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 Allocator&					allocator,
1722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 VkRenderPass				renderPass,
1723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 VkFramebuffer				framebuffer,
172468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					 VkCommandPool				commandBufferPool,
1725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 deUint32					queueFamilyIndex,
1726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					 const SubpassRenderInfo&	renderInfo)
1727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_renderInfo	(renderInfo)
1728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32 subpassIndex = renderInfo.getSubpassIndex();
1730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getRenderQuad())
1732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const RenderQuad&					renderQuad				= *renderInfo.getRenderQuad();
1734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkPipelineLayoutCreateInfo	pipelineLayoutParams	=
1735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,	// sType;
1737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,										// pNext;
173868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				(vk::VkPipelineLayoutCreateFlags)0,
1739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0u,												// descriptorSetCount;
1740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,										// pSetLayouts;
1741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0u,												// pushConstantRangeCount;
1742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,										// pPushConstantRanges;
1743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_vertexShaderModule	= createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-vert"), 0u);
1746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_fragmentShaderModule	= createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-frag"), 0u);
1747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_pipelineLayout		= createPipelineLayout(vk, device, &pipelineLayoutParams);
174868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_pipeline				= createSubpassPipeline(vk, device, renderPass, *m_vertexShaderModule, *m_fragmentShaderModule, *m_pipelineLayout, m_renderInfo);
1749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
175068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_vertexBuffer			= createBuffer(vk, device, 0u, (VkDeviceSize)renderQuad.getVertexDataSize(), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 1u, &queueFamilyIndex);
1751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_vertexBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_vertexBuffer), MemoryRequirement::HostVisible);
1752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bindBufferMemory(vk, device, *m_vertexBuffer, m_vertexBufferMemory->getMemory(), m_vertexBufferMemory->getOffset());
1754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			uploadBufferData(vk, device, *m_vertexBufferMemory, renderQuad.getVertexDataSize(), renderQuad.getVertexPointer());
1755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.isSecondary())
1758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
175968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_commandBuffer = allocateCommandBuffer(vk, device, commandBufferPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
176157b41652a8af472d28943d13924edc3a32ec3884scygan			beginCommandBuffer(vk, *m_commandBuffer, vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, renderPass, subpassIndex, framebuffer, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
1762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushRenderCommands(vk, *m_commandBuffer);
1763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *m_commandBuffer);
1764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool isSecondary (void) const
1768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_commandBuffer;
1770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
177268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkCommandBuffer getCommandBuffer (void) const
1773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(isSecondary());
1775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_commandBuffer;
1776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void pushRenderCommands (const DeviceInterface&		vk,
177968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkCommandBuffer			commandBuffer)
1780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!m_renderInfo.getColorClears().empty())
1782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<ColorClear>&	colorClears	(m_renderInfo.getColorClears());
1784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (deUint32 attachmentNdx = 0; attachmentNdx < m_renderInfo.getColorAttachmentCount(); attachmentNdx++)
1786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const ColorClear&		colorClear	= colorClears[attachmentNdx];
178868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkClearAttachment	attachment	=
1789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
179068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_ASPECT_COLOR_BIT,
179168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					attachmentNdx,
179268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					makeClearValue(colorClear.getColor()),
179368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				};
179468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkClearRect		rect		=
179568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{
179668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{
179768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						{ (deInt32)colorClear.getOffset().x(),	(deInt32)colorClear.getOffset().y()	},
179868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						{ (deInt32)colorClear.getSize().x(),	(deInt32)colorClear.getSize().y()	}
179968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					},					// rect
180068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0u,					// baseArrayLayer
180168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					1u,					// layerCount
1802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
1803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
180468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect);
1805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (m_renderInfo.getDepthStencilClear())
1809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const DepthStencilClear&		depthStencilClear	= *m_renderInfo.getDepthStencilClear();
181168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const deUint32					attachmentNdx		= m_renderInfo.getColorAttachmentCount();
18124c7a3aad422a9a456debcbf83f0af165c2471f5cscygan			tcu::TextureFormat				format				= mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat());
181368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkClearAttachment			attachment			=
1814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
18154c7a3aad422a9a456debcbf83f0af165c2471f5cscygan				(VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0)
18164c7a3aad422a9a456debcbf83f0af165c2471f5cscygan					| (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)),
181768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				attachmentNdx,
181868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				makeClearValueDepthStencil(depthStencilClear.getDepth(), depthStencilClear.getStencil())
1819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
182068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkClearRect				rect				=
1821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
182268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{
182368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{ (deInt32)depthStencilClear.getOffset().x(),	(deInt32)depthStencilClear.getOffset().y()	},
182468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{ (deInt32)depthStencilClear.getSize().x(),		(deInt32)depthStencilClear.getSize().y()	}
182568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				},							// rect
182668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,							// baseArrayLayer
182768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,							// layerCount
1828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
183068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect);
1831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (m_renderInfo.getRenderQuad())
1834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkDeviceSize	offset			= 0;
1836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBuffer		vertexBuffer	= *m_vertexBuffer;
1837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
1839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdBindVertexBuffers(commandBuffer, 0u, 1u, &vertexBuffer, &offset);
1840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u);
1841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const SubpassRenderInfo				m_renderInfo;
184668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Move<VkCommandBuffer>				m_commandBuffer;
1847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkPipeline>					m_pipeline;
1848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkPipelineLayout>				m_pipelineLayout;
1849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkShaderModule>				m_vertexShaderModule;
1851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkShaderModule>				m_fragmentShaderModule;
1853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>						m_vertexBuffer;
1855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>				m_vertexBufferMemory;
1856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushImageInitializationCommands (const DeviceInterface&								vk,
185968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									  VkCommandBuffer										commandBuffer,
1860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<Attachment>&								attachmentInfo,
1861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
1862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  deUint32												queueIndex,
1863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<Maybe<VkClearValue> >&					clearValues)
1864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	initializeLayouts;
1867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
1869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!clearValues[attachmentNdx])
1871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
1872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
1874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,								// sType;
1876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,															// pNext;
1877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
187868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),											// srcAccessMask
187968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),											// dstAccessMask
1880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_IMAGE_LAYOUT_UNDEFINED,											// oldLayout
188268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,								// newLayout;
1883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// srcQueueFamilyIndex;
1885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// destQueueFamilyIndex;
1886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getImage(),						// image;
1888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{																	// subresourceRange;
1889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),	// aspect;
1890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseMipLevel;
1891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1,																// mipLevels;
1892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseArraySlice;
1893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1																// arraySize;
1894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
1895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			initializeLayouts.push_back(barrier);
1898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!initializeLayouts.empty())
1901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<VkImageMemoryBarrier*> initializeLayoutPtrs;
1903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t ndx = 0; ndx < initializeLayouts.size(); ndx++)
1905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				initializeLayoutPtrs.push_back(&initializeLayouts[ndx]);
1906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdPipelineBarrier(commandBuffer, 0, 0, VK_FALSE, (deUint32)initializeLayouts.size(), (const void* const*)&initializeLayoutPtrs[0]);
1908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
1912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!clearValues[attachmentNdx])
1914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			continue;
1915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat format = mapVkFormat(attachmentInfo[attachmentNdx].getFormat());
1917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (hasStencilComponent(format.order) || hasDepthComponent(format.order))
1919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float						clearNan		= tcu::Float32::nan().asFloat();
1921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float						clearDepth		= hasDepthComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.depth : clearNan;
1922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32					clearStencil	= hasStencilComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.stencil : ~0u;
1923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkClearDepthStencilValue	depthStencil	=
1924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearDepth,
1926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearStencil
1927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageSubresourceRange range =
1929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1930d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz				(VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0)
1931d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz									 | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)),
1932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
1933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1,
1934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
1935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1
1936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
193868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearDepthStencilImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencil, 1, &range);
1939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
1941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageSubresourceRange	range		=
1943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
194468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_ASPECT_COLOR_BIT,				// aspectMask;
1945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,										// baseMipLevel;
1946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1,										// mipLevels;
194768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0,										// baseArrayLayer;
194868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1										// layerCount;
1949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkClearColorValue			clearColor	= clearValues[attachmentNdx]->color;
1951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
195268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearColorImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &range);
1953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	renderPassLayouts;
1958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
1960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
1962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,								// sType;
1964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,															// pNext;
1965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
196668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),											// srcAccessMask
196768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),											// dstAccessMask
1968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearValues[attachmentNdx] ?
197068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
1971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					: VK_IMAGE_LAYOUT_UNDEFINED,									// oldLayout
1972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentInfo[attachmentNdx].getInitialLayout(),					// newLayout;
1974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// srcQueueFamilyIndex;
1976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,															// destQueueFamilyIndex;
1977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getImage(),						// image;
1979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{																	// subresourceRange;
1980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),	// aspect;
1981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseMipLevel;
1982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1,																// mipLevels;
1983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,																// baseArraySlice;
1984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1																// arraySize;
1985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
1986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			renderPassLayouts.push_back(barrier);
1989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!renderPassLayouts.empty())
1992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<VkImageMemoryBarrier*> renderPassLayoutPtrs;
1994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t ndx = 0; ndx < renderPassLayouts.size(); ndx++)
1996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				renderPassLayoutPtrs.push_back(&renderPassLayouts[ndx]);
1997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdPipelineBarrier(commandBuffer, 0, 0, VK_FALSE, (deUint32)renderPassLayouts.size(), (const void* const*)&renderPassLayoutPtrs[0]);
1999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushRenderPassCommands (const DeviceInterface&								vk,
200468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkCommandBuffer									commandBuffer,
2005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 VkRenderPass										renderPass,
2006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 VkFramebuffer										framebuffer,
2007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const vector<de::SharedPtr<SubpassRenderer> >&		subpassRenderers,
2008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const UVec2&										renderPos,
2009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const UVec2&										renderSize,
2010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const vector<Maybe<VkClearValue> >&				renderPassClearValues,
2011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 TestConfig::RenderTypes							render)
2012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float				clearNan				= tcu::Float32::nan().asFloat();
2014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkClearValue>	attachmentClearValues;
2015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassClearValues.size(); attachmentNdx++)
2017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPassClearValues[attachmentNdx])
2019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentClearValues.push_back(*renderPassClearValues[attachmentNdx]);
2020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentClearValues.push_back(makeClearValueColorF32(clearNan, clearNan, clearNan, clearNan));
2022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkRect2D renderArea =
2026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{ (deInt32)renderPos.x(),	(deInt32)renderPos.y() },
2028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{ (deInt32)renderSize.x(),	(deInt32)renderSize.y() }
2029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
2030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpassRenderers.size(); subpassNdx++)
2032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
203368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkSubpassContents	contents = subpassRenderers[subpassNdx]->isSecondary() ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE;
2034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpassNdx == 0)
2036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				cmdBeginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, (deUint32)attachmentClearValues.size(), attachmentClearValues.empty() ? DE_NULL : &attachmentClearValues[0], contents);
2037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				vk.cmdNextSubpass(commandBuffer, contents);
2039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (render)
2041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
204268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				if (contents == VK_SUBPASS_CONTENTS_INLINE)
2043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpassRenderers[subpassNdx]->pushRenderCommands(vk, commandBuffer);
2045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
204668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				else if (contents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS)
2047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
204868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					const VkCommandBuffer cmd = subpassRenderers[subpassNdx]->getCommandBuffer();
2049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vk.cmdExecuteCommands(commandBuffer, 1, &cmd);
2050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
2052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_FATAL("Invalid contents");
2053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vk.cmdEndRenderPass(commandBuffer);
2057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushReadImagesToBuffers (const DeviceInterface&								vk,
206168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							  VkCommandBuffer										commandBuffer,
2062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  deUint32												queueIndex,
2063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
2065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<Attachment>&								attachmentInfo,
2066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<bool>&									isLazy,
2067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const UVec2&											targetSize)
2069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	imageBarriers;
2072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isLazy[attachmentNdx])
2076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
2079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// sType
2081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,											// pNext
2082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
208368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),							// srcAccessMask
208468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),							// dstAccessMask
2085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentInfo[attachmentNdx].getFinalLayout(),		// oldLayout
208768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,				// newLayout
2088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,											// srcQueueFamilyIndex
2090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,											// destQueueFamilyIndex
2091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getImage(),		// image
2093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{													// subresourceRange
2094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),	// aspect;
2095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,										// baseMipLevel
2096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1,										// mipLevels
2097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,										// baseArraySlice
2098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1										// arraySize
2099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			imageBarriers.push_back(barrier);
2103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!imageBarriers.empty())
2106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<VkImageMemoryBarrier*> clearLayoutPtrs;
2108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t ndx = 0; ndx < imageBarriers.size(); ndx++)
2110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearLayoutPtrs.push_back(&imageBarriers[ndx]);
2111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdPipelineBarrier(commandBuffer, getAllPipelineStageFlags(),
2113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 getAllPipelineStageFlags(),
2114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VK_FALSE, (deUint32)imageBarriers.size(), (const void* const*)&clearLayoutPtrs[0]);
2115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (isLazy[attachmentNdx])
2121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			continue;
2122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat::ChannelOrder	order	= mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order;
2124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkBufferImageCopy					rect	=
2125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferOffset
2127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferRowLength
2128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferImageHeight
2129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{							// imageSubresource
2130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				getPrimaryImageAspect(mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order),	// aspect
213194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos				0,						// mipLevel
2132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,						// arraySlice
2133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1						// arraySize
2134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			},
213594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			{ 0, 0, 0 },				// imageOffset
2136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{ (deInt32)targetSize.x(), (deInt32)targetSize.y(), 1 }		// imageExtent
2137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
2138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
213968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getBuffer(), 1, &rect);
2140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::TextureFormat::DS == order)
2142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBufferImageCopy stencilRect =
2144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0, // bufferOffset
2146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0, // bufferRowLength
2147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0, // bufferImageHeight
214868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{									// imageSubresource
214968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_ASPECT_STENCIL_BIT,	// aspect
215068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0,								// mipLevel
215168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0,								// arraySlice
2152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					1						// arraySize
2153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				},
215494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos				{ 0, 0, 0 },				// imageOffset
2155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{ (deInt32)targetSize.x(), (deInt32)targetSize.y(), 1 }		// imageExtent
2156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
215868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getSecondaryBuffer(), 1, &stencilRect);
2159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkBufferMemoryBarrier>	bufferBarriers;
2164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isLazy[attachmentNdx])
2168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat::ChannelOrder	order			= mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order;
2171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBufferMemoryBarrier				bufferBarrier	=
2172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,
2175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
217668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),
217768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),
2178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,
2180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,
2181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getBuffer(),
2183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
2184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getBufferSize()
2185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bufferBarriers.push_back(bufferBarrier);
2188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::TextureFormat::DS == order)
2190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkBufferMemoryBarrier secondaryBufferBarrier =
2192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_NULL,
2195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
219668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					getAllMemoryWriteFlags(),
219768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					getAllMemoryReadFlags(),
2198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					queueIndex,
2200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					queueIndex,
2201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getSecondaryBuffer(),
2203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,
2204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getSecondaryBufferSize()
2205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
2206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bufferBarriers.push_back(secondaryBufferBarrier);
2208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bufferBarriers.push_back(bufferBarrier);
2211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!bufferBarriers.empty())
2214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<VkBufferMemoryBarrier*> clearLayoutPtrs;
2216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t ndx = 0; ndx < bufferBarriers.size(); ndx++)
2218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearLayoutPtrs.push_back(&bufferBarriers[ndx]);
2219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdPipelineBarrier(commandBuffer, getAllPipelineStageFlags(),
2221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 getAllPipelineStageFlags(),
2222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VK_FALSE, (deUint32)bufferBarriers.size(), (const void* const*)&clearLayoutPtrs[0]);
2223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid clear (const PixelBufferAccess& access, const VkClearValue& value)
2228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat&	format	= access.getFormat();
2230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasDepthComponent(format.order) || tcu::hasStencilComponent(format.order))
2232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
2234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clearDepth(access, value.depthStencil.depth);
2235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
2237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clearStencil(access, value.depthStencil.stencil);
2238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
2240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT
2242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				|| tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT
2243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				|| tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT)
2244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::Vec4		color	(value.color.float32[0],
2246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.float32[1],
2247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.float32[2],
2248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.float32[3]);
2249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::isSRGB(format))
2251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::clear(access, tcu::linearToSRGB(color));
2252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::clear(access, color);
2254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
2256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::UVec4	color	(value.color.uint32[0],
2258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.uint32[1],
2259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.uint32[2],
2260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.uint32[3]);
2261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clear(access, color);
2263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
2265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::IVec4	color	(value.color.int32[0],
2267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.int32[1],
2268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.int32[2],
2269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 value.color.int32[3]);
2270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::clear(access, color);
2272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
2275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2278c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVec4 computeUvs (const IVec2& posA, const IVec2& posB, const IVec2& pos)
2279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float u = de::clamp((float)(pos.x() - posA.x()) / (float)(posB.x() - posA.x()), 0.0f, 1.0f);
2281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float v = de::clamp((float)(pos.y() - posA.y()) / (float)(posB.y() - posA.y()), 0.0f, 1.0f);
2282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return Vec4(u, v, u * v, (u + v) / 2.0f);
2284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid renderReferenceImages (vector<tcu::TextureLevel>&			referenceAttachments,
2287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const RenderPass&					renderPassInfo,
2288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						targetSize,
2289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<Maybe<VkClearValue> >&	imageClearValues,
2290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<Maybe<VkClearValue> >&	renderPassClearValues,
2291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<SubpassRenderInfo>&	subpassRenderInfo,
2292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						renderPos,
2293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						renderSize)
2294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&	subpasses		= renderPassInfo.getSubpasses();
2296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>			attachmentUsed	(renderPassInfo.getAttachments().size(), false);
2297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	referenceAttachments.resize(renderPassInfo.getAttachments().size());
2299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
2301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment				attachment					= renderPassInfo.getAttachments()[attachmentNdx];
2303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat		format						= mapVkFormat(attachment.getFormat());
2304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormatInfo	textureInfo					= tcu::getTextureFormatInfo(format);
2305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		tcu::TextureLevel&				reference					= referenceAttachments[attachmentNdx];
2306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool						isDepthOrStencilAttachment	= hasDepthComponent(format.order) || hasStencilComponent(format.order);
2307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		reference = tcu::TextureLevel(format, targetSize.x(), targetSize.y());
2309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (imageClearValues[attachmentNdx])
2311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clear(reference.getAccess(), *imageClearValues[attachmentNdx]);
2312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Fill with grid if image contentst are undefined before renderpass
2315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isDepthOrStencilAttachment)
2316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasDepthComponent(format.order))
2318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), 2, textureInfo.valueMin, textureInfo.valueMax);
2319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasStencilComponent(format.order))
2321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), 2, textureInfo.valueMin, textureInfo.valueMax);
2322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::fillWithGrid(reference.getAccess(), 2, textureInfo.valueMin, textureInfo.valueMax);
2325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
2329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&						subpass				= subpasses[subpassNdx];
2331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const SubpassRenderInfo&			renderInfo			= subpassRenderInfo[subpassNdx];
2332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
2333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Apply load op if attachment was used for the first time
2335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < colorAttachments.size(); attachmentNdx++)
2336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32 attachmentIndex = colorAttachments[attachmentNdx].getAttachment();
2338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!attachmentUsed[attachmentIndex])
2340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&	attachment	= renderPassInfo.getAttachments()[attachmentIndex];
2342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&	reference	= referenceAttachments[attachmentIndex];
2343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(!tcu::hasDepthComponent(reference.getFormat().order));
2345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(!tcu::hasStencilComponent(reference.getFormat().order));
2346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
2348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clear(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]);
2349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
2350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat());
2352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax);
2354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentUsed[attachmentIndex] = true;
2357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
236094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		// Apply load op to depth/stencil attachment if it was used for the first time
2361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED && !attachmentUsed[subpass.getDepthStencilAttachment().getAttachment()])
2362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment();
2364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Apply load op if attachment was used for the first time
2366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!attachmentUsed[attachmentIndex])
2367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&	attachment	= renderPassInfo.getAttachments()[attachmentIndex];
2369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&	reference		= referenceAttachments[attachmentIndex];
2370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasDepthComponent(reference.getFormat().order))
2372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
2374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]);
2375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
2376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat());
2378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2379c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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);
2380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (tcu::hasStencilComponent(reference.getFormat().order))
2384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
2386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]);
2387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
2388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat());
2390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2391c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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);
2392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentUsed[attachmentIndex] = true;
2397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t colorClearNdx = 0; colorClearNdx < renderInfo.getColorClears().size(); colorClearNdx++)
2400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const ColorClear&	colorClear	= renderInfo.getColorClears()[colorClearNdx];
2402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2			offset		= colorClear.getOffset();
2403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2			size		= colorClear.getSize();
2404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::TextureLevel&	reference	= referenceAttachments[subpass.getColorAttachments()[colorClearNdx].getAttachment()];
2405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VkClearValue		value;
2406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			value.color = colorClear.getColor();
2408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clear(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), value);
2410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getDepthStencilClear())
2413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const DepthStencilClear&	dsClear		= *renderInfo.getDepthStencilClear();
2415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2					offset		= dsClear.getOffset();
2416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec2					size		= dsClear.getSize();
2417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::TextureLevel&			reference	= referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()];
2418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(reference.getFormat().order))
2420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearDepth(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getDepth());
2421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasStencilComponent(reference.getFormat().order))
2423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearStencil(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getStencil());
2424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getRenderQuad())
2427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const RenderQuad&	renderQuad	= *renderInfo.getRenderQuad();
2429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4			posA		= renderQuad.getCornerA();
2430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4			posB		= renderQuad.getCornerB();
2431c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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);
2432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec2			p			= Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
2433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec2			posAI		((deInt32)(origin.x() + (p.x() * posA.x())),
2434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 (deInt32)(origin.y() + (p.y() * posA.y())));
2435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec2			posBI		((deInt32)(origin.x() + (p.x() * posB.x())),
2436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 (deInt32)(origin.y() + (p.y() * posB.y())));
2437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++)
2439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment				attachment			= renderPassInfo.getAttachments()[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()];
2441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::TextureFormatInfo	textureInfo			= tcu::getTextureFormatInfo(mapVkFormat(attachment.getFormat()));
2442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&				referenceTexture	= referenceAttachments[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()];
2443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const bool						srgb				= tcu::isSRGB(referenceTexture.getFormat());
2444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const PixelBufferAccess	reference			= referenceTexture.getAccess();
2445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMin			= (float)(-MAX_INTEGER_VALUE);
2446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMax			= (float)(MAX_INTEGER_VALUE);
2447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMax			(de::clamp(textureInfo.valueMax[0], clampMin, clampMax),
2448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMax[1], clampMin, clampMax),
2449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMax[2], clampMin, clampMax),
2450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMax[3], clampMin, clampMax));
2451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMin			(de::clamp(textureInfo.valueMin[0], clampMin, clampMax),
2453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMin[1], clampMin, clampMax),
2454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMin[2], clampMin, clampMax),
2455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 de::clamp(textureInfo.valueMin[3], clampMin, clampMax));
2456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.x() < posBI.x());
2458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.y() < posBI.y());
2459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int y = posAI.y(); y <= (int)posBI.y(); y++)
2461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int x = posAI.x(); x <= (int)posBI.x(); x++)
2462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	uvs		= computeUvs(posAI, posBI, IVec2(x, y));
2464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	color	= valueMax * uvs + valueMin * (Vec4(1.0f) - uvs);
2465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (srgb)
2467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixel(tcu::linearToSRGB(color), x, y);
2468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixel(color, x, y);
2470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
2474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				tcu::TextureLevel&				referenceTexture	= referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()];
2476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const PixelBufferAccess	reference			= referenceTexture.getAccess();
2477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.x() < posBI.x());
2479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.y() < posBI.y());
2480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int y = posAI.y(); y <= (int)posBI.y(); y++)
2482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (int x = posAI.x(); x <= (int)posBI.x(); x++)
2483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4 uvs = computeUvs(posAI, posBI, IVec2(x, y));
2485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::hasDepthComponent(reference.getFormat().order))
2487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixDepth(uvs.x(), x, y);
2488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::hasStencilComponent(reference.getFormat().order))
2490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						reference.setPixStencil(STENCIL_VALUE, x, y);
2491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Mark all attachments that were used but not stored as undefined
2497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
2498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment				attachment	= renderPassInfo.getAttachments()[attachmentNdx];
2500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat		format		= mapVkFormat(attachment.getFormat());
2501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormatInfo	textureInfo	= tcu::getTextureFormatInfo(format);
2502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		tcu::TextureLevel&				reference	= referenceAttachments[attachmentNdx];
2503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentUsed[attachmentNdx] && renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
2505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax);
2506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2509c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMaybe<deUint32> findColorAttachment (const Subpass&				subpass,
2510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 deUint32					attachmentIndex)
2511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpass.getColorAttachments().size(); colorAttachmentNdx++)
2513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (subpass.getColorAttachments()[colorAttachmentNdx].getAttachment() == attachmentIndex)
2515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::just((deUint32)colorAttachmentNdx);
2516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return tcu::nothing<deUint32>();
2519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviint calcFloatDiff (float a, float b)
2522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		au		= tcu::Float32(a).bits();
2524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		bu		= tcu::Float32(b).bits();
2525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool			asign	= (au & (0x1u << 31u)) != 0u;
2527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool			bsign	= (bu & (0x1u << 31u)) != 0u;
2528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		avalue	= (au & ((0x1u << 31u) - 1u));
2530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32		bvalue	= (bu & ((0x1u << 31u) - 1u));
2531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (asign != bsign)
2533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return avalue + bvalue + 1u;
2534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else if (avalue < bvalue)
2535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return bvalue - avalue;
2536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
2537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return avalue - bvalue;
2538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToDepthClearValue (const ConstPixelBufferAccess&	access,
2541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								x,
2542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								y,
2543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									float							ref)
2544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= tcu::getEffectiveDepthStencilTextureFormat(access.getFormat(), tcu::Sampler::MODE_DEPTH);
2546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
2547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
2549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const int	bitDepth	= tcu::getTextureFormatBitDepth(format).x();
2554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	depth		= access.getPixDepth(x, y);
2555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	threshold	= 2.0f / (float)((1 << bitDepth) - 1);
2556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return deFloatAbs(depth - ref) <= threshold;
2558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	depth			= access.getPixDepth(x, y);
2563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const int	mantissaBits	= tcu::getTextureFormatMantissaBitDepth(format).x();
2564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const int	threshold		= 10 * 1 << (23 - mantissaBits);
2565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_ASSERT(mantissaBits <= 23);
2567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return calcFloatDiff(depth, ref) <= threshold;
2569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
2572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Invalid channel class");
2573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return false;
2574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToStencilClearValue (const ConstPixelBufferAccess&	access,
2578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  int							x,
2579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  int							y,
2580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  deUint32						ref)
2581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32 stencil = access.getPixStencil(x, y);
2583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return stencil == ref;
2585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToColorClearValue (const ConstPixelBufferAccess&	access,
2588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								x,
2589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									int								y,
2590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									const VkClearColorValue&		ref)
2591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= access.getFormat();
2593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
2594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const BVec4						channelMask		= tcu::getTextureFormatChannelMask(format);
2595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
2597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	bitDepth	(tcu::getTextureFormatBitDepth(format));
2602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	resColor	(access.getPixel(x, y));
2603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	refColor	(ref.float32[0],
2604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.float32[1],
2605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.float32[2],
2606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.float32[3]);
2607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	threshold	(bitDepth[0] > 0 ? 20.0f / (float)((1 << bitDepth[0]) - 1) : 1.0f,
2608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 bitDepth[1] > 0 ? 20.0f / (float)((1 << bitDepth[1]) - 1) : 1.0f,
2609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 bitDepth[2] > 0 ? 20.0f / (float)((1 << bitDepth[2]) - 1) : 1.0f,
2610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 bitDepth[3] > 0 ? 20.0f / (float)((1 << bitDepth[3]) - 1) : 1.0f);
2611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::isSRGB(access.getFormat()))
2613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, tcu::linearToSRGB(refColor)), threshold), channelMask), channelMask));
2614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask));
2616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
2619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4	resColor	(access.getPixelUint(x, y));
2621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4	refColor	(ref.uint32[0],
2622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.uint32[1],
2623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.uint32[2],
2624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.uint32[3]);
2625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const UVec4	threshold	(1);
2626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask));
2628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
2631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	resColor	(access.getPixelInt(x, y));
2633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	refColor	(ref.int32[0],
2634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.int32[1],
2635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.int32[2],
2636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 ref.int32[3]);
2637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	threshold	(1);
2638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask));
2640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	resColor		(access.getPixel(x, y));
2645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	refColor		(ref.float32[0],
2646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 ref.float32[1],
2647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 ref.float32[2],
2648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 ref.float32[3]);
2649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	mantissaBits	(tcu::getTextureFormatMantissaBitDepth(format));
2650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const IVec4	threshold		(10 * IVec4(1) << (23 - mantissaBits));
2651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_ASSERT(tcu::allEqual(greaterThanEqual(threshold, IVec4(0)), BVec4(true)));
2653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
2655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (calcFloatDiff(resColor[ndx], refColor[ndx]) > threshold[ndx] && channelMask[ndx])
2657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					return false;
2658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return true;
2661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
2664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Invalid channel class");
2665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return false;
2666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass PixelStatus
2670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
2672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum Status
2673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_UNDEFINED	= 0,
2675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_OK			= 1,
2676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_FAIL			= 2,
2677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STATUS_LAST
2679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
2680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			PixelStatus			(Status color, Status depth, Status stencil)
2682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_status	((deUint8)(color << COLOR_OFFSET)
2683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					| (deUint8)((deUint8)depth << DEPTH_OFFSET)
2684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					| (deUint8)((deUint8)stencil << STENCIL_OFFSET))
2685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Status	getColorStatus		(void) const { return (Status)((m_status & COLOR_MASK) >> COLOR_OFFSET); }
2689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Status	getDepthStatus		(void) const { return (Status)((m_status & DEPTH_MASK) >> DEPTH_OFFSET); }
2690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Status	getStencilStatus	(void) const { return (Status)((m_status & STENCIL_MASK) >> STENCIL_OFFSET); }
2691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void	setColorStatus		(Status status)
2693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(getColorStatus() == STATUS_UNDEFINED);
2695682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos		m_status |= (deUint8)(status << COLOR_OFFSET);
2696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void	setDepthStatus		(Status status)
2699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(getDepthStatus() == STATUS_UNDEFINED);
2701682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos		m_status |= (deUint8)(status << DEPTH_OFFSET);
2702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void	setStencilStatus	(Status status)
2705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(getStencilStatus() == STATUS_UNDEFINED);
2707682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos		m_status |= (deUint8)(status << STENCIL_OFFSET);
2708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
2711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum
2712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COLOR_OFFSET	= 0,
2714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DEPTH_OFFSET	= 2,
2715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STENCIL_OFFSET	= 4,
2716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COLOR_MASK		= (3<<COLOR_OFFSET),
2718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DEPTH_MASK		= (3<<DEPTH_OFFSET),
2719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		STENCIL_MASK	= (3<<STENCIL_OFFSET),
2720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
2721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint8	m_status;
2722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
2723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthRenderQuad (const ConstPixelBufferAccess&	result,
2725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posA,
2726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posB,
2727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   vector<PixelStatus>&				status)
2728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = posA.y(); y <= posB.y(); y++)
2730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = posA.x(); x <= posB.x(); x++)
2731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED)
2735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	minUvs		= computeUvs(posA, posB, IVec2(x-1, y-1));
2737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec4	maxUvs		= computeUvs(posA, posB, IVec2(x+1, y+1));
2738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool	softCheck	= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float	resDepth	= result.getPixDepth(x, y);
2741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (resDepth >= minUvs.x() && resDepth <= maxUvs.x())
2743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
2744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (!softCheck)
2745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL);
2746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilRenderQuad (const ConstPixelBufferAccess&		result,
2751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const IVec2&						posA,
2752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 const IVec2&						posB,
2753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							 vector<PixelStatus>&				status)
2754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = posA.y(); y <= posB.y(); y++)
2756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = posA.x(); x <= posB.x(); x++)
2757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED)
2761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool	softCheck	= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (result.getPixStencil(x, y) == STENCIL_VALUE)
2766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
2767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (!softCheck)
2768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL);
2769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorRenderQuad (const ConstPixelBufferAccess&	result,
2774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posA,
2775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const IVec2&						posB,
2776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   vector<PixelStatus>&				status)
2777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat&		format				= result.getFormat();
2779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						srgb				= tcu::isSRGB(format);
2780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass		= tcu::getTextureChannelClass(format.type);
2781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormatInfo	textureInfo			= tcu::getTextureFormatInfo(format);
2782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clampMin			= (float)(-MAX_INTEGER_VALUE);
2783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clampMax			= (float)(MAX_INTEGER_VALUE);
2784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4						valueMax			(de::clamp(textureInfo.valueMax[0], clampMin, clampMax),
2785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMax[1], clampMin, clampMax),
2786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMax[2], clampMin, clampMax),
2787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMax[3], clampMin, clampMax));
2788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Vec4						valueMin			(de::clamp(textureInfo.valueMin[0], clampMin, clampMax),
2790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMin[1], clampMin, clampMax),
2791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMin[2], clampMin, clampMax),
2792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 de::clamp(textureInfo.valueMin[3], clampMin, clampMax));
2793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const BVec4						channelMask			= tcu::getTextureFormatChannelMask(format);
2794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2795d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz	IVec4						formatBitDepths = tcu::getTextureFormatBitDepth(format);
2796d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz	Vec4						threshold = Vec4(1.0f) / Vec4((float)(1 << formatBitDepths.x()),
2797d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz																(float)(1 << formatBitDepths.y()),
2798d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz																(float)(1 << formatBitDepths.z()),
2799d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz																(float)(1 << formatBitDepths.w()));
2800d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz
2801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
2802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
2804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
2805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
2806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int y = posA.y(); y <= posB.y(); y++)
2808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int x = posA.x(); x <= posB.x(); x++)
2809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minUvs		= computeUvs(posA, posB, IVec2(x-1, y-1));
2815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxUvs		= computeUvs(posA, posB, IVec2(x+1, y+1));
2816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool	softCheck	= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	resColor	(result.getPixel(x, y));
2820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minRefColor	= srgb ? tcu::linearToSRGB(valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs))
2822d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz													 : valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs) - threshold;
2823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxRefColor	= srgb ? tcu::linearToSRGB(valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs))
2824d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz													 : valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs) + threshold;
2825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[0] <= maxRefColor[0]);
2827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[1] <= maxRefColor[1]);
2828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[2] <= maxRefColor[2]);
2829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[3] <= maxRefColor[3]);
2830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::anyNotEqual(tcu::logicalAnd(
2832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											tcu::logicalAnd(greaterThanEqual(resColor, minRefColor),
2833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															lessThanEqual(resColor, maxRefColor)),
2834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											channelMask), channelMask))
2835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						if (!softCheck)
2837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
2845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
2848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int y = posA.y(); y <= posB.y(); y++)
2850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int x = posA.x(); x <= posB.x(); x++)
2851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minUvs			= computeUvs(posA, posB, IVec2(x-1, y-1));
2857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxUvs			= computeUvs(posA, posB, IVec2(x+1, y+1));
2858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool	softCheck		= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const UVec4	resColor		(result.getPixelUint(x, y));
2862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minRefColorF	= valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs);
2864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxRefColorF	= valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs);
2865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const UVec4	minRefColor		(minRefColorF.asUint());
2867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const UVec4	maxRefColor		(maxRefColorF.asUint());
2868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[0] <= maxRefColor[0]);
2870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[1] <= maxRefColor[1]);
2871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[2] <= maxRefColor[2]);
2872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[3] <= maxRefColor[3]);
2873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::anyNotEqual(tcu::logicalAnd(
2875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											tcu::logicalAnd(greaterThanEqual(resColor, minRefColor),
2876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															lessThanEqual(resColor, maxRefColor)),
2877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											channelMask), channelMask))
2878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						if (!softCheck)
2880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
2888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
2891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int y = posA.y(); y <= posB.y(); y++)
2893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int x = posA.x(); x <= posB.x(); x++)
2894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minUvs			= computeUvs(posA, posB, IVec2(x-1, y-1));
2900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxUvs			= computeUvs(posA, posB, IVec2(x+1, y+1));
2901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool	softCheck		= std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1
2902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												|| std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1;
2903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const IVec4	resColor		(result.getPixelInt(x, y));
2905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	minRefColorF	= valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs);
2907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const Vec4	maxRefColorF	= valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs);
2908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const IVec4	minRefColor		(minRefColorF.asInt());
2910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const IVec4	maxRefColor		(maxRefColorF.asInt());
2911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[0] <= maxRefColor[0]);
2913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[1] <= maxRefColor[1]);
2914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[2] <= maxRefColor[2]);
2915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_ASSERT(minRefColor[3] <= maxRefColor[3]);
2916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (tcu::anyNotEqual(tcu::logicalAnd(
2918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											tcu::logicalAnd(greaterThanEqual(resColor, minRefColor),
2919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															lessThanEqual(resColor, maxRefColor)),
2920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											channelMask), channelMask))
2921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
2922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						if (!softCheck)
2923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
2925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else
2926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
2931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
2934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Invalid channel class");
2935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorClear (const ConstPixelBufferAccess&	result,
2939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					offset,
2940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					size,
2941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  vector<PixelStatus>&			status,
2942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const VkClearColorValue&		color)
2943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(offset.x() + size.x() <= (deUint32)result.getWidth());
2945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(offset.y() + size.y() <= (deUint32)result.getHeight());
2946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(result.getWidth() * result.getHeight() == (int)status.size());
2948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++)
2950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++)
2951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus& pixelStatus = status[x + y * result.getWidth()];
2953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(x + y * result.getWidth() < (int)status.size());
2955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
2957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (comparePixelToColorClearValue(result, x, y, color))
2959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
2960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL);
2962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthClear (const ConstPixelBufferAccess&	result,
2967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					offset,
2968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const UVec2&					size,
2969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  vector<PixelStatus>&			status,
2970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  float							depth)
2971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++)
2973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++)
2974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus&	pixelStatus	= status[x + y * result.getWidth()];
2976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED)
2978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (comparePixelToDepthClearValue(result, x, y, depth))
2980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
2981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL);
2983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilClear (const ConstPixelBufferAccess&	result,
2988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const UVec2&					offset,
2989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const UVec2&					size,
2990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						vector<PixelStatus>&			status,
2991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						deUint32						stencil)
2992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++)
2994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++)
2995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		PixelStatus&	pixelStatus	= status[x + y * result.getWidth()];
2997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED)
2999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (comparePixelToStencilClearValue(result, x, y, stencil))
3001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
3002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL);
3004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool verifyAttachment (const ConstPixelBufferAccess&		result,
3009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Maybe<ConstPixelBufferAccess>&	secondaryResult,
3010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const RenderPass&					renderPassInfo,
3011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Maybe<VkClearValue>&			renderPassClearValue,
3012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Maybe<VkClearValue>&			imageClearValue,
3013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const vector<Subpass>&				subpasses,
3014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const vector<SubpassRenderInfo>&		subpassRenderInfo,
3015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const PixelBufferAccess&				errorImage,
3016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   deUint32								attachmentIndex,
3017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const UVec2&							renderPos,
3018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const UVec2&							renderSize)
3019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat&		format				= result.getFormat();
3021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						hasDepth			= tcu::hasDepthComponent(format.order);
3022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						hasStencil			= tcu::hasStencilComponent(format.order);
3023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const bool						isColorFormat		= !hasDepth && !hasStencil;
3024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const PixelStatus				initialStatus		(isColorFormat ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK,
3025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 hasDepth ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK,
3026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 hasStencil ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK);
3027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool							attachmentIsUsed	= false;
3029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<PixelStatus>				status				(result.getWidth() * result.getHeight(), initialStatus);
3030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	tcu::clear(errorImage, Vec4(0.0f, 1.0f, 0.0f, 1.0f));
3031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Check if attachment is used
3033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (int subpassNdx = 0; subpassNdx < (int)subpasses.size(); subpassNdx++)
3034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&			subpass			= subpasses[subpassNdx];
3036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Maybe<deUint32>	attachmentNdx	= findColorAttachment(subpass, attachmentIndex);
3037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex)
3039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentIsUsed = true;
3040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Set all pixels that have undefined values to OK
3043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							|| (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)))
3045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++)
3047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++)
3048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			PixelStatus& pixelStatus = status[x + y * result.getWidth()];
3050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
3053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
3057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
3060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Check renderpass rendering results
3065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE
3066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		|| (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE))
3067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Check subpass rendering results
3069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (int subpassNdx = (int)subpasses.size() - 1; subpassNdx >= 0; subpassNdx--)
3070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&				subpass			= subpasses[subpassNdx];
3072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const SubpassRenderInfo&	renderInfo		= subpassRenderInfo[subpassNdx];
3073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Maybe<deUint32>		attachmentNdx	= findColorAttachment(subpass, attachmentIndex);
3074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Check rendered quad
3076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (renderInfo.getRenderQuad() && (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex))
3077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderQuad&	renderQuad	= *renderInfo.getRenderQuad();
3079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4			posA		= renderQuad.getCornerA();
3080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4			posB		= renderQuad.getCornerB();
3081c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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);
3082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec2			p			= Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
3083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const IVec2			posAI		((deInt32)(origin.x() + (p.x() * posA.x())),
3084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 (deInt32)(origin.y() + (p.y() * posA.y())));
3085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const IVec2			posBI		((deInt32)(origin.x() + (p.x() * posB.x())),
3086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 (deInt32)(origin.y() + (p.y() * posB.y())));
3087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (isColorFormat)
3089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkColorRenderQuad(result, posAI, posBI, status);
3090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
3091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (hasDepth)
3093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						checkDepthRenderQuad(result, posAI, posBI, status);
3094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (hasDepth && hasStencil)
3096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						checkStencilRenderQuad(*secondaryResult, posAI, posBI, status);
3097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (hasStencil)
3098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						checkStencilRenderQuad(result, posAI, posBI, status);
3099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Check color attachment clears
3103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (attachmentNdx && !renderInfo.getColorClears().empty())
3104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const ColorClear& clear = renderInfo.getColorClears()[*attachmentNdx];
3106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkColorClear(result, clear.getOffset(), clear.getSize(), status, clear.getColor());
3108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Check depth/stencil attachment clears
3111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex && renderInfo.getDepthStencilClear())
3112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const DepthStencilClear clear = *renderInfo.getDepthStencilClear();
3114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth)
3116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkDepthClear(result, clear.getOffset(), clear.getSize(), status, clear.getDepth());
3117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && hasStencil)
3119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(*secondaryResult, clear.getOffset(), clear.getSize(), status, clear.getStencil());
3120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (hasStencil)
3121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(result, clear.getOffset(), clear.getSize(), status, clear.getStencil());
3122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Check renderpas clear results
3126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentIsUsed && renderPassClearValue)
3127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isColorFormat)
3129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkColorClear(result, renderPos, renderSize, status, renderPassClearValue->color);
3132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkDepthClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.depth);
3137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(*secondaryResult, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil);
3140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					checkStencilClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil);
3142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// Set all pixels that have undefined values fater renderpass to OK
3147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							|| (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)))
3149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++)
3151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++)
3152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			PixelStatus& pixelStatus = status[x + y * result.getWidth()];
3154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED
3156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				&& isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				pixelStatus.setColorStatus(PixelStatus::STATUS_OK);
3158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED
3161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					&& hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setDepthStatus(PixelStatus::STATUS_OK);
3163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED
3165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					&& hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
3166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					pixelStatus.setStencilStatus(PixelStatus::STATUS_OK);
3167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (imageClearValue)
3172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (isColorFormat)
3174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			checkColorClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->color);
3175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (hasDepth)
3178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkDepthClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.depth);
3179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (hasDepth && hasStencil)
3181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkStencilClear(*secondaryResult, UVec2(0, 0), UVec2(secondaryResult->getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil);
3182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (hasStencil)
3183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				checkStencilClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil);
3184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		bool isOk = true;
3189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int y = 0; y < result.getHeight(); y++)
3191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for(int x = 0; x < result.getWidth(); x++)
3192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const PixelStatus& pixelStatus = status[x + y * result.getWidth()];
3194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isColorFormat)
3196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (pixelStatus.getColorStatus() != PixelStatus::STATUS_OK)
3198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED)
3200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						errorImage.setPixel(Vec4(1.0f, 1.0f, 0.0f, 1.0f), x, y);
3201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (pixelStatus.getColorStatus() == PixelStatus::STATUS_FAIL)
3202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
3203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					isOk = false;
3205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasDepth && pixelStatus.getDepthStatus() != PixelStatus::STATUS_OK)
3210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
3212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					isOk = false;
3213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (hasStencil && pixelStatus.getStencilStatus() != PixelStatus::STATUS_OK)
3216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
3218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					isOk = false;
3219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return isOk;
3224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool logAndVerifyImages (TestLog&											log,
3228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const DeviceInterface&								vk,
3229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 VkDevice											device,
3230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
3231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<bool>&								attachmentIsLazy,
3232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const RenderPass&									renderPassInfo,
3233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<Maybe<VkClearValue> >&				renderPassClearValues,
3234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<Maybe<VkClearValue> >&				imageClearValues,
3235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<SubpassRenderInfo>&					subpassRenderInfo,
3236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&										targetSize,
3237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const TestConfig&									config)
3238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<tcu::TextureLevel>	referenceAttachments;
3240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool						isOk					= true;
3241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Reference images fill undefined pixels with grid pattern." << TestLog::EndMessage;
3243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderReferenceImages(referenceAttachments, renderPassInfo, targetSize, imageClearValues, renderPassClearValues, subpassRenderInfo, config.renderPos, config.renderSize);
3245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
3247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!attachmentIsLazy[attachmentNdx])
3249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment			attachment		= renderPassInfo.getAttachments()[attachmentNdx];
3251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
3252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order))
3254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3255bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	depthFormat		= getDepthCopyFormat(attachment.getFormat());
3256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			depthBufferSize	= targetSize.x() * targetSize.y() * depthFormat.getPixelSize();
3257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				void* const					depthPtr		= attachmentResources[attachmentNdx]->getResultMemory().getHostPtr();
3258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3259bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	stencilFormat		= getStencilCopyFormat(attachment.getFormat());
3260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			stencilBufferSize	= targetSize.x() * targetSize.y() * stencilFormat.getPixelSize();
3261a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz				void* const					stencilPtr			= attachmentResources[attachmentNdx]->getSecondaryResultMemory().getHostPtr();
3262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkMappedMemoryRange	ranges[] =
3264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,								// sType;
3267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						DE_NULL,															// pNext;
3268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getResultMemory().getMemory(),	// mem;
3269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getResultMemory().getOffset(),	// offset;
3270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						depthBufferSize														// size;
3271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					},
3272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,										// sType;
3274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						DE_NULL,																	// pNext;
3275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getSecondaryResultMemory().getMemory(),	// mem;
3276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getSecondaryResultMemory().getOffset(),	// offset;
3277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						stencilBufferSize															// size;
3278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_CHECK(vk.invalidateMappedMemoryRanges(device, 2u, ranges));
3281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3283bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz					const ConstPixelBufferAccess	depthAccess		(depthFormat, targetSize.x(), targetSize.y(), 1, depthPtr);
3284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const ConstPixelBufferAccess	stencilAccess	(stencilFormat, targetSize.x(), targetSize.y(), 1, stencilPtr);
3285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::TextureLevel				errorImage		(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
3286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Depth", "Attachment " + de::toString(attachmentNdx) + " Depth", depthAccess);
3288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Stencil", "Attachment " + de::toString(attachmentNdx) + " Stencil", stencilAccess);
3289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
3291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
3293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						&& !verifyAttachment(depthAccess, tcu::just(stencilAccess), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize))
3294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
3296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						isOk = false;
3297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			bufferSize	= targetSize.x() * targetSize.y() * format.getPixelSize();
3303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				void* const					ptr			= attachmentResources[attachmentNdx]->getResultMemory().getHostPtr();
3304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkMappedMemoryRange	range	=
3306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,								// sType;
3308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_NULL,															// pNext;
3309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getResultMemory().getMemory(),	// mem;
3310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getResultMemory().getOffset(),	// offset;
3311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					bufferSize															// size;
3312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_CHECK(vk.invalidateMappedMemoryRanges(device, 1u, &range));
3314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const ConstPixelBufferAccess	access		(format, targetSize.x(), targetSize.y(), 1, ptr);
3317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::TextureLevel				errorImage	(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
3318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access);
3320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
3321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
3323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						&& !verifyAttachment(access, tcu::nothing<ConstPixelBufferAccess>(), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize))
3324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
3326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						isOk = false;
3327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return isOk;
3334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string getAttachmentType (VkFormat vkFormat)
3337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
3339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
3340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
3342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
3344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "ivec4";
3345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
3347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "uvec4";
3348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
3350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
3351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
3352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "vec4";
3353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
3355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
3356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "";
3357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid createTestShaders (SourceCollections& dst, TestConfig config)
3361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (config.renderTypes & TestConfig::RENDERTYPES_DRAW)
3363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Subpass>&	subpasses	= config.renderPass.getSubpasses();
3365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
3367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&		subpass		= subpasses[subpassNdx];
3369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			std::ostringstream	vertexShader;
3370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			std::ostringstream	fragmentShader;
3371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vertexShader << "#version 310 es\n"
3373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "layout(location = 0) in highp vec4 a_position;\n"
3374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "layout(location = 0) out highp vec2 v_color;\n"
3375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "void main (void) {\n"
3376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\thighp float a = 0.5 + a_position.x;\n"
3377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\thighp float b = 0.5 + a_position.y;\n"
3378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\tv_color = vec2(a, b);\n"
3379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "\tgl_Position = a_position;\n"
3380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "}\n";
3381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader << "#version 310 es\n"
3383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   << "layout(location = 0) in highp vec2 v_color;\n";
3384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
3386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n";
3389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader	<< "void main (void) {\n"
3392c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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";
3393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
3395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::TextureFormat		format			= mapVkFormat(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const tcu::TextureFormatInfo	formatInfo		= tcu::getTextureFormatInfo(format);
3398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMin		= (float)(-MAX_INTEGER_VALUE);
3399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const float						clampMax		= (float)(MAX_INTEGER_VALUE);
3400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMax		(de::clamp(formatInfo.valueMax[0], clampMin, clampMax),
3401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMax[1], clampMin, clampMax),
3402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMax[2], clampMin, clampMax),
3403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMax[3], clampMin, clampMax));
3404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Vec4						valueMin		(de::clamp(formatInfo.valueMin[0], clampMin, clampMax),
3406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMin[1], clampMin, clampMax),
3407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMin[2], clampMin, clampMax),
3408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																 de::clamp(formatInfo.valueMin[3], clampMin, clampMax));
3409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const std::string				attachmentType	= getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(vec4" << valueMin << " + vec4" << (valueMax - valueMin)  << " * scale);\n";
3412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader << "}\n";
3415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			dst.glslSources.add(de::toString(subpassNdx) + "-vert") << glu::VertexSource(vertexShader.str());
3417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			dst.glslSources.add(de::toString(subpassNdx) + "-frag") << glu::FragmentSource(fragmentShader.str());
3418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeAttachmentIsLazy (vector<bool>& attachmentIsLazy, const vector<Attachment>& attachments, TestConfig::ImageMemory imageMemory)
3423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool lastAttachmentWasLazy = false;
3425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachments[attachmentNdx].getLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD
3429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStoreOp() != VK_ATTACHMENT_STORE_OP_STORE
3430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStencilLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD
3431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStencilStoreOp() != VK_ATTACHMENT_STORE_OP_STORE)
3432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (imageMemory == TestConfig::IMAGEMEMORY_LAZY || (imageMemory & TestConfig::IMAGEMEMORY_LAZY && !lastAttachmentWasLazy))
3434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentIsLazy.push_back(true);
3436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				lastAttachmentWasLazy = true;
3437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (imageMemory & TestConfig::IMAGEMEMORY_STRICT)
3439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentIsLazy.push_back(false);
3441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				lastAttachmentWasLazy = false;
3442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_FATAL("Unknown imageMemory");
3445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentIsLazy.push_back(false);
3448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassIsSecondary (vector<bool>& subpassIsSecondary, const vector<Subpass>& subpasses, TestConfig::CommandBufferTypes commandBuffer)
3452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool lastSubpassWasSecondary = false;
3454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
3456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary))
3458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpassIsSecondary.push_back(true);
3460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			lastSubpassWasSecondary = true;
3461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (commandBuffer & TestConfig::COMMANDBUFFERTYPES_INLINE)
3463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpassIsSecondary.push_back(false);
3465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			lastSubpassWasSecondary = false;
3466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown commandBuffer");
3469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeImageClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments, const vector<bool>& isLazy)
3473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!isLazy[attachmentNdx])
3477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng)));
3478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(nothing<VkClearValue>());
3480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeRenderPassClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments)
3484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachments[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR
3488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			|| attachments[attachmentNdx].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng)));
3491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(nothing<VkClearValue>());
3494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassClearValues (de::Random& rng, vector<vector<VkClearColorValue> >& clearValues, const RenderPass& renderPass)
3498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	clearValues.resize(renderPass.getSubpasses().size());
3500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++)
3502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&						subpass				= renderPass.getSubpasses()[subpassNdx];
3504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
3505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValues[subpassNdx].resize(colorAttachments.size());
3507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++)
3509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const AttachmentReference&	attachmentRef	= colorAttachments[attachmentRefNdx];
3511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&			attachment		= renderPass.getAttachments()[attachmentRef.getAttachment()];
3512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues[subpassNdx][attachmentRefNdx] = randomColorClearValue(attachment, rng);
3514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logSubpassRenderInfo (TestLog&					log,
3519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const SubpassRenderInfo&	info)
3520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Viewport, offset: " << info.getViewportOffset() << ", size: " << info.getViewportSize() << TestLog::EndMessage;
3522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.isSecondary())
3524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Subpass uses secondary command buffers" << TestLog::EndMessage;
3525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
3526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Subpass uses inlined commands" << TestLog::EndMessage;
3527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 attachmentNdx = 0; attachmentNdx < info.getColorClears().size(); attachmentNdx++)
3529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const ColorClear&	colorClear	= info.getColorClears()[attachmentNdx];
3531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Clearing color attachment " << attachmentNdx
3533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ". Offset: " << colorClear.getOffset()
3534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Size: " << colorClear.getSize()
3535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Color: " << clearColorToString(info.getColorAttachment(attachmentNdx).getFormat(), colorClear.getColor()) << TestLog::EndMessage;
3536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.getDepthStencilClear())
3539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const DepthStencilClear&	depthStencilClear	= *info.getDepthStencilClear();
3541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Clearing depth stencil attachment"
3543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ". Offset: " << depthStencilClear.getOffset()
3544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Size: " << depthStencilClear.getSize()
3545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Depth: " << depthStencilClear.getDepth()
3546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Stencil: " << depthStencilClear.getStencil() << TestLog::EndMessage;
3547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.getRenderQuad())
3550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderQuad&	renderQuad	= *info.getRenderQuad();
3552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Rendering gradient quad to " << renderQuad.getCornerA() << " -> " << renderQuad.getCornerB() << TestLog::EndMessage;
3554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logTestCaseInfo (TestLog&									log,
3558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const TestConfig&							config,
3559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<bool>&						attachmentIsLazy,
3560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<Maybe<VkClearValue> >&		imageClearValues,
3561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<Maybe<VkClearValue> >&		renderPassClearValues,
3562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					  const vector<SubpassRenderInfo>&			subpassRenderInfo)
3563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const RenderPass&	renderPass	= config.renderPass;
3565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	logRenderPassInfo(log, renderPass);
3567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(attachmentIsLazy.size() == renderPass.getAttachments().size());
3569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(imageClearValues.size() == renderPass.getAttachments().size());
3570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(renderPassClearValues.size() == renderPass.getAttachments().size());
3571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "TargetSize: " << config.targetSize << TestLog::EndMessage;
3573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Render area, Offset: " << config.renderPos << ", Size: " << config.renderSize << TestLog::EndMessage;
3574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentIsLazy.size(); attachmentNdx++)
3576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	section	(log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx));
3578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentIsLazy[attachmentNdx])
3580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Is lazy." << TestLog::EndMessage;
3581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (imageClearValues[attachmentNdx])
3583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Image is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *imageClearValues[attachmentNdx]) << " before rendering." << TestLog::EndMessage;
3584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPass.getAttachments()[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR && renderPassClearValues[attachmentNdx])
3586c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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;
3587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++)
3590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection section (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx));
3592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		logSubpassRenderInfo(log, subpassRenderInfo[subpassNdx]);
3594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassRenderInfo (vector<SubpassRenderInfo>& renderInfos, de::Random& rng, const RenderPass& renderPass, const TestConfig& config)
3598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes	commandBuffer			= config.commandBufferTypes;
3600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&					subpasses				= renderPass.getSubpasses();
3601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool									lastSubpassWasSecondary	= false;
3602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 subpassNdx = 0; subpassNdx < (deUint32)subpasses.size(); subpassNdx++)
3604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&				subpass				= subpasses[subpassNdx];
3606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool					subpassIsSecondary	= commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY
3607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														|| (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary) ? true : false;
3608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const UVec2					viewportSize		((config.renderSize * UVec2(2)) / UVec2(3));
3609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const UVec2					viewportOffset		(config.renderPos.x() + (subpassNdx % 2) * (config.renderSize.x() / 3),
3610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 config.renderPos.y() + ((subpassNdx / 2) % 2) * (config.renderSize.y() / 3));
3611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<ColorClear>			colorClears;
3613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Maybe<DepthStencilClear>	depthStencilClear;
3614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Maybe<RenderQuad>			renderQuad;
3615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		lastSubpassWasSecondary		= subpassIsSecondary;
3617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (config.renderTypes & TestConfig::RENDERTYPES_CLEAR)
3619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
3621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++)
3623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const AttachmentReference&	attachmentRef	= colorAttachments[attachmentRefNdx];
3625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&			attachment		= renderPass.getAttachments()[attachmentRef.getAttachment()];
3626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2					size			((viewportSize * UVec2(2)) / UVec2(3));
3627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2					offset			(viewportOffset.x() + ((deUint32)attachmentRefNdx % 2u) * (viewportSize.x() / 3u),
3628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															 viewportOffset.y() + (((deUint32)attachmentRefNdx / 2u) % 2u) * (viewportSize.y() / 3u));
3629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkClearColorValue		color			= randomColorClearValue(attachment, rng);
3630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				colorClears.push_back(ColorClear(offset, size, color));
3632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
3635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&	attachment		= renderPass.getAttachments()[subpass.getDepthStencilAttachment().getAttachment()];
3637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2			size			((viewportSize * UVec2(2)) / UVec2(3));
3638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2			offset			(viewportOffset.x() + ((deUint32)colorAttachments.size() % 2u) * (viewportSize.x() / 3u),
3639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi													 viewportOffset.y() + (((deUint32)colorAttachments.size() / 2u) % 2u) * (viewportSize.y() / 3u));
3640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkClearValue	value			= randomClearValue(attachment, rng);
3641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				depthStencilClear = tcu::just(DepthStencilClear(offset, size, value.depthStencil.depth, value.depthStencil.stencil));
3643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (config.renderTypes & TestConfig::RENDERTYPES_DRAW)
3647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			renderQuad = tcu::just(RenderQuad(tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f), tcu::Vec4(0.5f, 0.5f, 1.0f, 1.0f)));
3648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderInfos.push_back(SubpassRenderInfo(renderPass, subpassNdx, subpassIsSecondary, viewportOffset, viewportSize, renderQuad, colorClears, depthStencilClear));
3650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkTextureFormatSupport (TestLog&					log,
3654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								const InstanceInterface&	vk,
3655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								VkPhysicalDevice			device,
3656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								const vector<Attachment>&	attachments)
3657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool supported = true;
3659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment&			attachment					= attachments[attachmentNdx];
3663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat	format						= mapVkFormat(attachment.getFormat());
3664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool					isDepthOrStencilAttachment	= hasDepthComponent(format.order) || hasStencilComponent(format.order);
3665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkFormatFeatureFlags	flags						= isDepthOrStencilAttachment? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
3666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkFormatProperties			properties;
3667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
366868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.getPhysicalDeviceFormatProperties(device, attachment.getFormat(), &properties);
3669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if ((properties.optimalTilingFeatures & flags) != flags)
3671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			supported = false;
3673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Format: " << attachment.getFormat() << " not supported as " << (isDepthOrStencilAttachment ? "depth stencil attachment" : "color attachment") << TestLog::EndMessage;
3674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!supported)
3678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TCU_THROW(NotSupportedError, "Format not supported");
3679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestStatus renderPassTest (Context& context, TestConfig config)
3682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							targetSize			= config.targetSize;
3684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							renderPos			= config.renderPos;
3685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							renderSize			= config.renderSize;
3686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const RenderPass&					renderPassInfo		= config.renderPass;
3687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	TestLog&							log					= context.getTestContext().getLog();
3689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random							rng					(config.seed);
3690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>						attachmentIsLazy;
3692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Maybe<VkClearValue> >		imageClearValues;
3693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Maybe<VkClearValue> >		renderPassClearValues;
3694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>						subpassIsSecondary;
3696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<SubpassRenderInfo>			subpassRenderInfo;
3697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<vector<VkClearColorValue> >	subpassColorClearValues;
3698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeAttachmentIsLazy(attachmentIsLazy, renderPassInfo.getAttachments(), config.imageMemory);
3700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeImageClearValues(rng, imageClearValues, renderPassInfo.getAttachments(), attachmentIsLazy);
3701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeRenderPassClearValues(rng, renderPassClearValues, renderPassInfo.getAttachments());
3702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassIsSecondary(subpassIsSecondary, renderPassInfo.getSubpasses(), config.commandBufferTypes);
3704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassClearValues(rng, subpassColorClearValues, renderPassInfo);
3705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassRenderInfo(subpassRenderInfo, rng, renderPassInfo, config);
3706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	logTestCaseInfo(log, config, attachmentIsLazy, imageClearValues, renderPassClearValues, subpassRenderInfo);
3708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	checkTextureFormatSupport(log, context.getInstanceInterface(), context.getPhysicalDevice(), config.renderPass.getAttachments());
3710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkDevice								device								= context.getDevice();
3713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const DeviceInterface&						vk									= context.getDeviceInterface();
3714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkQueue								queue								= context.getUniversalQueue();
3715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32								queueIndex							= context.getUniversalQueueFamilyIndex();
3716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Allocator&									allocator							= context.getDefaultAllocator();
3717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Unique<VkRenderPass>					renderPass							(createRenderPass(vk, device, renderPassInfo));
371968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandPool>					commandBufferPool					(createCommandPool(vk, device, queueIndex, 0));
372068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				initializeImagesCommandBuffer		(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
372168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				renderCommandBuffer					(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
372268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				readImagesToBuffersCommandBuffer	(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
3723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<de::SharedPtr<AttachmentResources> >	attachmentResources;
3725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<de::SharedPtr<SubpassRenderer> >		subpassRenderers;
3726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageView>							attachmentViews;
3727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
3729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&	attachmentInfo	= renderPassInfo.getAttachments()[attachmentNdx];
3731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentResources.push_back(de::SharedPtr<AttachmentResources>(new AttachmentResources(vk, device, allocator, queueIndex, targetSize, attachmentInfo, attachmentIsLazy[attachmentNdx])));
3733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentViews.push_back(attachmentResources[attachmentNdx]->getAttachmentView());
3734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
373668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		beginCommandBuffer(vk, *initializeImagesCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
3737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pushImageInitializationCommands(vk, *initializeImagesCommandBuffer, renderPassInfo.getAttachments(), attachmentResources, queueIndex, imageClearValues);
3738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		endCommandBuffer(vk, *initializeImagesCommandBuffer);
3739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, *renderPass, targetSize, attachmentViews));
3742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
3744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				subpassRenderers.push_back(de::SharedPtr<SubpassRenderer>(new SubpassRenderer(context, vk, device, allocator, *renderPass, *framebuffer, *commandBufferPool, queueIndex, subpassRenderInfo[subpassNdx])));
3745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
374668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			beginCommandBuffer(vk, *renderCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
3747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushRenderPassCommands(vk, *renderCommandBuffer, *renderPass, *framebuffer, subpassRenderers, renderPos, renderSize, renderPassClearValues, config.renderTypes);
3748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *renderCommandBuffer);
3749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
375068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			beginCommandBuffer(vk, *readImagesToBuffersCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
3751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushReadImagesToBuffers(vk, *readImagesToBuffersCommandBuffer, queueIndex, attachmentResources, renderPassInfo.getAttachments(), attachmentIsLazy, targetSize);
3752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *readImagesToBuffersCommandBuffer);
3753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
375468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkCommandBuffer commandBuffers[] =
3755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*initializeImagesCommandBuffer,
3757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*renderCommandBuffer,
3758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*readImagesToBuffersCommandBuffer
3759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Unique<VkFence>	fence		(createFence(vk, device, 0u));
3761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueSubmit(vk, queue, DE_LENGTH_OF_ARRAY(commandBuffers), commandBuffers, *fence);
3763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				waitForFences(vk, device, 1, &fence.get(), VK_TRUE, ~0ull);
3764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (logAndVerifyImages(log, vk, device, attachmentResources, attachmentIsLazy, renderPassInfo, renderPassClearValues, imageClearValues, subpassRenderInfo, targetSize, config))
3768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::TestStatus::pass("Pass");
3769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::TestStatus::fail("Result verification failed");
3771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
377418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreColorFormats[] =
3775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
377668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_FORMAT_R5G6B5_UNORM_PACK16,
3777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_UNORM,
3778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_SNORM,
3779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_UINT,
3780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_SINT,
3781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_UNORM,
3782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_SNORM,
3783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_UINT,
3784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_SINT,
3785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_UNORM,
3786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SNORM,
3787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_UINT,
3788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SINT,
3789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SRGB,
379018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_UNORM_PACK32,
379118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SNORM_PACK32,
379218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_UINT_PACK32,
379318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SINT_PACK32,
379418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SRGB_PACK32,
379518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_B8G8R8A8_UNORM,
379618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_B8G8R8A8_SRGB,
379718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2R10G10B10_UNORM_PACK32,
379818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2B10G10R10_UNORM_PACK32,
379918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2B10G10R10_UINT_PACK32,
3800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_UNORM,
3801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SNORM,
3802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_UINT,
3803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SINT,
3804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SFLOAT,
3805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_UNORM,
3806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SNORM,
3807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_UINT,
3808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SINT,
3809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SFLOAT,
3810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_UNORM,
3811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SNORM,
3812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_UINT,
3813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SINT,
3814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SFLOAT,
3815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_UINT,
3816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_SINT,
3817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_SFLOAT,
3818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_UINT,
3819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_SINT,
3820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_SFLOAT,
3821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_UINT,
3822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_SINT,
3823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_SFLOAT
3824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
3825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
382618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreDepthStencilFormats[] =
3827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_D16_UNORM,
382918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
383068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_FORMAT_X8_D24_UNORM_PACK32,
3831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_D32_SFLOAT,
383218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
383318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_D24_UNORM_S8_UINT,
383418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_D32_SFLOAT_S8_UINT
3835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
3836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentTestCaseGroup (tcu::TestContext& testCtx)
3838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32 attachmentCounts[] = { 1, 3, 8 };
3840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentLoadOp loadOps[] =
3841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_LOAD,
3843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,
3844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE
3845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentStoreOp storeOps[] =
3848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,
3850775c33feeee3a8a7cfe1a51447424d4160083fffscygan		VK_ATTACHMENT_STORE_OP_DONT_CARE
3851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
385300d994858ab64bb5e1c6cb534bb049dcbb9269descygan	const VkImageLayout initialAndFinalColorLayouts[] =
3854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
3856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
385700d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
385800d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
385900d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
386000d994858ab64bb5e1c6cb534bb049dcbb9269descygan	};
386100d994858ab64bb5e1c6cb534bb049dcbb9269descygan
386200d994858ab64bb5e1c6cb534bb049dcbb9269descygan	const VkImageLayout initialAndFinalDepthStencilLayouts[] =
386300d994858ab64bb5e1c6cb534bb049dcbb9269descygan	{
386400d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_GENERAL,
3865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
3867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
386868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
386968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
3870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout subpassLayouts[] =
3873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
3875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout depthStencilLayouts[] =
3879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
3881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
3882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::RenderTypes renderCommands[] =
3885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_NONE,
3887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR,
3888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_DRAW,
3889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW,
3890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes commandBuffers[] =
3893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE,
3895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_SECONDARY,
3896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY
3897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::ImageMemory imageMemories[] =
3900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT,
3902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_LAZY,
3903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY
3904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSizes[] =
3907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(64, 64),
3909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(63, 65)
3910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPositions[] =
3913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(0, 0),
3915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(3, 17)
3916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSizes[] =
3919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(32, 32),
3921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(60, 47)
3922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
3923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random rng (1433774382u);
3925c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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"));
3926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentCountNdx = 0; attachmentCountNdx < DE_LENGTH_OF_ARRAY(attachmentCounts); attachmentCountNdx++)
3928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32					attachmentCount			= attachmentCounts[attachmentCountNdx];
3930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32					testCaseCount			= (attachmentCount == 1 ? 100 : 200);
3931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	attachmentCountGroup	(new tcu::TestCaseGroup(testCtx, de::toString(attachmentCount).c_str(), de::toString(attachmentCount).c_str()));
3932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++)
3934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool					useDepthStencil		= rng.getBool();
3936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VkImageLayout				depthStencilLayout	= VK_IMAGE_LAYOUT_GENERAL;
3937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Attachment>			attachments;
3938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<AttachmentReference>	colorAttachmentReferences;
3939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++)
3941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
394268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
394318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
3944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
3945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
3946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
394700d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
394800d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
3949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkImageLayout			subpassLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
3950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
3952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
3953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
3955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
3956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (useDepthStencil)
3959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
396018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkSampleCountFlagBits	sampleCount			= VK_SAMPLE_COUNT_1_BIT;
396118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format				= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats));
3962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp				= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
3963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp				= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
3964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
396500d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			initialLayout		= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts));
396600d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			finalizeLayout		= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts));
3967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp		= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
3969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp		= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
3970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				depthStencilLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(depthStencilLayouts), DE_ARRAY_END(depthStencilLayouts));
3972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
3973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
3977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
3978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
3979c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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>()));
3980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const vector<SubpassDependency>			deps;
3981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const string							testCaseName	= de::toString(attachmentCountNdx * testCaseCount + testCaseNdx);
3983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass						renderPass		(attachments, subpasses, deps);
3984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
3985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
3986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
3987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(attachmentCountGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 1293809));
3989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(attachmentCountGroup.release());
3993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
3996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentAllocationTestGroup (tcu::TestContext& testCtx)
3999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32 attachmentCounts[] = { 4, 8 };
4001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentLoadOp loadOps[] =
4002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_LOAD,
4004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,
4005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE
4006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentStoreOp storeOps[] =
4009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,
4011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_DONT_CARE
4012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout initialAndFinalLayouts[] =
4015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
4020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
402168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
402268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
4023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout subpassLayouts[] =
4026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum AllocationType
4032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass uses one more attachmen than previous one
4034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW,
4035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass uses one less attachment than previous one
4036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_SHRINK,
4037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass drops one attachment and picks up new one
4038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_ROLL,
4039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Start by growing and end by shrinking
4040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW_SHRINK
4041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const AllocationType allocationTypes[] =
4044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW,
4046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_SHRINK,
4047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_ROLL,
4048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW_SHRINK
4049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const char* const allocationTypeStr[] =
4052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"grow",
4054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"shrink",
4055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"roll",
4056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"grow_shrink"
4057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::RenderTypes renderCommands[] =
4060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_NONE,
4062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR,
4063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_DRAW,
4064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW,
4065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes commandBuffers[] =
4068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE,
4070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_SECONDARY,
4071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY
4072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::ImageMemory imageMemories[] =
4075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT,
4077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_LAZY,
4078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY
4079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSizes[] =
4082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(64, 64),
4084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(63, 65)
4085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPositions[] =
4088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(0, 0),
4090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(3, 17)
4091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSizes[] =
4094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(32, 32),
4096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(60, 47)
4097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "attachment_allocation", "Attachment allocation tests"));
4100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random						rng		(3700649827u);
4101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t allocationTypeNdx = 0; allocationTypeNdx < DE_LENGTH_OF_ARRAY(allocationTypes); allocationTypeNdx++)
4103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const AllocationType			allocationType		= allocationTypes[allocationTypeNdx];
4105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const size_t					testCaseCount		= 100;
4106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	allocationTypeGroup	(new tcu::TestCaseGroup(testCtx, allocationTypeStr[allocationTypeNdx], allocationTypeStr[allocationTypeNdx]));
4107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++)
4109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32		attachmentCount	= rng.choose<deUint32>(DE_ARRAY_BEGIN(attachmentCounts), DE_ARRAY_END(attachmentCounts));
4111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Attachment>	attachments;
4112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Subpass>		subpasses;
4113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++)
4115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
411668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
411718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
4118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalLayouts), DE_ARRAY_END(initialAndFinalLayouts));
4122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalLayouts), DE_ARRAY_END(initialAndFinalLayouts));
4123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (allocationType == ALLOCATIONTYPE_GROW)
4131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++)
4137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4143c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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>()));
4144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (allocationType == ALLOCATIONTYPE_SHRINK)
4147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
4153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4159c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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>()));
4160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (allocationType == ALLOCATIONTYPE_ROLL)
4163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount / 2; subpassNdx++)
4165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount / 2; attachmentNdx++)
4169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)(subpassNdx + attachmentNdx), subpassLayout));
4173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4175c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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>()));
4176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (allocationType == ALLOCATIONTYPE_GROW_SHRINK)
4179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++)
4185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4191c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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>()));
4192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vector<AttachmentReference>	colorAttachmentReferences;
4197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
4199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
4200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4205c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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>()));
4206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
4209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_FATAL("Unknown allocation type");
4210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
4213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
4214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
4215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const string							testCaseName	= de::toString(testCaseNdx);
4217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
4218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
4219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
4220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				vector<SubpassDependency>				deps;
4222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4223433aad756646dacd9b9bdd863fda3578977e254escygan				for (size_t subpassNdx = 0; subpassNdx < subpasses.size() - 1; subpassNdx++)
4224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const bool byRegion				= rng.getBool();
4226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					deps.push_back(SubpassDependency((deUint32)subpassNdx, (deUint32)subpassNdx + 1,
4227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi													 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
4228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
4229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
4230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
4231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi													 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
4233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
4234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
4235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
4236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
423768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
423868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos													 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, // \todo [pyry] Correct?
4239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4240682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos													 byRegion ? (VkBool32)VK_TRUE : (VkBool32)VK_FALSE));
4241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass					renderPass		(attachments, subpasses, deps);
4244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329));
4246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(allocationTypeGroup.release());
4250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createSimpleTestGroup (tcu::TestContext& testCtx)
4256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2						targetSize	(64, 64);
4258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2						renderPos	(0, 0);
4259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2						renderSize	(64, 64);
4260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	group		(new tcu::TestCaseGroup(testCtx, "simple", "Simple basic render pass tests"));
4261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color
4263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_R8G8B8A8_UNORM,
426568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
4278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4281c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// depth
4285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
428668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_X8_D24_UNORM_PACK32,
428768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
4294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4303c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// stencil
4307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_S8_UINT,
430968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
4316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4325c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// depth_stencil
4329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_D24_UNORM_S8_UINT,
433168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
4332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
4335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
4336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
4338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4347c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_depth
4351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
4353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
435568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
436268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			Attachment(VK_FORMAT_X8_D24_UNORM_PACK32,
436368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
4371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
4373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4382c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_stencil
4386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
4388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
439068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
4397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_S8_UINT,
439868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
4406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
4408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
4410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>())),
4415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
4416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4418c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_depth_stencil
4422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
4424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
442668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
4431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
4433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_D24_UNORM_S8_UINT,
443468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
4435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
4438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
4439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
4441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
4442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
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>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
4449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, 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(), "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));
4454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string formatToName (VkFormat format)
4460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const std::string	formatStr	= de::toString(format);
4462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const std::string	prefix		= "VK_FORMAT_";
4463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(formatStr.substr(0, prefix.length()) == prefix);
4465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return de::toLower(formatStr.substr(prefix.length()));
4467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createFormatTestGroup(tcu::TestContext& testCtx)
4470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "formats", "Tests for different image formats."));
4472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSize	(64, 64);
4474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPos	(0, 0);
4475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSize	(64, 64);
4476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const struct
4478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const char* const			str;
4480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkAttachmentLoadOp	op;
4481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	} loadOps[] =
4482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear",		VK_ATTACHMENT_LOAD_OP_CLEAR		},
4484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "load",		VK_ATTACHMENT_LOAD_OP_LOAD		},
4485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "dont_care",	VK_ATTACHMENT_LOAD_OP_DONT_CARE	}
4486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const struct
4489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		 const char* const				str;
4491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		 const TestConfig::RenderTypes	types;
4492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	} renderTypes[] =
4493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear",		TestConfig::RENDERTYPES_CLEAR								},
4495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "draw",		TestConfig::RENDERTYPES_DRAW								},
4496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear_draw",	TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW	}
4497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
449918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	// Color formats
450018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreColorFormats); formatNdx++)
4501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
450218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		const VkFormat					format		= s_coreColorFormats[formatNdx];
4503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str()));
4504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
4506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkAttachmentLoadOp		loadOp	= loadOps[loadOpNdx].op;
4508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
4509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
4511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass	renderPass	(vector<Attachment>(1, Attachment(format,
451368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																				  VK_SAMPLE_COUNT_1_BIT,
4514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  loadOp,
4515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_STORE_OP_STORE,
4516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_STORE_OP_DONT_CARE,
4518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
4521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			0u,
4522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(),
4523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
4524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(),
4525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
4526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>())),
4527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 vector<SubpassDependency>());
452818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
452918cca0001c3ce503dcc339c839ed85be639e11e5Mika 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));
453018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			}
453118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
453218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			formatGroup->addChild(loadOpGroup.release());
453318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		}
453418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
453518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		group->addChild(formatGroup.release());
453618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	}
453718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
453818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	// Depth stencil formats
453918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreDepthStencilFormats); formatNdx++)
454018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	{
454118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		const VkFormat					format		= s_coreDepthStencilFormats[formatNdx];
454218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str()));
454318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
454418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
454518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		{
454618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			const VkAttachmentLoadOp		loadOp	= loadOps[loadOpNdx].op;
454718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
454818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
454918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
455018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			{
455118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const RenderPass	renderPass	(vector<Attachment>(1, Attachment(format,
455218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_SAMPLE_COUNT_1_BIT,
455318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
455418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_ATTACHMENT_STORE_OP_DONT_CARE,
455518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  loadOp,
455618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_ATTACHMENT_STORE_OP_STORE,
455718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
455818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
455918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi												 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
456018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			0u,
456118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
456218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
456318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
456418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
456518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>())),
456618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi												 vector<SubpassDependency>());
4567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4568c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
4569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			formatGroup->addChild(loadOpGroup.release());
4572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(formatGroup.release());
4575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return group;
4578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // anonymous
4581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestCaseGroup* createRenderPassTests (tcu::TestContext& testCtx)
4583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	renderpassTests	(new tcu::TestCaseGroup(testCtx, "renderpass", "RenderPass Tests"));
4585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createSimpleTestGroup(testCtx).release());
4587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createFormatTestGroup(testCtx).release());
4588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createAttachmentTestCaseGroup(testCtx).release());
4589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	renderpassTests->addChild(createAttachmentAllocationTestGroup(testCtx).release());
4590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return renderpassTests.release();
4592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // vkt
4595