1c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi/*-------------------------------------------------------------------------
2c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Vulkan Conformance Tests
3c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * ------------------------
4c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
5c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Copyright (c) 2015 Google Inc.
6c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
10c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
12c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
18c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *
19c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*!
20c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \file
21c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \brief RenderPass tests
22c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*--------------------------------------------------------------------*/
23c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
24c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktRenderPassTests.hpp"
25c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
26c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktTestCaseUtil.hpp"
2758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "vktTestGroupUtil.hpp"
28c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
29c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDefs.hpp"
30c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDeviceUtil.hpp"
31c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkImageUtil.hpp"
32c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkMemUtil.hpp"
33c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPlatform.hpp"
34c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPrograms.hpp"
35c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkQueryUtil.hpp"
36c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRef.hpp"
37c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRefUtil.hpp"
38c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkStrUtil.hpp"
39c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkTypeUtil.hpp"
40c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
41c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFloat.hpp"
4258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuFormatUtil.hpp"
43c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuMaybe.hpp"
4458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuResultCollector.hpp"
4558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuTestLog.hpp"
4658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuTextureUtil.hpp"
47c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuVectorUtil.hpp"
48c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "deRandom.hpp"
5058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "deSTLUtil.hpp"
51c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSharedPtr.hpp"
52c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deStringUtil.hpp"
5358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "deUniquePtr.hpp"
54c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
55c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include <limits>
5658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include <set>
5758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include <string>
5858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include <vector>
59c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
60c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing namespace vk;
61c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
6258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::BVec4;
63c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec2;
64c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec4;
6558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::UVec2;
66c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec4;
6758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::Vec2;
68c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec4;
6958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
7058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::Maybe;
7158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::just;
7258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::nothing;
7358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
74c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::ConstPixelBufferAccess;
75c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::PixelBufferAccess;
76c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
7758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::TestLog;
7858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
79c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing de::UniquePtr;
80c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
8158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing std::pair;
8258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing std::set;
83c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::string;
8458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing std::vector;
85c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
86c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace vkt
87c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
88c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace
89c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
9058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvienum BoolOp
91c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
9258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	BOOLOP_AND,
9358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	BOOLOP_OR,
9458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	BOOLOP_EQ,
9558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	BOOLOP_NEQ
96c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
97c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
9858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviconst char* boolOpToString (BoolOp op)
9958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
10058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	switch (op)
10158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
10258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_OR:
10358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "||";
10458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
10558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_AND:
10658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "&&";
10758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
10858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_EQ:
10958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "==";
11058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
11158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_NEQ:
11258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "!=";
11358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
11458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		default:
11558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			DE_FATAL("Unknown boolean operation.");
11658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return DE_NULL;
11758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
11858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
11958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
12058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool performBoolOp (BoolOp op, bool a, bool b)
12158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
12258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	switch (op)
12358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
12458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_OR:
12558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return a || b;
12658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
12758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_AND:
12858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return a && b;
12958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
13058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_EQ:
13158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return a == b;
13258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
13358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case BOOLOP_NEQ:
13458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return a != b;
13558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
13658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		default:
13758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			DE_FATAL("Unknown boolean operation.");
13858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return false;
13958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
14058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
14158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
14258a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviBoolOp boolOpFromIndex (size_t index)
14358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
14458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const BoolOp ops[] =
14558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
14658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		BOOLOP_OR,
14758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		BOOLOP_AND,
14858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		BOOLOP_EQ,
14958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		BOOLOP_NEQ
15058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	};
15158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
15258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return ops[index % DE_LENGTH_OF_ARRAY(ops)];
15358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
15458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi// Utility functions using flattened structs
156c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFence> createFence (const DeviceInterface& vk, VkDevice device, VkFenceCreateFlags flags)
157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkFenceCreateInfo pCreateInfo =
159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		flags
164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
165955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createFence(vk, device, &pCreateInfo);
166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
16868e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkFramebuffer> createFramebuffer (const DeviceInterface&	vk,
16968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkDevice					device,
17068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkFramebufferCreateFlags	pCreateInfo_flags,
17168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkRenderPass				pCreateInfo_renderPass,
17268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_attachmentCount,
17368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   const VkImageView*		pCreateInfo_pAttachments,
17468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_width,
17568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_height,
17668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_layers)
177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkFramebufferCreateInfo pCreateInfo =
179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
18268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_renderPass,
184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_attachmentCount,
185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pAttachments,
186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_width,
187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_height,
188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_layers,
189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
190955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createFramebuffer(vk, device, &pCreateInfo);
191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
19368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkImage> createImage (const DeviceInterface&	vk,
19468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkDevice					device,
19568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageCreateFlags		pCreateInfo_flags,
19668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageType				pCreateInfo_imageType,
19768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkFormat					pCreateInfo_format,
19868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkExtent3D				pCreateInfo_extent,
19968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_mipLevels,
20068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_arrayLayers,
20168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkSampleCountFlagBits	pCreateInfo_samples,
20268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageTiling			pCreateInfo_tiling,
20368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageUsageFlags		pCreateInfo_usage,
20468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkSharingMode			pCreateInfo_sharingMode,
20568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   deUint32					pCreateInfo_queueFamilyCount,
20668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   const deUint32*			pCreateInfo_pQueueFamilyIndices,
20768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						   VkImageLayout			pCreateInfo_initialLayout)
208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageCreateInfo pCreateInfo =
210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
21368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_imageType,
215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_format,
216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_extent,
217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_mipLevels,
21868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_arrayLayers,
219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_samples,
220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_tiling,
221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_usage,
222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_sharingMode,
223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyCount,
224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pQueueFamilyIndices,
225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_initialLayout
226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
227955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createImage(vk, device, &pCreateInfo);
228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindBufferMemory (const DeviceInterface& vk, VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset)
231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.bindBufferMemory(device, buffer, mem, memOffset));
233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindImageMemory (const DeviceInterface& vk, VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset)
236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.bindImageMemory(device, image, mem, memOffset));
238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
240c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageView (const DeviceInterface&	vk,
241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkDevice				device,
24268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkImageViewCreateFlags	pCreateInfo_flags,
243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkImage					pCreateInfo_image,
244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkImageViewType			pCreateInfo_viewType,
245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									VkFormat				pCreateInfo_format,
24668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkComponentMapping		pCreateInfo_components,
24768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									VkImageSubresourceRange	pCreateInfo_subresourceRange)
248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageViewCreateInfo pCreateInfo =
250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
25368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_image,
255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_viewType,
256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_format,
25768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_components,
258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_subresourceRange,
259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
260955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createImageView(vk, device, &pCreateInfo);
261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
26368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkBuffer> createBuffer (const DeviceInterface&	vk,
26468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkDevice				device,
26568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkBufferCreateFlags	pCreateInfo_flags,
26668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkDeviceSize			pCreateInfo_size,
26768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkBufferUsageFlags		pCreateInfo_usage,
26868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkSharingMode			pCreateInfo_sharingMode,
26968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 deUint32				pCreateInfo_queueFamilyCount,
27068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 const deUint32*		pCreateInfo_pQueueFamilyIndices)
271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkBufferCreateInfo pCreateInfo =
273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
27668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_flags,
277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_size,
278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_usage,
279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_sharingMode,
280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyCount,
281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_pQueueFamilyIndices,
282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
283955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createBuffer(vk, device, &pCreateInfo);
284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
28668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandPool> createCommandPool (const DeviceInterface&	vk,
28768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkDevice					device,
28868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   VkCommandPoolCreateFlags	pCreateInfo_flags,
28968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									   deUint32					pCreateInfo_queueFamilyIndex)
290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
29168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkCommandPoolCreateInfo pCreateInfo =
292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
29368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_flags,
296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_queueFamilyIndex,
297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
298955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return createCommandPool(vk, device, &pCreateInfo);
299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
30168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid cmdBeginRenderPass (const DeviceInterface&	vk,
30268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBuffer		cmdBuffer,
30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRenderPass			pRenderPassBegin_renderPass,
30468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkFramebuffer			pRenderPassBegin_framebuffer,
30568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkRect2D				pRenderPassBegin_renderArea,
30668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 deUint32				pRenderPassBegin_clearValueCount,
30768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 const VkClearValue*	pRenderPassBegin_pAttachmentClearValues,
30868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkSubpassContents		contents)
309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkRenderPassBeginInfo pRenderPassBegin =
311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_renderPass,
315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_framebuffer,
316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_renderArea,
31768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pRenderPassBegin_clearValueCount,
318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pRenderPassBegin_pAttachmentClearValues,
319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vk.cmdBeginRenderPass(cmdBuffer, &pRenderPassBegin, contents);
321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
32368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandBuffer> allocateCommandBuffer (const DeviceInterface&	vk,
32468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkDevice				device,
32568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkCommandPool			pCreateInfo_commandPool,
32668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos											 VkCommandBufferLevel	pCreateInfo_level)
327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
328955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	const VkCommandBufferAllocateInfo pAllocateInfo =
329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
33068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
33268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCreateInfo_commandPool,
333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pCreateInfo_level,
33468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		1u,												// bufferCount
335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
336955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos	return allocateCommandBuffer(vk, device, &pAllocateInfo);
337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
33968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid beginCommandBuffer (const DeviceInterface&			vk,
34068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBuffer				cmdBuffer,
34168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						 VkCommandBufferUsageFlags		pBeginInfo_flags,
342689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkRenderPass					pInheritanceInfo_renderPass,
343689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 deUint32						pInheritanceInfo_subpass,
344689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkFramebuffer					pInheritanceInfo_framebuffer,
345689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkBool32						pInheritanceInfo_occlusionQueryEnable,
346689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkQueryControlFlags			pInheritanceInfo_queryFlags,
347689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						 VkQueryPipelineStatisticFlags	pInheritanceInfo_pipelineStatistics)
348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
34958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const VkCommandBufferInheritanceInfo pInheritanceInfo =
350689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	{
351689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
352689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		DE_NULL,
353689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_renderPass,
354689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_subpass,
355689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_framebuffer,
356689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_occlusionQueryEnable,
357689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_queryFlags,
358689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		pInheritanceInfo_pipelineStatistics,
359689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	};
36058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const VkCommandBufferBeginInfo pBeginInfo =
361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pBeginInfo_flags,
365689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		&pInheritanceInfo,
366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.beginCommandBuffer(cmdBuffer, &pBeginInfo));
368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid endCommandBuffer (const DeviceInterface& vk, VkCommandBuffer cmdBuffer)
371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.endCommandBuffer(cmdBuffer));
373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
37568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid queueSubmit (const DeviceInterface& vk, VkQueue queue, deUint32 cmdBufferCount, const VkCommandBuffer* pCmdBuffers, VkFence fence)
376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
37768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkSubmitInfo submitInfo =
37868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	{
37968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_SUBMIT_INFO,
38068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,
38168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,								// waitSemaphoreCount
38268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,	// pWaitSemaphores
383689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
38468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		cmdBufferCount,					// commandBufferCount
38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		pCmdBuffers,
38668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		0u,								// signalSemaphoreCount
38768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(const VkSemaphore*)DE_NULL,	// pSignalSemaphores
38868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	};
38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence));
390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid waitForFences (const DeviceInterface& vk, VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout)
393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.waitForFences(device, fenceCount, pFences, waitAll, timeout));
395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
397c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkImageAspectFlags getImageAspectFlags (VkFormat vkFormat)
398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat format = mapVkFormat(vkFormat);
400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (format.order)
404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::DS:
406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::D:
409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_DEPTH_BIT;
410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::S:
412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_STENCIL_BIT;
413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return VK_IMAGE_ASPECT_COLOR_BIT;
416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
41968e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryReadFlags (void)
420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
42168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_ACCESS_TRANSFER_READ_BIT
42268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_UNIFORM_READ_BIT
42368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_HOST_READ_BIT
42468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INDEX_READ_BIT
42568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_SHADER_READ_BIT
42668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
42768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INDIRECT_COMMAND_READ_BIT
42868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
42968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
43068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
43368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryWriteFlags (void)
434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
43568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_ACCESS_TRANSFER_WRITE_BIT
43668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_HOST_WRITE_BIT
43768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_SHADER_WRITE_BIT
43868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
43968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
442ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej JesionowskiVkAccessFlags getMemoryFlagsForLayout (const VkImageLayout layout)
443ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski{
444ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski	switch (layout)
445ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski	{
446ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_GENERAL:							return getAllMemoryReadFlags() | getAllMemoryWriteFlags();
447ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:			return VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
448ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:	return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
449ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:	return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
450ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:			return VK_ACCESS_SHADER_READ_BIT;
451ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:				return VK_ACCESS_TRANSFER_READ_BIT;
452ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:				return VK_ACCESS_TRANSFER_WRITE_BIT;
453ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski
454ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		default:
455ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski			return (VkAccessFlags)0;
456ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski	}
457ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski}
458ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski
459c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkPipelineStageFlags getAllPipelineStageFlags (void)
460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
46168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_TRANSFER_BIT
463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
46968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		   | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		   | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentReference
477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					AttachmentReference		(deUint32		attachment,
480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageLayout	layout)
481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_attachment	(attachment)
482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_layout		(layout)
483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32		getAttachment			(void) const { return m_attachment;	}
487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout	getImageLayout			(void) const { return m_layout;		}
488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32		m_attachment;
491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageLayout	m_layout;
492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Subpass
495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										Subpass						(VkPipelineBindPoint				pipelineBindPoint,
498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 VkSubpassDescriptionFlags			flags,
499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	inputAttachments,
500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	colorAttachments,
501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 const vector<AttachmentReference>&	resolveAttachments,
502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	 AttachmentReference				depthStencilAttachment,
50358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 const vector<deUint32>&			preserveAttachments)
504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_pipelineBindPoint		(pipelineBindPoint)
505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_flags					(flags)
506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_inputAttachments		(inputAttachments)
507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorAttachments		(colorAttachments)
508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_resolveAttachments		(resolveAttachments)
509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depthStencilAttachment	(depthStencilAttachment)
510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_preserveAttachments		(preserveAttachments)
511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineBindPoint					getPipelineBindPoint		(void) const { return m_pipelineBindPoint;		}
515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			getFlags					(void) const { return m_flags;					}
516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getInputAttachments			(void) const { return m_inputAttachments;		}
517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getColorAttachments			(void) const { return m_colorAttachments;		}
518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<AttachmentReference>&	getResolveAttachments		(void) const { return m_resolveAttachments;		}
519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const AttachmentReference&			getDepthStencilAttachment	(void) const { return m_depthStencilAttachment;	}
52058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const vector<deUint32>&				getPreserveAttachments		(void) const { return m_preserveAttachments;	}
521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineBindPoint					m_pipelineBindPoint;
524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkSubpassDescriptionFlags			m_flags;
525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_inputAttachments;
527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_colorAttachments;
528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<AttachmentReference>			m_resolveAttachments;
529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	AttachmentReference					m_depthStencilAttachment;
530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
53158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<deUint32>					m_preserveAttachments;
532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassDependency
535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							SubpassDependency	(deUint32				srcPass,
538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 deUint32				dstPass,
539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VkPipelineStageFlags	srcStageMask,
541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 VkPipelineStageFlags	dstStageMask,
542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkAccessFlags			outputMask,
54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkAccessFlags			inputMask,
545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
54668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos												 VkDependencyFlags		flags)
547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_srcPass			(srcPass)
548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dstPass			(dstPass)
549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_srcStageMask	(srcStageMask)
551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dstStageMask	(dstStageMask)
552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_outputMask		(outputMask)
554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_inputMask		(inputMask)
55568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		, m_flags			(flags)
556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				getSrcPass			(void) const { return m_srcPass;		}
560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				getDstPass			(void) const { return m_dstPass;		}
561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	getSrcStageMask		(void) const { return m_srcStageMask;	}
563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	getDstStageMask		(void) const { return m_dstStageMask;	}
564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
56568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			getOutputMask		(void) const { return m_outputMask;		}
56668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			getInputMask		(void) const { return m_inputMask;		}
567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
56868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkDependencyFlags		getFlags			(void) const { return m_flags;		}
569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				m_srcPass;
572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32				m_dstPass;
573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	m_srcStageMask;
575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkPipelineStageFlags	m_dstStageMask;
576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
57768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			m_outputMask;
57868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAccessFlags			m_inputMask;
57968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkDependencyFlags		m_flags;
580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Attachment
583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
58558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							Attachment			(VkFormat				format,
58658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkSampleCountFlagBits	samples,
587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
58858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkAttachmentLoadOp		loadOp,
58958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkAttachmentStoreOp	storeOp,
590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
59158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkAttachmentLoadOp		stencilLoadOp,
59258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkAttachmentStoreOp	stencilStoreOp,
593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
59458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkImageLayout			initialLayout,
59558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 VkImageLayout			finalLayout)
596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_format			(format)
597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_samples			(samples)
598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_loadOp			(loadOp)
600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_storeOp			(storeOp)
601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencilLoadOp	(stencilLoadOp)
603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencilStoreOp	(stencilStoreOp)
604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_initialLayout	(initialLayout)
606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_finalLayout		(finalLayout)
607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
61068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkFormat				getFormat			(void) const { return m_format;			}
61168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkSampleCountFlagBits	getSamples			(void) const { return m_samples;		}
612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
61368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		getLoadOp			(void) const { return m_loadOp;			}
61468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		getStoreOp			(void) const { return m_storeOp;		}
615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
61768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		getStencilLoadOp	(void) const { return m_stencilLoadOp;	}
61868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		getStencilStoreOp	(void) const { return m_stencilStoreOp;	}
619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
62068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			getInitialLayout	(void) const { return m_initialLayout;	}
62168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			getFinalLayout		(void) const { return m_finalLayout;	}
622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
62468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkFormat				m_format;
62568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkSampleCountFlagBits	m_samples;
626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
62768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		m_loadOp;
62868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		m_storeOp;
629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
63068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentLoadOp		m_stencilLoadOp;
63168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkAttachmentStoreOp		m_stencilStoreOp;
632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
63368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			m_initialLayout;
63468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkImageLayout			m_finalLayout;
635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderPass
638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										RenderPass		(const vector<Attachment>&			attachments,
641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 const vector<Subpass>&				subpasses,
642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 const vector<SubpassDependency>&	dependencies)
643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_attachments		(attachments)
644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_subpasses		(subpasses)
645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_dependencies	(dependencies)
646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Attachment>&			getAttachments	(void) const { return m_attachments;	}
650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&				getSubpasses	(void) const { return m_subpasses;		}
651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<SubpassDependency>&	getDependencies	(void) const { return m_dependencies;	}
652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Attachment>			m_attachments;
655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>				m_subpasses;
656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<SubpassDependency>		m_dependencies;
657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistruct TestConfig
660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum RenderTypes
662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_NONE	= 0,
664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_CLEAR	= (1<<1),
665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		RENDERTYPES_DRAW	= (1<<2)
666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum CommandBufferTypes
669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COMMANDBUFFERTYPES_INLINE		= (1<<0),
671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		COMMANDBUFFERTYPES_SECONDARY	= (1<<1)
672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum ImageMemory
675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		IMAGEMEMORY_STRICT		= (1<<0),
677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		IMAGEMEMORY_LAZY		= (1<<1)
678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
68058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						TestConfig (const RenderPass&	renderPass_,
68158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									RenderTypes			renderTypes_,
68258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									CommandBufferTypes	commandBufferTypes_,
68358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									ImageMemory			imageMemory_,
68458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const UVec2&		targetSize_,
68558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const UVec2&		renderPos_,
68658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const UVec2&		renderSize_,
68758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									deUint32			seed_)
688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: renderPass			(renderPass_)
689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderTypes			(renderTypes_)
690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, commandBufferTypes	(commandBufferTypes_)
691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, imageMemory			(imageMemory_)
692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, targetSize			(targetSize_)
693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderPos				(renderPos_)
694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, renderSize			(renderSize_)
695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, seed					(seed_)
696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderPass			renderPass;
700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	RenderTypes			renderTypes;
701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	CommandBufferTypes	commandBufferTypes;
702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	ImageMemory			imageMemory;
703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				targetSize;
704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				renderPos;
705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	UVec2				renderSize;
706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deUint32			seed;
707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
709c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::RenderTypes operator| (TestConfig::RenderTypes a, TestConfig::RenderTypes b)
710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::RenderTypes)(((deUint32)a) | ((deUint32)b));
712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
714c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::CommandBufferTypes operator| (TestConfig::CommandBufferTypes a, TestConfig::CommandBufferTypes b)
715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::CommandBufferTypes)(((deUint32)a) | ((deUint32)b));
717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
719c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::ImageMemory operator| (TestConfig::ImageMemory a, TestConfig::ImageMemory b)
720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return (TestConfig::ImageMemory)(((deUint32)a) | ((deUint32)b));
722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logRenderPassInfo (TestLog&			log,
725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						const RenderPass&	renderPass)
726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::ScopedLogSection section (log, "RenderPass", "RenderPass");
728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	attachmentsSection	(log, "Attachments", "Attachments");
731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Attachment>&	attachments			= renderPass.getAttachments();
732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection	attachmentSection	(log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx));
736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&			attachment			= attachments[attachmentNdx];
737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Format: " << attachment.getFormat() << TestLog::EndMessage;
739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Samples: " << attachment.getSamples() << TestLog::EndMessage;
740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "LoadOp: " << attachment.getLoadOp() << TestLog::EndMessage;
742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StoreOp: " << attachment.getStoreOp() << TestLog::EndMessage;
743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StencilLoadOp: " << attachment.getStencilLoadOp() << TestLog::EndMessage;
745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "StencilStoreOp: " << attachment.getStencilStoreOp() << TestLog::EndMessage;
746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "InitialLayout: " << attachment.getInitialLayout() << TestLog::EndMessage;
748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "FinalLayout: " << attachment.getFinalLayout() << TestLog::EndMessage;
749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	subpassesSection	(log, "Subpasses", "Subpasses");
754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Subpass>&		subpasses			= renderPass.getSubpasses();
755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection			subpassSection		(log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx));
759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Subpass&						subpass				= subpasses[subpassNdx];
760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	inputAttachments	= subpass.getInputAttachments();
762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	resolveAttachments	= subpass.getResolveAttachments();
76458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const vector<deUint32>&				preserveAttachments	= subpass.getPreserveAttachments();
765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!inputAttachments.empty())
767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
76858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::ScopedLogSection	inputAttachmentsSection	(log, "Inputs", "Inputs");
769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t inputNdx = 0; inputNdx < inputAttachments.size(); inputNdx++)
771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
77258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::ScopedLogSection	inputAttachmentSection	(log, "Input" + de::toString(inputNdx), "Input " + de::toString(inputNdx));
77358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const AttachmentReference&	inputAttachment			= inputAttachments[inputNdx];
774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << inputAttachment.getAttachment() << TestLog::EndMessage;
776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << inputAttachment.getImageLayout() << TestLog::EndMessage;
777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
78258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::ScopedLogSection	depthStencilAttachmentSection	(log, "DepthStencil", "DepthStencil");
78358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const AttachmentReference&	depthStencilAttachment			= subpass.getDepthStencilAttachment();
784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				log << TestLog::Message << "Attachment: " << depthStencilAttachment.getAttachment() << TestLog::EndMessage;
786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				log << TestLog::Message << "Layout: " << depthStencilAttachment.getImageLayout() << TestLog::EndMessage;
787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!colorAttachments.empty())
790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
79158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::ScopedLogSection	colorAttachmentsSection	(log, "Colors", "Colors");
792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t colorNdx = 0; colorNdx < colorAttachments.size(); colorNdx++)
794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
79558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::ScopedLogSection	colorAttachmentSection	(log, "Color" + de::toString(colorNdx), "Color " + de::toString(colorNdx));
79658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const AttachmentReference&	colorAttachment			= colorAttachments[colorNdx];
797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << colorAttachment.getAttachment() << TestLog::EndMessage;
799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << colorAttachment.getImageLayout() << TestLog::EndMessage;
800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!resolveAttachments.empty())
804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
80558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::ScopedLogSection	resolveAttachmentsSection	(log, "Resolves", "Resolves");
806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t resolveNdx = 0; resolveNdx < resolveAttachments.size(); resolveNdx++)
808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
80958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::ScopedLogSection	resolveAttachmentSection	(log, "Resolve" + de::toString(resolveNdx), "Resolve " + de::toString(resolveNdx));
81058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const AttachmentReference&	resolveAttachment			= resolveAttachments[resolveNdx];
811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Attachment: " << resolveAttachment.getAttachment() << TestLog::EndMessage;
813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Message << "Layout: " << resolveAttachment.getImageLayout() << TestLog::EndMessage;
814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!preserveAttachments.empty())
818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
81958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::ScopedLogSection	preserveAttachmentsSection	(log, "Preserves", "Preserves");
820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				for (size_t preserveNdx = 0; preserveNdx < preserveAttachments.size(); preserveNdx++)
822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
82358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::ScopedLogSection	preserveAttachmentSection	(log, "Preserve" + de::toString(preserveNdx), "Preserve " + de::toString(preserveNdx));
82458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				preserveAttachment			= preserveAttachments[preserveNdx];
825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
82658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					log << TestLog::Message << "Attachment: " << preserveAttachment << TestLog::EndMessage;
827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!renderPass.getDependencies().empty())
834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	dependenciesSection	(log, "Dependencies", "Dependencies");
836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t depNdx = 0; depNdx < renderPass.getDependencies().size(); depNdx++)
838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::ScopedLogSection	dependencySection	(log, "Dependency" + de::toString(depNdx), "Dependency " + de::toString(depNdx));
840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const SubpassDependency&	dep					= renderPass.getDependencies()[depNdx];
841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Source: " << dep.getSrcPass() << TestLog::EndMessage;
843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Destination: " << dep.getDstPass() << TestLog::EndMessage;
844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Source Stage Mask: " << dep.getSrcStageMask() << TestLog::EndMessage;
846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Destination Stage Mask: " << dep.getDstStageMask() << TestLog::EndMessage;
847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Input Mask: " << dep.getInputMask() << TestLog::EndMessage;
849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Output Mask: " << dep.getOutputMask() << TestLog::EndMessage;
85068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			log << TestLog::Message << "Dependency Flags: " << getDependencyFlagsStr(dep.getFlags()) << TestLog::EndMessage;
851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearColorToString (VkFormat vkFormat, VkClearColorValue value)
856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	std::ostringstream				stream;
862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	stream << "(";
864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.int32[i];
875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.uint32[i];
888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int i = 0; i < 4; i++)
897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (i > 0)
899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << ", ";
900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (channelMask[i])
902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << value.float32[i];
903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					stream << "Undef";
905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	stream << ")";
913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return stream.str();
915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearValueToString (VkFormat vkFormat, VkClearValue value)
918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat	format	= mapVkFormat(vkFormat);
920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order))
922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		std::ostringstream stream;
924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		stream << "(";
926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << "stencil: " << value.depthStencil.stencil;
929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order) && tcu::hasDepthComponent(format.order))
931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << ", ";
932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			stream << "depth: " << value.depthStencil.depth;
935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		stream << ")";
937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return stream.str();
939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearColorToString(vkFormat, value.color);
942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
944c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearColorValue randomColorClearValue (const Attachment& attachment, de::Random& rng)
945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float						clearNan		= tcu::Float32::nan().asFloat();
947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(attachment.getFormat());
948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkClearColorValue				clearColor;
951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.int32[ndx] = std::numeric_limits<deInt32>::min();
960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
96158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					clearColor.uint32[ndx] = rng.getBool() ? 1u : 0u;
962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.uint32[ndx] = std::numeric_limits<deUint32>::max();
972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
97358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					clearColor.uint32[ndx] = rng.getBool() ? 1u : 0u;
974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (int ndx = 0; ndx < 4; ndx++)
983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (!channelMask[ndx])
985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					clearColor.float32[ndx] = clearNan;
986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
98758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					clearColor.float32[ndx] = rng.getBool() ? 1.0f : 0.0f;
988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			break;
990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return clearColor;
997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
999c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentDescription createAttachmentDescription (const Attachment& attachment)
1000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentDescription attachmentDescription =
1002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
100358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		0,								// flags
1004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
100558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getFormat(),			// format
100658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getSamples(),		// samples
1007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
100858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getLoadOp(),			// loadOp
100958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getStoreOp(),		// storeOp
1010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
101158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getStencilLoadOp(),	// stencilLoadOp
101258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getStencilStoreOp(),	// stencilStoreOp
1013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
101458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getInitialLayout(),	// initialLayout
101558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		attachment.getFinalLayout(),	// finalLayout
1016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return attachmentDescription;
1019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1021c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentReference createAttachmentReference (const AttachmentReference& referenceInfo)
1022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentReference reference =
1024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		referenceInfo.getAttachment(),	// attachment;
1026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		referenceInfo.getImageLayout()	// layout;
1027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return reference;
1030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1032c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDescription createSubpassDescription (const Subpass&					subpass,
1033689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos											   vector<VkAttachmentReference>*	attachmentReferenceLists,
1034689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos											   vector<deUint32>*				preserveAttachmentReferences)
1035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
103668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	inputAttachmentReferences			= attachmentReferenceLists[0];
103768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	colorAttachmentReferences			= attachmentReferenceLists[1];
103868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	resolveAttachmentReferences			= attachmentReferenceLists[2];
103968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	vector<VkAttachmentReference>&	depthStencilAttachmentReferences	= attachmentReferenceLists[3];
1040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
1042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		colorAttachmentReferences.push_back(createAttachmentReference(subpass.getColorAttachments()[attachmentNdx]));
1043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
1045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		inputAttachmentReferences.push_back(createAttachmentReference(subpass.getInputAttachments()[attachmentNdx]));
1046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getResolveAttachments().size(); attachmentNdx++)
1048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		resolveAttachmentReferences.push_back(createAttachmentReference(subpass.getResolveAttachments()[attachmentNdx]));
1049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
105068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	depthStencilAttachmentReferences.push_back(createAttachmentReference(subpass.getDepthStencilAttachment()));
105168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
1052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < subpass.getPreserveAttachments().size(); attachmentNdx++)
105358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		preserveAttachmentReferences->push_back(subpass.getPreserveAttachments()[attachmentNdx]);
1054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size());
1056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
105868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkSubpassDescription subpassDescription =
1059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1060689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			subpass.getFlags(),																		// flags;
1061689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			subpass.getPipelineBindPoint(),															// pipelineBindPoint;
1062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1063689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)inputAttachmentReferences.size(),												// inputCount;
1064689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0],			// inputAttachments;
1065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1066689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)colorAttachmentReferences.size(),												// colorCount;
1067689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			colorAttachmentReferences.empty() ? DE_NULL :  &colorAttachmentReferences[0],			// colorAttachments;
1068689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0],		// resolveAttachments;
1069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1070689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			&depthStencilAttachmentReferences[0],													// pDepthStencilAttachment;
1071689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(deUint32)preserveAttachmentReferences->size(),											// preserveCount;
1072689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			preserveAttachmentReferences->empty() ? DE_NULL : &(*preserveAttachmentReferences)[0]	// preserveAttachments;
1073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
1074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
107568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		return subpassDescription;
1076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1079c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDependency createSubpassDependency	(const SubpassDependency& dependencyInfo)
1080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkSubpassDependency dependency =
1082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
108358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getSrcPass(),		// srcSubpass;
108458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getDstPass(),		// destSubpass;
1085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
108658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getSrcStageMask(),	// srcStageMask;
108758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getDstStageMask(),	// destStageMask;
1088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
108958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getOutputMask(),		// outputMask;
109058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getInputMask(),		// inputMask;
1091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
109258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		dependencyInfo.getFlags()			// dependencyFlags;
1093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return dependency;
1096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1098c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkRenderPass> createRenderPass (const DeviceInterface&	vk,
1099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkDevice				device,
1100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 const RenderPass&		renderPassInfo)
1101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1102689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const size_t							perSubpassAttachmentReferenceLists = 4;
1103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkAttachmentDescription>			attachments;
1104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkSubpassDescription>			subpasses;
1105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkSubpassDependency>				dependencies;
1106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<vector<VkAttachmentReference> >	attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists);
1107689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	vector<vector<deUint32> >				preserveAttachments(renderPassInfo.getSubpasses().size());
1108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
1110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		attachments.push_back(createAttachmentDescription(renderPassInfo.getAttachments()[attachmentNdx]));
1111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
1113689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		subpasses.push_back(createSubpassDescription(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists]), &preserveAttachments[subpassNdx]));
1114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++)
1116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		dependencies.push_back(createSubpassDependency(renderPassInfo.getDependencies()[depNdx]));
1117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
111968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const VkRenderPassCreateInfo	createInfo	=
112068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		{
112168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
112268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			DE_NULL,
112368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkRenderPassCreateFlags)0u,
112468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)attachments.size(),
112568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(attachments.empty() ? DE_NULL : &attachments[0]),
112668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)subpasses.size(),
112768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(subpasses.empty() ? DE_NULL : &subpasses[0]),
112868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(deUint32)dependencies.size(),
112968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(dependencies.empty() ? DE_NULL : &dependencies[0])
113068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		};
113168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
113268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		return createRenderPass(vk, device, &createInfo);
1133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1136c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFramebuffer> createFramebuffer (const DeviceInterface&		vk,
1137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   VkDevice						device,
1138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   VkRenderPass					renderPass,
1139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   const UVec2&					size,
1140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									   const vector<VkImageView>&	attachments)
1141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
114268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createFramebuffer(vk, device, 0u, renderPass, (deUint32)attachments.size(), attachments.empty() ? DE_NULL : &attachments[0], size.x(), size.y(), 1u);
1143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1145c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImage> createAttachmentImage (const DeviceInterface&	vk,
1146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkDevice				device,
1147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 deUint32				queueIndex,
1148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 const UVec2&			size,
1149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkFormat				format,
115068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									 VkSampleCountFlagBits	samples,
1151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkImageUsageFlags		usageFlags,
1152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									 VkImageLayout			layout)
1153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
115458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	VkImageUsageFlags			targetUsageFlags	= 0;
115558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const tcu::TextureFormat	textureFormat		= mapVkFormat(format);
115658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
115758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(!(tcu::hasDepthComponent(vk::mapVkFormat(format).order) || tcu::hasStencilComponent(vk::mapVkFormat(format).order))
115858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					|| ((usageFlags & vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) == 0));
115958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
116058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT((tcu::hasDepthComponent(vk::mapVkFormat(format).order) || tcu::hasStencilComponent(vk::mapVkFormat(format).order))
116158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					|| ((usageFlags & vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0));
116294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos
11639cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan	if (tcu::hasDepthComponent(textureFormat.order) || tcu::hasStencilComponent(textureFormat.order))
11649cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan		targetUsageFlags |= vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
116594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	else
11669cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan		targetUsageFlags |= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
11679cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan
116868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createImage(vk, device,
116968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   (VkImageCreateFlags)0,
117068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_IMAGE_TYPE_2D,
117168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   format,
117258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					   vk::makeExtent3D(size.x(), size.y(), 1u),
117368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1u /* mipLevels */,
117468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1u /* arraySize */,
117568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   samples,
117668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_IMAGE_TILING_OPTIMAL,
117768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   usageFlags | targetUsageFlags,
117868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SHARING_MODE_EXCLUSIVE,
117968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   1,
118068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   &queueIndex,
118168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   layout);
1182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<Allocation> createImageMemory (const DeviceInterface&	vk,
1185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   VkDevice					device,
1186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   Allocator&				allocator,
1187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   VkImage					image,
1188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										   bool						lazy)
1189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation> allocation (allocator.allocate(getImageMemoryRequirements(vk, device, image), lazy ? MemoryRequirement::LazilyAllocated : MemoryRequirement::Any));
1191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bindImageMemory(vk, device, image, allocation->getMemory(), allocation->getOffset());
1192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return allocation;
1193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1195c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageAttachmentView (const DeviceInterface&	vk,
1196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkDevice				device,
1197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImage				image,
1198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkFormat				format,
1199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi											 VkImageAspectFlags		aspect)
1200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageSubresourceRange range =
1202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		aspect,
1204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1,
1206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0,
1207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1
1208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
121068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	return createImageView(vk, device, 0u, image, VK_IMAGE_VIEW_TYPE_2D, format, makeComponentMappingRGBA(), range);
1211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1213c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearValue randomClearValue (const Attachment& attachment, de::Random& rng)
1214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float					clearNan	= tcu::Float32::nan().asFloat();
1216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat	format		= mapVkFormat(attachment.getFormat());
1217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order))
1219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkClearValue clearValue;
1221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.depthStencil.depth	= clearNan;
122358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		clearValue.depthStencil.stencil	= 0xCDu;
1224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasStencilComponent(format.order))
122658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			clearValue.depthStencil.stencil	= rng.getBool()
122758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											? 0xFFu
122858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											: 0x0u;
1229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::hasDepthComponent(format.order))
123158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			clearValue.depthStencil.depth	= rng.getBool()
123258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											? 1.0f
123358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											: 0.0f;
1234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearValue;
1236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
1238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkClearValue clearValue;
1240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValue.color = randomColorClearValue(attachment, rng);
1242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return clearValue;
1244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentResources
1248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
125058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	AttachmentResources (const DeviceInterface&	vk,
125158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 VkDevice				device,
125258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 Allocator&				allocator,
125358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 deUint32				queueIndex,
125458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 const UVec2&			size,
125558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 const Attachment&		attachmentInfo,
125658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 VkImageUsageFlags		usageFlags)
12575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		: m_image			(createAttachmentImage(vk, device, queueIndex, size, attachmentInfo.getFormat(), attachmentInfo.getSamples(), usageFlags, VK_IMAGE_LAYOUT_UNDEFINED))
12585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		, m_imageMemory		(createImageMemory(vk, device, allocator, *m_image, ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0)))
1259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_attachmentView	(createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), getImageAspectFlags(attachmentInfo.getFormat())))
1260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
126158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const tcu::TextureFormat	format			= mapVkFormat(attachmentInfo.getFormat());
126258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					isDepthFormat	= tcu::hasDepthComponent(format.order);
126358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					isStencilFormat	= tcu::hasStencilComponent(format.order);
126458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
126558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (isDepthFormat && isStencilFormat)
1266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
126758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			m_depthInputAttachmentView		= createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), VK_IMAGE_ASPECT_DEPTH_BIT);
126858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			m_stencilInputAttachmentView	= createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), VK_IMAGE_ASPECT_STENCIL_BIT);
126958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
127058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			m_inputAttachmentViews = std::make_pair(*m_depthInputAttachmentView, *m_stencilInputAttachmentView);
127158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
127258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		else
127358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			m_inputAttachmentViews = std::make_pair(*m_attachmentView, (vk::VkImageView)0u);
1274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
127558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0)
127658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
1277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order))
1278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1279bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	depthFormat		= getDepthCopyFormat(attachmentInfo.getFormat());
1280bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	stencilFormat	= getStencilCopyFormat(attachmentInfo.getFormat());
1281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferSize			= size.x() * size.y() * depthFormat.getPixelSize();
1283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_secondaryBufferSize	= size.x() * size.y() * stencilFormat.getPixelSize();
1284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
128568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_buffer				= createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferMemory			= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible);
1287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset());
1289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
129068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_secondaryBuffer		= createBuffer(vk, device, 0, m_secondaryBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_secondaryBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_secondaryBuffer), MemoryRequirement::HostVisible);
1292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_secondaryBuffer, m_secondaryBufferMemory->getMemory(), m_secondaryBufferMemory->getOffset());
1294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
1296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
1297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferSize	= size.x() * size.y() * format.getPixelSize();
1298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
129968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				m_buffer		= createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex);
1300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				m_bufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible);
1301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset());
1303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
1304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
130758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const pair<VkImageView, VkImageView>& getInputAttachmentViews (void) const
130858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
130958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		return m_inputAttachmentViews;
131058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
131158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
1312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	~AttachmentResources (void)
1313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImageView getAttachmentView (void) const
1317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_attachmentView;
1319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkImage getImage (void) const
1322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_image;
1324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkBuffer getBuffer (void) const
1327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_buffer != DE_NULL);
1329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_buffer;
1330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize getBufferSize (void) const
1333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_buffer != DE_NULL);
1335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_bufferSize;
1336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Allocation& getResultMemory (void) const
1339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(m_bufferMemory);
1341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_bufferMemory;
1342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkBuffer getSecondaryBuffer (void) const
1345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_secondaryBuffer != DE_NULL);
1347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_secondaryBuffer;
1348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize getSecondaryBufferSize (void) const
1351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(*m_secondaryBuffer != DE_NULL);
1353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_secondaryBufferSize;
1354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Allocation& getSecondaryResultMemory (void) const
1357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(m_secondaryBufferMemory);
1359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_secondaryBufferMemory;
1360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
1363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Unique<VkImage>			m_image;
1364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UniquePtr<Allocation>		m_imageMemory;
1365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const Unique<VkImageView>		m_attachmentView;
1366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
136758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkImageView>				m_depthInputAttachmentView;
136858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkImageView>				m_stencilInputAttachmentView;
136958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	pair<VkImageView, VkImageView>	m_inputAttachmentViews;
137058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
1371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>					m_buffer;
1372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize					m_bufferSize;
1373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>			m_bufferMemory;
1374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	Move<VkBuffer>					m_secondaryBuffer;
1376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VkDeviceSize					m_secondaryBufferSize;
1377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<Allocation>			m_secondaryBufferMemory;
1378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid uploadBufferData (const DeviceInterface&	vk,
1381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VkDevice					device,
1382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const Allocation&		memory,
1383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   size_t					size,
1384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   const void*				data)
1385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkMappedMemoryRange range =
1387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// sType;
1389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,								// pNext;
1390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		memory.getMemory(),						// mem;
1391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		memory.getOffset(),						// offset;
1392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(VkDeviceSize)size						// size;
1393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void* const ptr = memory.getHostPtr();
1395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	deMemcpy(ptr, data, size);
1397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_CHECK(vk.flushMappedMemoryRanges(device, 1, &range));
1398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
140068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkImageAspectFlagBits getPrimaryImageAspect (tcu::TextureFormat::ChannelOrder order)
1401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
1403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (order)
1405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::D:
1407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::DS:
140868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_DEPTH_BIT;
1409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TextureFormat::S:
141168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_STENCIL_BIT;
1412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
141468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			return VK_IMAGE_ASPECT_COLOR_BIT;
1415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderQuad
1419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
142158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					RenderQuad			(const Vec2& posA, const Vec2& posB)
1422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_vertices(6)
1423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[0] = posA;
142558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		m_vertices[1] = Vec2(posA[0], posB[1]);
1426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[2] = posB;
1427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[3] = posB;
142958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		m_vertices[4] = Vec2(posB[0], posA[1]);
1430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		m_vertices[5] = posA;
1431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
143358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec2&		getCornerA			(void) const
1434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_vertices[0];
1436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
143858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec2&		getCornerB			(void) const
1439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_vertices[2];
1441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const void*		getVertexPointer	(void) const
1444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return &m_vertices[0];
1446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	size_t			getVertexDataSize	(void) const
1449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
145058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		return sizeof(Vec2) * m_vertices.size();
1451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
145458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<Vec2>	m_vertices;
1455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass ColorClear
1458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
146058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								ColorClear	(const UVec2&				offset,
146158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											 const UVec2&				size,
146258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											 const VkClearColorValue&	color)
1463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_offset	(offset)
1464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_size	(size)
1465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_color	(color)
1466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
146958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2&				getOffset	(void) const { return m_offset;	}
147058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2&				getSize		(void) const { return m_size;	}
147158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const VkClearColorValue&	getColor	(void) const { return m_color;	}
1472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
147458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	UVec2						m_offset;
147558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	UVec2						m_size;
147658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	VkClearColorValue			m_color;
1477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass DepthStencilClear
1480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
148258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					DepthStencilClear	(const UVec2&	offset,
148358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										 const UVec2&	size,
148458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										 float			depth,
148558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										 deUint32		stencil)
1486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_offset	(offset)
1487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_size	(size)
1488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depth	(depth)
1489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_stencil	(stencil)
1490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
149358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2&	getOffset			(void) const { return m_offset;		}
149458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2&	getSize				(void) const { return m_size;		}
149558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	float			getDepth			(void) const { return m_depth;		}
149658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32		getStencil			(void) const { return m_stencil;	}
1497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
149958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2		m_offset;
150058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2		m_size;
1501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
150258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const float		m_depth;
150358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const deUint32	m_stencil;
1504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderInfo
1507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
150958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									SubpassRenderInfo				(const RenderPass&					renderPass,
151058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 deUint32							subpassIndex,
1511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
151258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 bool								isSecondary_,
1513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
151458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 const UVec2&						viewportOffset,
151558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 const UVec2&						viewportSize,
1516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
151758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 const Maybe<RenderQuad>&			renderQuad,
151858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 const vector<ColorClear>&			colorClears,
151958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 const Maybe<DepthStencilClear>&	depthStencilClear)
1520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_viewportOffset		(viewportOffset)
1521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_viewportSize		(viewportSize)
1522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_subpassIndex		(subpassIndex)
1523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_isSecondary			(isSecondary_)
1524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_flags				(renderPass.getSubpasses()[subpassIndex].getFlags())
1525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_renderQuad			(renderQuad)
1526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorClears			(colorClears)
1527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_depthStencilClear	(depthStencilClear)
1528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		, m_colorAttachments	(renderPass.getSubpasses()[subpassIndex].getColorAttachments())
152958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		, m_inputAttachments	(renderPass.getSubpasses()[subpassIndex].getInputAttachments())
1530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (deUint32 attachmentNdx = 0; attachmentNdx < (deUint32)m_colorAttachments.size(); attachmentNdx++)
1532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_colorAttachmentInfo.push_back(renderPass.getAttachments()[m_colorAttachments[attachmentNdx].getAttachment()]);
1533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
1535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_depthStencilAttachment		= tcu::just(renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment());
1537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_depthStencilAttachmentInfo	= tcu::just(renderPass.getAttachments()[renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment()]);
1538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
154158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2&					getViewportOffset				(void) const { return m_viewportOffset;		}
154258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2&					getViewportSize					(void) const { return m_viewportSize;		}
1543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
154458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32						getSubpassIndex					(void) const { return m_subpassIndex;		}
154558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	bool							isSecondary						(void) const { return m_isSecondary;		}
1546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
154758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Maybe<RenderQuad>&		getRenderQuad					(void) const { return m_renderQuad;			}
154858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const vector<ColorClear>&		getColorClears					(void) const { return m_colorClears;		}
154958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Maybe<DepthStencilClear>&	getDepthStencilClear			(void) const { return m_depthStencilClear;	}
155058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
155158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32						getInputAttachmentCount			(void) const { return (deUint32)m_inputAttachments.size(); }
155258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32						getInputAttachmentIndex			(deUint32 attachmentNdx) const { return m_inputAttachments[attachmentNdx].getAttachment(); }
15534dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski	VkImageLayout					getInputAttachmentLayout		(deUint32 attachmentNdx) const { return m_inputAttachments[attachmentNdx].getImageLayout(); }
155458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
155558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32						getColorAttachmentCount			(void) const { return (deUint32)m_colorAttachments.size(); }
155658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	VkImageLayout					getColorAttachmentLayout		(deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getImageLayout(); }
155758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32						getColorAttachmentIndex			(deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getAttachment(); }
155858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Attachment&				getColorAttachment				(deUint32 attachmentNdx) const { return m_colorAttachmentInfo[attachmentNdx]; }
155958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<VkImageLayout>			getDepthStencilAttachmentLayout	(void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getImageLayout()) : tcu::nothing<VkImageLayout>(); }
156058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<deUint32>					getDepthStencilAttachmentIndex	(void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getAttachment()) : tcu::nothing<deUint32>(); };
156158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Maybe<Attachment>&		getDepthStencilAttachment		(void) const { return m_depthStencilAttachmentInfo; }
156258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	VkSubpassDescriptionFlags		getSubpassFlags					(void) const { return m_flags; }
1563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
156558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	UVec2							m_viewportOffset;
156658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	UVec2							m_viewportSize;
1567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
156858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint32						m_subpassIndex;
156958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	bool							m_isSecondary;
157058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	VkSubpassDescriptionFlags		m_flags;
1571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
157258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<RenderQuad>				m_renderQuad;
157358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<ColorClear>				m_colorClears;
157458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<DepthStencilClear>		m_depthStencilClear;
1575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
157658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<AttachmentReference>		m_colorAttachments;
157758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<Attachment>				m_colorAttachmentInfo;
1578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
157958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<AttachmentReference>		m_depthStencilAttachment;
158058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<Attachment>				m_depthStencilAttachmentInfo;
158158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
158258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<AttachmentReference>		m_inputAttachments;
1583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
1584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1585c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkPipeline> createSubpassPipeline (const DeviceInterface&		vk,
1586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkDevice					device,
1587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkRenderPass				renderPass,
158868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos										VkShaderModule				vertexShaderModule,
158968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos										VkShaderModule				fragmentShaderModule,
1590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										VkPipelineLayout			pipelineLayout,
1591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										const SubpassRenderInfo&	renderInfo)
1592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkSpecializationInfo emptyShaderSpecializations =
1594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,			// mapEntryCount
1596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,	// pMap
1597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,			// dataSize
1598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,	// pData
1599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
160168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	Maybe<VkSampleCountFlagBits>				rasterSamples;
1602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkPipelineColorBlendAttachmentState>	attachmentBlendStates;
1603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 attachmentNdx = 0; attachmentNdx < renderInfo.getColorAttachmentCount(); attachmentNdx++)
1605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
160658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Attachment&	attachment	= renderInfo.getColorAttachment(attachmentNdx);
1607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples());
1609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		rasterSamples = attachment.getSamples();
1611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkPipelineColorBlendAttachmentState	attachmentBlendState =
1614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
161568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_FALSE,																								// blendEnable
161668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_SRC_ALPHA,																				// srcBlendColor
161768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,																	// destBlendColor
161868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_OP_ADD,																						// blendOpColor
161968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE,																					// srcBlendAlpha
162068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_FACTOR_ONE,																					// destBlendAlpha
162168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_BLEND_OP_ADD,																						// blendOpAlpha
162268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT,	// channelWriteMask
1623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentBlendStates.push_back(attachmentBlendState);
1626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (renderInfo.getDepthStencilAttachment())
1630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment& attachment = *renderInfo.getDepthStencilAttachment();
1632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples());
1634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		rasterSamples = attachment.getSamples();
1635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
1636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// If there are no attachment use single sample
1638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!rasterSamples)
163968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		rasterSamples = VK_SAMPLE_COUNT_1_BIT;
1640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineShaderStageCreateInfo shaderStages[2] =
1642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
1645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_NULL,												// pNext
164668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineShaderStageCreateFlags)0u,
164768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_VERTEX_BIT,								// stage
164868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vertexShaderModule,										// shader
164968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",
1650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&emptyShaderSpecializations
1651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},
1652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// sType
1654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_NULL,												// pNext
165568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			(VkPipelineShaderStageCreateFlags)0u,
165668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			VK_SHADER_STAGE_FRAGMENT_BIT,							// stage
165768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			fragmentShaderModule,									// shader
165868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			"main",
1659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&emptyShaderSpecializations
1660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
1661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkVertexInputBindingDescription vertexBinding =
1663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// binding
166558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		(deUint32)sizeof(tcu::Vec2),								// strideInBytes
166668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_VERTEX_INPUT_RATE_VERTEX,								// stepRate
1667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkVertexInputAttributeDescription vertexAttrib =
1669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// location
1671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// binding
16726971d4702d10f7b89483a663cb8d9df407b18075Slawomir Cygan		VK_FORMAT_R32G32_SFLOAT,									// format
1673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0u,															// offsetInBytes
1674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineVertexInputStateCreateInfo vertexInputState =
1676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	//	sType
1678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,													//	pNext
167968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineVertexInputStateCreateFlags)0u,
1680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,															//	bindingCount
1681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexBinding,												//	pVertexBindingDescriptions
1682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,															//	attributeCount
1683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&vertexAttrib,												//	pVertexAttributeDescriptions
1684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState =
1686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// sType
1688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
168968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineInputAssemblyStateCreateFlags)0u,
1690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// topology
1691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// primitiveRestartEnable
1692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkViewport viewport =
1694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(float)renderInfo.getViewportOffset().x(),	(float)renderInfo.getViewportOffset().y(),
1696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(float)renderInfo.getViewportSize().x(),	(float)renderInfo.getViewportSize().y(),
1697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f, 1.0f
1698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkRect2D scissor =
1700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ (deInt32)renderInfo.getViewportOffset().x(),	(deInt32)renderInfo.getViewportOffset().y() },
1702689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		{ renderInfo.getViewportSize().x(),				renderInfo.getViewportSize().y() }
1703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineViewportStateCreateInfo viewportState =
1705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,
170868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineViewportStateCreateFlags)0u,
1709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,
1710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&viewport,
1711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1u,
1712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		&scissor
1713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
171468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	const VkPipelineRasterizationStateCreateInfo rasterState =
1715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
171668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// sType
1717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
171868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineRasterizationStateCreateFlags)0u,
1719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,														// depthClipEnable
1720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// rasterizerDiscardEnable
172168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_POLYGON_MODE_FILL,											// fillMode
1722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_CULL_MODE_NONE,												// cullMode
172368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// frontFace
1724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// depthBiasEnable
1725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// depthBias
1726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// depthBiasClamp
1727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// slopeScaledDepthBias
1728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1.0f															// lineWidth
1729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineMultisampleStateCreateInfo multisampleState =
1731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// sType
1733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,														// pNext
173468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineMultisampleStateCreateFlags)0u,
1735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		*rasterSamples,													// rasterSamples
1736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,														// sampleShadingEnable
1737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		0.0f,															// minSampleShading
173868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		DE_NULL,														// pSampleMask
173968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,														// alphaToCoverageEnable
174068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_FALSE,														// alphaToOneEnable
1741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
174258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const size_t stencilIndex = renderInfo.getSubpassIndex();
1743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineDepthStencilStateCreateInfo depthStencilState =
1744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// sType
1746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,													// pNext
174768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineDepthStencilStateCreateFlags)0u,
1748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// depthTestEnable
1749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// depthWriteEnable
1750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_COMPARE_OP_ALWAYS,										// depthCompareOp
1751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,													// depthBoundsEnable
1752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_TRUE,													// stencilTestEnable
1753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilFailOp
1755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilPassOp
1756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilDepthFailOp
1757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_COMPARE_OP_ALWAYS,									// stencilCompareOp
1758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilCompareMask
1759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilWriteMask
176058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			((stencilIndex % 2) == 0) ? ~0x0u : 0x0u				// stencilReference
1761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},															// front
1762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
1763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilFailOp
1764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilPassOp
1765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_STENCIL_OP_REPLACE,									// stencilDepthFailOp
1766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VK_COMPARE_OP_ALWAYS,									// stencilCompareOp
1767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilCompareMask
1768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			~0u,													// stencilWriteMask
176958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			((stencilIndex % 2) == 0) ? ~0x0u : 0x0u				// stencilReference
1770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		},															// back
1771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1772ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski		0.0f,														// minDepthBounds;
1773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		1.0f														// maxDepthBounds;
1774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkPipelineColorBlendStateCreateInfo blendState =
1776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
1777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,			// sType
1778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_NULL,															// pNext
177968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineColorBlendStateCreateFlags)0u,
1780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_FALSE,															// logicOpEnable
1781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_LOGIC_OP_COPY,													// logicOp
1782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		(deUint32)attachmentBlendStates.size(),								// attachmentCount
1783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		attachmentBlendStates.empty() ? DE_NULL : &attachmentBlendStates[0],// pAttachments
1784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ 0.0f, 0.0f, 0.0f, 0.0f }											// blendConst
1785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkGraphicsPipelineCreateInfo createInfo =
1787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
178858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// sType
178958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		DE_NULL,											// pNext
179068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		(VkPipelineCreateFlags)0u,
1791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
179258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		2,													// stageCount
179358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		shaderStages,										// pStages
179458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
179558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&vertexInputState,									// pVertexInputState
179658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&inputAssemblyState,								// pInputAssemblyState
179758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		DE_NULL,											// pTessellationState
179858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&viewportState,										// pViewportState
179958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&rasterState,										// pRasterState
180058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&multisampleState,									// pMultisampleState
180158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&depthStencilState,									// pDepthStencilState
180258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		&blendState,										// pColorBlendState
180358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		(const VkPipelineDynamicStateCreateInfo*)DE_NULL,	// pDynamicState
180458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		pipelineLayout,										// layout
180558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
180658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		renderPass,											// renderPass
180758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		renderInfo.getSubpassIndex(),						// subpass
180858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		DE_NULL,											// basePipelineHandle
180958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		0u													// basePipelineIndex
1810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
1811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return createGraphicsPipeline(vk, device, DE_NULL, &createInfo);
1813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
1814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderer
1816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
1817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic:
181858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	SubpassRenderer (Context&										context,
181958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 const DeviceInterface&							vk,
182058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 VkDevice										device,
182158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 Allocator&										allocator,
182258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 VkRenderPass									renderPass,
182358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 VkFramebuffer									framebuffer,
182458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 VkCommandPool									commandBufferPool,
182558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 deUint32										queueFamilyIndex,
182658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 const vector<VkImage>&							attachmentImages,
182758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 const vector<pair<VkImageView, VkImageView> >&	attachmentViews,
182858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 const SubpassRenderInfo&						renderInfo,
182958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					 const vector<Attachment>&						attachmentInfos)
1830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		: m_renderInfo	(renderInfo)
1831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
183258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const deUint32							subpassIndex	= renderInfo.getSubpassIndex();
183358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		vector<VkDescriptorSetLayoutBinding>	bindings;
183458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
183558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		for (deUint32 colorAttachmentNdx = 0; colorAttachmentNdx < renderInfo.getColorAttachmentCount();  colorAttachmentNdx++)
183658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			m_colorAttachmentImages.push_back(attachmentImages[renderInfo.getColorAttachmentIndex(colorAttachmentNdx)]);
183758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
183858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (renderInfo.getDepthStencilAttachmentIndex())
183958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			m_depthStencilAttachmentImage = attachmentImages[*renderInfo.getDepthStencilAttachmentIndex()];
1840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getRenderQuad())
1842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
184358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const RenderQuad&	renderQuad	= *renderInfo.getRenderQuad();
184458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
184558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (renderInfo.getInputAttachmentCount() > 0)
184658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
184758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				deUint32								bindingIndex	= 0;
184858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
184958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < renderInfo.getInputAttachmentCount(); inputAttachmentNdx++)
185058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
185158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment			attachmentInfo	= attachmentInfos[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)];
185258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachmentInfo.getFormat());
185358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const bool					isDepthFormat	= tcu::hasDepthComponent(format.order);
185458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const bool					isStencilFormat	= tcu::hasStencilComponent(format.order);
185558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				bindingCount	= isDepthFormat && isStencilFormat ? 2u : 1u;
185658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
185758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (deUint32 bindingNdx = 0; bindingNdx < bindingCount; bindingNdx++)
185858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
185958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const VkDescriptorSetLayoutBinding binding =
186058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
186158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							bindingIndex,
186258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
186358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							1u,
186458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vk::VK_SHADER_STAGE_FRAGMENT_BIT,
186558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							DE_NULL
186658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						};
186758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
186858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						bindings.push_back(binding);
186958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						bindingIndex++;
187058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
187158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
187258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
187358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkDescriptorSetLayoutCreateInfo createInfo =
187458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
187558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
187658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					DE_NULL,
187758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
187858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					0u,
187958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					(deUint32)bindings.size(),
188058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					&bindings[0]
188158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				};
188258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
188358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				m_descriptorSetLayout = vk::createDescriptorSetLayout(vk, device, &createInfo);
188458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
188558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
188658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const VkDescriptorSetLayout			descriptorSetLayout		= *m_descriptorSetLayout;
1887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkPipelineLayoutCreateInfo	pipelineLayoutParams	=
1888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
188958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,			// sType;
189058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_NULL,												// pNext;
189168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				(vk::VkPipelineLayoutCreateFlags)0,
189258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				m_descriptorSetLayout ? 1u :0u ,						// setLayoutCount;
189358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				m_descriptorSetLayout ? &descriptorSetLayout : DE_NULL,	// pSetLayouts;
189458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				0u,														// pushConstantRangeCount;
189558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_NULL,												// pPushConstantRanges;
1896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
1897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_vertexShaderModule	= createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-vert"), 0u);
1899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_fragmentShaderModule	= createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-frag"), 0u);
1900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_pipelineLayout		= createPipelineLayout(vk, device, &pipelineLayoutParams);
190168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_pipeline				= createSubpassPipeline(vk, device, renderPass, *m_vertexShaderModule, *m_fragmentShaderModule, *m_pipelineLayout, m_renderInfo);
1902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
190368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_vertexBuffer			= createBuffer(vk, device, 0u, (VkDeviceSize)renderQuad.getVertexDataSize(), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 1u, &queueFamilyIndex);
1904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			m_vertexBufferMemory	= allocator.allocate(getBufferMemoryRequirements(vk, device, *m_vertexBuffer), MemoryRequirement::HostVisible);
1905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
1906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bindBufferMemory(vk, device, *m_vertexBuffer, m_vertexBufferMemory->getMemory(), m_vertexBufferMemory->getOffset());
1907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			uploadBufferData(vk, device, *m_vertexBufferMemory, renderQuad.getVertexDataSize(), renderQuad.getVertexPointer());
190858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
190958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (renderInfo.getInputAttachmentCount() > 0)
191058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
191158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
191258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkDescriptorPoolSize poolSize =
191358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
191458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
191558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						// \note Reserve 2 per input attachment since depthStencil attachments require 2.
191658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						renderInfo.getInputAttachmentCount() * 2u
191758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					};
191858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkDescriptorPoolCreateInfo createInfo =
191958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
192058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
192158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						DE_NULL,
192258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
192358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
192458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						// \note Reserve 2 per input attachment since depthStencil attachments require 2.
192558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						renderInfo.getInputAttachmentCount() * 2u,
192658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						1u,
192758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&poolSize
192858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					};
192958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
193058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					m_descriptorPool = vk::createDescriptorPool(vk, device, &createInfo);
193158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
193258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
193358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkDescriptorSetAllocateInfo	allocateInfo =
193458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
193558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
193658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						DE_NULL,
193758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
193858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						*m_descriptorPool,
193958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						1u,
194058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&descriptorSetLayout
194158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					};
194258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
194358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					m_descriptorSet = vk::allocateDescriptorSet(vk, device, &allocateInfo);
194458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
194558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
194658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vector<VkWriteDescriptorSet>	writes			(bindings.size());
194758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vector<VkDescriptorImageInfo>	imageInfos		(bindings.size());
194858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					deUint32						bindingIndex	= 0;
194958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
195058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < renderInfo.getInputAttachmentCount(); inputAttachmentNdx++)
195158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
19524dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski						const Attachment			attachmentInfo			= attachmentInfos[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)];
19534dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski						const tcu::TextureFormat	format					= mapVkFormat(attachmentInfo.getFormat());
19544dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski						const bool					isDepthFormat			= tcu::hasDepthComponent(format.order);
19554dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski						const bool					isStencilFormat			= tcu::hasStencilComponent(format.order);
19564dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski						const VkImageLayout			inputAttachmentLayout	= renderInfo.getInputAttachmentLayout(inputAttachmentNdx);
195758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
195858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (isDepthFormat && isStencilFormat)
195958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
196058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
196158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const VkDescriptorImageInfo	imageInfo =
196258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
196358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									(VkSampler)0,
196458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									attachmentViews[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)].first,
19654dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski									inputAttachmentLayout
196658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								};
196758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								imageInfos[bindingIndex] = imageInfo;
196858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
196958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
197058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const VkWriteDescriptorSet	write =
197158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									{
197258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
197358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										DE_NULL,
197458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
197558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										*m_descriptorSet,
197658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										bindingIndex,
197758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										0u,
197858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										1u,
197958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
198058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										&imageInfos[bindingIndex],
198158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										DE_NULL,
198258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										DE_NULL
198358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									};
198458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									writes[bindingIndex] = write;
198558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
198658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									bindingIndex++;
198758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								}
198858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
198958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
199058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const VkDescriptorImageInfo	imageInfo =
199158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
199258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									(VkSampler)0,
199358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									attachmentViews[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)].second,
19944dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski									inputAttachmentLayout
199558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								};
199658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								imageInfos[bindingIndex] = imageInfo;
199758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
199858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
199958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const VkWriteDescriptorSet	write =
200058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									{
200158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
200258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										DE_NULL,
200358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
200458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										*m_descriptorSet,
200558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										bindingIndex,
200658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										0u,
200758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										1u,
200858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
200958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										&imageInfos[bindingIndex],
201058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										DE_NULL,
201158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										DE_NULL
201258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									};
201358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									writes[bindingIndex] = write;
201458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
201558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									bindingIndex++;
201658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								}
201758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
201858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
201958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
202058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
202158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkDescriptorImageInfo	imageInfo =
202258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
202358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								(VkSampler)0,
202458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								attachmentViews[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)].first,
20254dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski								inputAttachmentLayout
202658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							};
202758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							imageInfos[bindingIndex] = imageInfo;
202858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
202958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
203058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const VkWriteDescriptorSet	write =
203158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
203258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
203358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									DE_NULL,
203458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
203558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									*m_descriptorSet,
203658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									bindingIndex,
203758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									0u,
203858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									1u,
203958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
204058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									&imageInfos[bindingIndex],
204158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									DE_NULL,
204258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									DE_NULL
204358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								};
204458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								writes[bindingIndex] = write;
204558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
204658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								bindingIndex++;
204758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
204858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
204958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
205058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
205158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vk.updateDescriptorSets(device, (deUint32)writes.size(), &writes[0], 0u, DE_NULL);
205258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
205358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
2054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.isSecondary())
2057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
205868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			m_commandBuffer = allocateCommandBuffer(vk, device, commandBufferPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
206057b41652a8af472d28943d13924edc3a32ec3884scygan			beginCommandBuffer(vk, *m_commandBuffer, vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, renderPass, subpassIndex, framebuffer, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
2061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushRenderCommands(vk, *m_commandBuffer);
2062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *m_commandBuffer);
2063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool isSecondary (void) const
2067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return m_commandBuffer;
2069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
207168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VkCommandBuffer getCommandBuffer (void) const
2072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		DE_ASSERT(isSecondary());
2074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		return *m_commandBuffer;
2075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	void pushRenderCommands (const DeviceInterface&		vk,
207868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							 VkCommandBuffer			commandBuffer)
2079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!m_renderInfo.getColorClears().empty())
2081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<ColorClear>&	colorClears	(m_renderInfo.getColorClears());
2083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (deUint32 attachmentNdx = 0; attachmentNdx < m_renderInfo.getColorAttachmentCount(); attachmentNdx++)
2085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const ColorClear&		colorClear	= colorClears[attachmentNdx];
208768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkClearAttachment	attachment	=
2088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
208968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_ASPECT_COLOR_BIT,
209068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					attachmentNdx,
209168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					makeClearValue(colorClear.getColor()),
209268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				};
209368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkClearRect		rect		=
209468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{
209568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{
209668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos						{ (deInt32)colorClear.getOffset().x(),	(deInt32)colorClear.getOffset().y()	},
2097689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos						{ colorClear.getSize().x(),				colorClear.getSize().y()			}
209868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					},					// rect
209968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0u,					// baseArrayLayer
210068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					1u,					// layerCount
2101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
2102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
210368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect);
2104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (m_renderInfo.getDepthStencilClear())
2108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
210958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const DepthStencilClear&	depthStencilClear	= *m_renderInfo.getDepthStencilClear();
211058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const deUint32				attachmentNdx		= m_renderInfo.getColorAttachmentCount();
211158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			tcu::TextureFormat			format				= mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat());
211258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const VkClearAttachment		attachment			=
2113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
21144c7a3aad422a9a456debcbf83f0af165c2471f5cscygan				(VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0)
21154c7a3aad422a9a456debcbf83f0af165c2471f5cscygan					| (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)),
211668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				attachmentNdx,
211768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				makeClearValueDepthStencil(depthStencilClear.getDepth(), depthStencilClear.getStencil())
2118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
211968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkClearRect				rect				=
2120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
212168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{
212268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					{ (deInt32)depthStencilClear.getOffset().x(),	(deInt32)depthStencilClear.getOffset().y()	},
2123689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos					{ depthStencilClear.getSize().x(),				depthStencilClear.getSize().y()				}
212468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				},							// rect
212568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				0u,							// baseArrayLayer
212668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				1u,							// layerCount
2127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
212968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect);
2130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
213258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		vector<VkImageMemoryBarrier>	selfDeps;
213358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VkPipelineStageFlags			srcStages = 0;
213458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VkPipelineStageFlags			dstStages = 0;
213558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
213658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < m_renderInfo.getInputAttachmentCount(); inputAttachmentNdx++)
213758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
213858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			for (deUint32 colorAttachmentNdx = 0; colorAttachmentNdx < m_renderInfo.getColorAttachmentCount(); colorAttachmentNdx++)
213958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
214058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (m_renderInfo.getInputAttachmentIndex(inputAttachmentNdx) == m_renderInfo.getColorAttachmentIndex(colorAttachmentNdx))
214158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
214258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkImageMemoryBarrier	barrier   =
214358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
214458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType
214558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						DE_NULL,										// pNext
214658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
214758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,			// srcAccessMask
214858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,			// dstAccessMask
214958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
215058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_IMAGE_LAYOUT_GENERAL,						// oldLayout
215158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_IMAGE_LAYOUT_GENERAL,						// newLayout
215258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
215358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex
215458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						VK_QUEUE_FAMILY_IGNORED,						// destQueueFamilyIndex
215558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
215658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						m_colorAttachmentImages[colorAttachmentNdx],	// image
215758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{												// subresourceRange
215858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							VK_IMAGE_ASPECT_COLOR_BIT,						// aspect
215958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							0,												// baseMipLevel
216058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							1,												// mipLevels
216158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							0,												// baseArraySlice
216258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							1												// arraySize
216358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
216458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					};
216558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
216658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					srcStages |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
216758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
216858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
216958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					selfDeps.push_back(barrier);
217058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
217158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
217258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
217358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (m_renderInfo.getDepthStencilAttachmentIndex() && (m_renderInfo.getInputAttachmentIndex(inputAttachmentNdx) == *m_renderInfo.getDepthStencilAttachmentIndex()))
217458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
217541544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				const tcu::TextureFormat	format		= mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat());
217641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				const bool					hasDepth	= hasDepthComponent(format.order);
217741544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				const bool					hasStencil	= hasStencilComponent(format.order);
217841544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				const VkImageMemoryBarrier	barrier		=
217941544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				{
218041544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// sType;
218141544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					DE_NULL,										// pNext;
218241544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi
218341544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,	// srcAccessMask
218441544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,			// dstAccessMask
218541544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi
218641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_IMAGE_LAYOUT_GENERAL,						// oldLayout
218741544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_IMAGE_LAYOUT_GENERAL,						// newLayout;
218841544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi
218941544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_QUEUE_FAMILY_IGNORED,						// srcQueueFamilyIndex;
219041544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					VK_QUEUE_FAMILY_IGNORED,						// destQueueFamilyIndex;
219141544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi
219241544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					m_depthStencilAttachmentImage,					// image;
219341544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					{												// subresourceRange;
219441544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi						(hasDepth ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
219541544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi							| (hasStencil ? (VkImageAspectFlags)VK_IMAGE_ASPECT_STENCIL_BIT : 0u),	// aspect;
219641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi						0,															// baseMipLevel;
219741544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi						1,															// mipLevels;
219841544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi						0,															// baseArraySlice;
219941544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi						1															// arraySize;
220041544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi					}
220141544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				};
220258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
220341544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				srcStages |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
220441544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
220558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
220641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi				selfDeps.push_back(barrier);
220758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
220858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
220958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
221058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (!selfDeps.empty())
221158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			vk.cmdPipelineBarrier(commandBuffer, srcStages, dstStages, VK_DEPENDENCY_BY_REGION_BIT, 0, DE_NULL, 0, DE_NULL, (deUint32)selfDeps.size(), &selfDeps[0]);
221258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
2213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (m_renderInfo.getRenderQuad())
2214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkDeviceSize	offset			= 0;
2216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBuffer		vertexBuffer	= *m_vertexBuffer;
2217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
221958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
222058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (m_descriptorSet)
222158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
222258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkDescriptorSet descriptorSet = *m_descriptorSet;
222358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vk.cmdBindDescriptorSets(commandBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0u, 1u, &descriptorSet, 0u, NULL);
222458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
222558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
2226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdBindVertexBuffers(commandBuffer, 0u, 1u, &vertexBuffer, &offset);
2227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vk.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u);
2228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate:
223258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const SubpassRenderInfo		m_renderInfo;
223358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkCommandBuffer>		m_commandBuffer;
223458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkPipeline>			m_pipeline;
223558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkDescriptorSetLayout>	m_descriptorSetLayout;
223658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkPipelineLayout>		m_pipelineLayout;
223758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
223858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkShaderModule>		m_vertexShaderModule;
223958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkShaderModule>		m_fragmentShaderModule;
224058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
224158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkDescriptorPool>		m_descriptorPool;
224258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkDescriptorSet>		m_descriptorSet;
224358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Move<VkBuffer>				m_vertexBuffer;
224458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	de::MovePtr<Allocation>		m_vertexBufferMemory;
224558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<VkImage>				m_colorAttachmentImages;
224658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	VkImage						m_depthStencilAttachmentImage;
2247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
2248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushImageInitializationCommands (const DeviceInterface&								vk,
225068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos									  VkCommandBuffer										commandBuffer,
2251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<Attachment>&								attachmentInfo,
2252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
2253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  deUint32												queueIndex,
2254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi									  const vector<Maybe<VkClearValue> >&					clearValues)
2255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	initializeLayouts;
2258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!clearValues[attachmentNdx])
2262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageMemoryBarrier barrier =
2265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2266ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,							// sType;
2267ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				DE_NULL,														// pNext;
2268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2269ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				(VkAccessFlags)0,												// srcAccessMask
2270ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				getAllMemoryReadFlags() | VK_ACCESS_TRANSFER_WRITE_BIT,			// dstAccessMask
2271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2272ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				VK_IMAGE_LAYOUT_UNDEFINED,										// oldLayout
2273ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,							// newLayout;
2274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2275ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				queueIndex,														// srcQueueFamilyIndex;
2276ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				queueIndex,														// destQueueFamilyIndex;
2277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2278ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				attachmentResources[attachmentNdx]->getImage(),					// image;
2279ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				{																// subresourceRange;
2280ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),		// aspect;
2281ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					0,																	// baseMipLevel;
2282ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					1,																	// mipLevels;
2283ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					0,																	// baseArraySlice;
2284ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					1																	// arraySize;
2285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			initializeLayouts.push_back(barrier);
2289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!initializeLayouts.empty())
22925b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT,
22935b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser								  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
2294689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
2295689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkBufferMemoryBarrier*)DE_NULL,
2296689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)initializeLayouts.size(), &initializeLayouts[0]);
2297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!clearValues[attachmentNdx])
2302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			continue;
2303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat format = mapVkFormat(attachmentInfo[attachmentNdx].getFormat());
2305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (hasStencilComponent(format.order) || hasDepthComponent(format.order))
2307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float						clearNan		= tcu::Float32::nan().asFloat();
2309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const float						clearDepth		= hasDepthComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.depth : clearNan;
231058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const deUint32					clearStencil	= hasStencilComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.stencil : 0xDEu;
2311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkClearDepthStencilValue	depthStencil	=
2312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearDepth,
2314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				clearStencil
2315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageSubresourceRange range =
2317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2318d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz				(VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0)
2319d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz									 | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)),
2320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
2321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1,
2322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
2323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1
2324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
232668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearDepthStencilImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencil, 1, &range);
2327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkImageSubresourceRange	range		=
2331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
233258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				VK_IMAGE_ASPECT_COLOR_BIT,	// aspectMask;
233358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				0,							// baseMipLevel;
233458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				1,							// mipLevels;
233558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				0,							// baseArrayLayer;
233658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				1							// layerCount;
2337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkClearColorValue			clearColor	= clearValues[attachmentNdx]->color;
2339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
234068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdClearColorImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &range);
2341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	renderPassLayouts;
2346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
234958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const VkImageLayout			oldLayout	= clearValues[attachmentNdx] ? VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED;
235058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const VkImageMemoryBarrier	barrier		=
2351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2352ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,					// sType;
2353ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				DE_NULL,												// pNext;
2354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2355ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				(oldLayout != VK_IMAGE_LAYOUT_UNDEFINED ? getAllMemoryWriteFlags() : (VkAccessFlags)0),					// srcAccessMask
2356ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				getAllMemoryReadFlags() | getMemoryFlagsForLayout(attachmentInfo[attachmentNdx].getInitialLayout()),	// dstAccessMask
2357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2358ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				oldLayout,												// oldLayout
2359ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				attachmentInfo[attachmentNdx].getInitialLayout(),		// newLayout;
2360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2361ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				queueIndex,												// srcQueueFamilyIndex;
2362ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				queueIndex,												// destQueueFamilyIndex;
2363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2364ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				attachmentResources[attachmentNdx]->getImage(),			// image;
2365ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				{														// subresourceRange;
2366ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),		// aspect;
2367ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					0,																	// baseMipLevel;
2368ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					1,																	// mipLevels;
2369ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					0,																	// baseArraySlice;
2370ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					1																	// arraySize;
2371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			renderPassLayouts.push_back(barrier);
2375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!renderPassLayouts.empty())
23785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT,
23795b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser								  VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
2380689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
2381689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkBufferMemoryBarrier*)DE_NULL,
2382689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)renderPassLayouts.size(), &renderPassLayouts[0]);
2383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
238658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid pushRenderPassCommands (const DeviceInterface&							vk,
238758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 VkCommandBuffer								commandBuffer,
238858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 VkRenderPass									renderPass,
238958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 VkFramebuffer									framebuffer,
239058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 const vector<de::SharedPtr<SubpassRenderer> >&	subpassRenderers,
239158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 const UVec2&									renderPos,
239258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 const UVec2&									renderSize,
239358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 const vector<Maybe<VkClearValue> >&			renderPassClearValues,
239458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							 TestConfig::RenderTypes						render)
2395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const float				clearNan				= tcu::Float32::nan().asFloat();
2397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<VkClearValue>	attachmentClearValues;
2398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassClearValues.size(); attachmentNdx++)
2400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPassClearValues[attachmentNdx])
2402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentClearValues.push_back(*renderPassClearValues[attachmentNdx]);
2403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
2404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentClearValues.push_back(makeClearValueColorF32(clearNan, clearNan, clearNan, clearNan));
2405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkRect2D renderArea =
2409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2410689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ (deInt32)renderPos.x(),	(deInt32)renderPos.y()	},
2411689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ renderSize.x(),			renderSize.y()			}
2412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
2413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpassRenderers.size(); subpassNdx++)
2415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
241668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			const VkSubpassContents	contents = subpassRenderers[subpassNdx]->isSecondary() ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE;
2417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpassNdx == 0)
2419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				cmdBeginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, (deUint32)attachmentClearValues.size(), attachmentClearValues.empty() ? DE_NULL : &attachmentClearValues[0], contents);
2420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
2421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				vk.cmdNextSubpass(commandBuffer, contents);
2422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (render)
2424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
242568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				if (contents == VK_SUBPASS_CONTENTS_INLINE)
2426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					subpassRenderers[subpassNdx]->pushRenderCommands(vk, commandBuffer);
2428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
242968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				else if (contents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS)
2430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
243168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					const VkCommandBuffer cmd = subpassRenderers[subpassNdx]->getCommandBuffer();
2432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					vk.cmdExecuteCommands(commandBuffer, 1, &cmd);
2433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else
2435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_FATAL("Invalid contents");
2436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vk.cmdEndRenderPass(commandBuffer);
2440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushReadImagesToBuffers (const DeviceInterface&								vk,
244468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos							  VkCommandBuffer										commandBuffer,
2445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  deUint32												queueIndex,
2446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
2448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<Attachment>&								attachmentInfo,
2449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const vector<bool>&									isLazy,
2450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							  const UVec2&											targetSize)
2452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageMemoryBarrier>	imageBarriers;
2455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isLazy[attachmentNdx])
2459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2461ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski			const VkImageLayout			oldLayout	= attachmentInfo[attachmentNdx].getFinalLayout();
2462ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski			const VkImageMemoryBarrier	barrier		=
2463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2464ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,							// sType
2465ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				DE_NULL,														// pNext
2466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2467ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				getAllMemoryWriteFlags() | getMemoryFlagsForLayout(oldLayout),	// srcAccessMask
2468ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				getAllMemoryReadFlags(),										// dstAccessMask
2469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2470ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				oldLayout,														// oldLayout
2471ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,							// newLayout
2472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2473ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				queueIndex,														// srcQueueFamilyIndex
2474ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				queueIndex,														// destQueueFamilyIndex
2475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2476ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				attachmentResources[attachmentNdx]->getImage(),					// image
2477ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski				{																// subresourceRange
2478ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()),		// aspect;
2479ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					0,																	// baseMipLevel
2480ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					1,																	// mipLevels
2481ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					0,																	// baseArraySlice
2482ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski					1																	// arraySize
2483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			imageBarriers.push_back(barrier);
2487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!imageBarriers.empty())
2490689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			vk.cmdPipelineBarrier(commandBuffer,
2491689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2492689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2493689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (VkDependencyFlags)0,
2494689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
2495689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkBufferMemoryBarrier*)DE_NULL,
2496689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)imageBarriers.size(), &imageBarriers[0]);
2497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (isLazy[attachmentNdx])
2502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			continue;
2503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat::ChannelOrder	order	= mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order;
2505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkBufferImageCopy					rect	=
2506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferOffset
2508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferRowLength
2509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			0, // bufferImageHeight
2510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{							// imageSubresource
25115489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos				(vk::VkImageAspectFlags)getPrimaryImageAspect(mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order),	// aspect
251294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos				0,						// mipLevel
2513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,						// arraySlice
2514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				1						// arraySize
2515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			},
251694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			{ 0, 0, 0 },				// imageOffset
2517689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ targetSize.x(), targetSize.y(), 1u }		// imageExtent
2518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
2519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
252068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getBuffer(), 1, &rect);
2521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (tcu::TextureFormat::DS == order)
2523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBufferImageCopy stencilRect =
2525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
252658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				0,										// bufferOffset
252758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				0,										// bufferRowLength
252858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				0,										// bufferImageHeight
252968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				{									// imageSubresource
253068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					VK_IMAGE_ASPECT_STENCIL_BIT,	// aspect
253168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0,								// mipLevel
253268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					0,								// arraySlice
253358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					1								// arraySize
2534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				},
253558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{ 0, 0, 0 },							// imageOffset
253658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{ targetSize.x(), targetSize.y(), 1u }	// imageExtent
2537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
253968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getSecondaryBuffer(), 1, &stencilRect);
2540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkBufferMemoryBarrier>	bufferBarriers;
2545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++)
2547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (isLazy[attachmentNdx])
2549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				continue;
2550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat::ChannelOrder	order			= mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order;
2552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkBufferMemoryBarrier				bufferBarrier	=
2553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_NULL,
2556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
255768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryWriteFlags(),
255868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				getAllMemoryReadFlags(),
2559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,
2561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueIndex,
2562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getBuffer(),
2564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				0,
2565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentResources[attachmentNdx]->getBufferSize()
2566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			};
2567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			bufferBarriers.push_back(bufferBarrier);
2569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::TextureFormat::DS == order)
2571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
2572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkBufferMemoryBarrier secondaryBufferBarrier =
2573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_NULL,
2576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
257768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					getAllMemoryWriteFlags(),
257868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					getAllMemoryReadFlags(),
2579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					queueIndex,
2581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					queueIndex,
2582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getSecondaryBuffer(),
2584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					0,
2585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getSecondaryBufferSize()
2586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
2587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				bufferBarriers.push_back(secondaryBufferBarrier);
2589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!bufferBarriers.empty())
2593689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			vk.cmdPipelineBarrier(commandBuffer,
2594689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2595689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  getAllPipelineStageFlags(),
2596689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (VkDependencyFlags)0,
2597689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkMemoryBarrier*)DE_NULL,
2598689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  (deUint32)bufferBarriers.size(), &bufferBarriers[0],
2599689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos								  0, (const VkImageMemoryBarrier*)DE_NULL);
2600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
260358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviclass PixelValue
260458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
260558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvipublic:
260658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				PixelValue		(const Maybe<bool>&	x = nothing<bool>(),
260758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								 const Maybe<bool>&	y = nothing<bool>(),
260858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								 const Maybe<bool>&	z = nothing<bool>(),
260958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								 const Maybe<bool>&	w = nothing<bool>());
261058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
261158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	void		setUndefined	(size_t ndx);
261258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	void		setValue		(size_t ndx, bool value);
261358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	Maybe<bool>	getValue		(size_t ndx) const;
261458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
261558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviprivate:
261658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	deUint16	m_status;
261758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi};
261858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
261958a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviPixelValue::PixelValue (const Maybe<bool>&	x,
262058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const Maybe<bool>&	y,
262158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const Maybe<bool>&	z,
262258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const Maybe<bool>&	w)
262358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	: m_status (0)
2624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
262558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Maybe<bool> values[] =
262658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
262758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		x, y, z, w
262858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	};
2629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
263058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(values); ndx++)
2631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
263258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (values[ndx])
263358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			setValue(ndx, *values[ndx]);
263458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		else
263558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			setUndefined(ndx);
263658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
2637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
263858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(m_status <= 0xFFu);
263958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
264058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
264158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid PixelValue::setUndefined (size_t ndx)
264258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
264358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(ndx < 4);
264458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(m_status <= 0xFFu);
264558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
264658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	m_status &= (deUint16)~(0x1u << (deUint16)(ndx * 2));
264758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(m_status <= 0xFFu);
264858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
264958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
265058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid PixelValue::setValue (size_t ndx, bool value)
265158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
265258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(ndx < 4);
265358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(m_status <= 0xFFu);
265458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
265558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	m_status |= (deUint16)(0x1u << (ndx * 2));
265658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
265758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	if (value)
265858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		m_status |= (deUint16)(0x1u << (ndx * 2 + 1));
265958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	else
266058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		m_status &= (deUint16)~(0x1u << (deUint16)(ndx * 2 + 1));
266158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
266258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(m_status <= 0xFFu);
266358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
266458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
266558a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviMaybe<bool> PixelValue::getValue (size_t ndx) const
266658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
266758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(ndx < 4);
266858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(m_status <= 0xFFu);
266958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
267058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	if ((m_status & (0x1u << (deUint16)(ndx * 2))) != 0)
267158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
267258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		return just((m_status & (0x1u << (deUint32)(ndx * 2 + 1))) != 0);
2673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
267558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		return nothing<bool>();
267658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
267758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
267858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid clearReferenceValues (vector<PixelValue>&	values,
267958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						   const UVec2&			targetSize,
268058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						   const UVec2&			offset,
268158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						   const UVec2&			size,
268258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						   const BVec4&			mask,
268358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						   const PixelValue&	value)
268458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
268558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(targetSize.x() * targetSize.y() == (deUint32)values.size());
268658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(offset.x() + size.x() <= targetSize.x());
268758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(offset.y() + size.y() <= targetSize.y());
268858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
268958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (deUint32 y = offset.y(); y < offset.y() + size.y(); y++)
269058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (deUint32 x = offset.x(); x < offset.x() + size.x(); x++)
2691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
269258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		for (int compNdx = 0; compNdx < 4; compNdx++)
2693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
269458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (mask[compNdx])
269558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
269658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (value.getValue(compNdx))
269758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					values[x + y * targetSize.x()].setValue(compNdx, *value.getValue(compNdx));
269858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else
269958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					values[x + y * targetSize.x()].setUndefined(compNdx);
270058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
270158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
270258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
270358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
2704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
270558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid markUndefined (vector<PixelValue>&	values,
270658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const BVec4&		mask,
270758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2&		targetSize,
270858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2&		offset,
270958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2&		size)
271058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
271158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(targetSize.x() * targetSize.y() == (deUint32)values.size());
271258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
271358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (deUint32 y = offset.y(); y < offset.y() + size.y(); y++)
271458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (deUint32 x = offset.x(); x < offset.x() + size.x(); x++)
271558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
271658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		for (int compNdx = 0; compNdx < 4; compNdx++)
271758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
271858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (mask[compNdx])
271958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				values[x + y * targetSize.x()].setUndefined(compNdx);
2720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
272158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
272258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
272358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
272458a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviPixelValue clearValueToPixelValue (const VkClearValue&			value,
272558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								   const tcu::TextureFormat&	format)
272658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
272758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const bool	isDepthAttachment			= hasDepthComponent(format.order);
272858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const bool	isStencilAttachment			= hasStencilComponent(format.order);
272958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const bool	isDepthOrStencilAttachment	= isDepthAttachment || isStencilAttachment;
273058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	PixelValue	pixelValue;
273158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
273258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	if (isDepthOrStencilAttachment)
273358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
273458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (isDepthAttachment)
2735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
273658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (value.depthStencil.depth == 1.0f)
273758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				pixelValue.setValue(0, true);
273858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else if (value.depthStencil.depth == 0.0f)
273958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				pixelValue.setValue(0, false);
274058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else
274158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_FATAL("Unknown depth value");
274258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
2743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
274458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (isStencilAttachment)
274558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
274658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (value.depthStencil.stencil == 0xFFu)
274758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				pixelValue.setValue(1, true);
274858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else if (value.depthStencil.stencil == 0x0u)
274958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				pixelValue.setValue(1, false);
275058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else
275158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_FATAL("Unknown stencil value");
2752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
275358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
275458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	else
275558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
275658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
275758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const tcu::BVec4				channelMask		= tcu::getTextureFormatChannelMask(format);
275858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
275958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		switch (channelClass)
2760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
276158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
276258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (int i = 0; i < 4; i++)
276358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
276458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (channelMask[i])
276558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
276658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (value.color.int32[i] == 1)
276758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							pixelValue.setValue(i, true);
276858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else if (value.color.int32[i] == 0)
276958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							pixelValue.setValue(i, false);
277058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
277158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							DE_FATAL("Unknown clear color value");
277258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
277358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
277458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				break;
277558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
277658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
277758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (int i = 0; i < 4; i++)
277858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
277958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (channelMask[i])
278058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
278158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (value.color.uint32[i] == 1u)
278258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							pixelValue.setValue(i, true);
278358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else if (value.color.uint32[i] == 0u)
278458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							pixelValue.setValue(i, false);
278558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
278658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							DE_FATAL("Unknown clear color value");
278758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
278858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
278958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				break;
279058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
279158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
279258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
279358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
279458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (int i = 0; i < 4; i++)
279558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
279658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (channelMask[i])
279758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
279858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (value.color.float32[i] == 1.0f)
279958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							pixelValue.setValue(i, true);
280058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else if (value.color.float32[i] == 0.0f)
280158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							pixelValue.setValue(i, false);
280258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
280358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							DE_FATAL("Unknown clear color value");
280458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
280558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
280658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				break;
2807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
280858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			default:
280958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_FATAL("Unknown channel class");
2810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
281358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return pixelValue;
2814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
2815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
281658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid renderReferenceValues (vector<vector<PixelValue> >&		referenceAttachments,
2817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const RenderPass&					renderPassInfo,
2818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						targetSize,
2819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<Maybe<VkClearValue> >&	imageClearValues,
2820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<Maybe<VkClearValue> >&	renderPassClearValues,
2821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const vector<SubpassRenderInfo>&	subpassRenderInfo,
2822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						renderPos,
2823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi							const UVec2&						renderSize)
2824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
2825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&	subpasses		= renderPassInfo.getSubpasses();
2826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>			attachmentUsed	(renderPassInfo.getAttachments().size(), false);
2827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	referenceAttachments.resize(renderPassInfo.getAttachments().size());
2829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
2831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
283258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Attachment			attachment	= renderPassInfo.getAttachments()[attachmentNdx];
283358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const tcu::TextureFormat	format		= mapVkFormat(attachment.getFormat());
283458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		vector<PixelValue>&			reference	= referenceAttachments[attachmentNdx];
2835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
283658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		reference.resize(targetSize.x() * targetSize.y());
2837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (imageClearValues[attachmentNdx])
283958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			clearReferenceValues(reference, targetSize, UVec2(0, 0), targetSize, BVec4(true), clearValueToPixelValue(*imageClearValues[attachmentNdx], format));
2840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
2841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
2843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
2844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&						subpass				= subpasses[subpassNdx];
2845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const SubpassRenderInfo&			renderInfo			= subpassRenderInfo[subpassNdx];
2846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
2847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Apply load op if attachment was used for the first time
2849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < colorAttachments.size(); attachmentNdx++)
2850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32 attachmentIndex = colorAttachments[attachmentNdx].getAttachment();
2852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!attachmentUsed[attachmentIndex])
2854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
285558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const Attachment&			attachment	= renderPassInfo.getAttachments()[attachmentIndex];
285658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<PixelValue>&			reference	= referenceAttachments[attachmentIndex];
285758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::TextureFormat	format		= mapVkFormat(attachment.getFormat());
2858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
285958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_ASSERT(!tcu::hasDepthComponent(format.order));
286058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				DE_ASSERT(!tcu::hasStencilComponent(format.order));
2861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
286358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					clearReferenceValues(reference, targetSize, renderPos, renderSize, BVec4(true), clearValueToPixelValue(*renderPassClearValues[attachmentIndex], format));
2864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
286558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					markUndefined(reference, BVec4(true), targetSize, renderPos, renderSize);
2866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentUsed[attachmentIndex] = true;
2868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
287194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos		// Apply load op to depth/stencil attachment if it was used for the first time
287258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
2873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment();
2875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			// Apply load op if attachment was used for the first time
2877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (!attachmentUsed[attachmentIndex])
2878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
287958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const Attachment&			attachment	= renderPassInfo.getAttachments()[attachmentIndex];
288058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<PixelValue>&			reference	= referenceAttachments[attachmentIndex];
288158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::TextureFormat	format		= mapVkFormat(attachment.getFormat());
2882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
288358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (tcu::hasDepthComponent(format.order))
2884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
288658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						clearReferenceValues(reference, targetSize, renderPos, renderSize, BVec4(true, false, false, false), clearValueToPixelValue(*renderPassClearValues[attachmentIndex], format));
2887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
288858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						markUndefined(reference, BVec4(true, false, false, false), targetSize, renderPos, renderSize);
2889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
2890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
289158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (tcu::hasStencilComponent(format.order))
2892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
2893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
289458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						clearReferenceValues(reference, targetSize, renderPos, renderSize, BVec4(false, true, false, false), clearValueToPixelValue(*renderPassClearValues[attachmentIndex], format));
2895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					else if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE)
289658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						markUndefined(reference, BVec4(false, true, false, false), targetSize, renderPos, renderSize);
289758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
2898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
289958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				attachmentUsed[attachmentIndex] = true;
2900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
2901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t colorClearNdx = 0; colorClearNdx < renderInfo.getColorClears().size(); colorClearNdx++)
2904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
290558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const ColorClear&			colorClear		= renderInfo.getColorClears()[colorClearNdx];
290658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const UVec2					offset			= colorClear.getOffset();
290758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const UVec2					size			= colorClear.getSize();
290858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const deUint32				attachmentIndex	= subpass.getColorAttachments()[colorClearNdx].getAttachment();
290958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
291058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
291158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			vector<PixelValue>&			reference		= referenceAttachments[attachmentIndex];
291258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			VkClearValue				value;
2913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			value.color = colorClear.getColor();
2915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
291658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			clearReferenceValues(reference, targetSize, offset, size, BVec4(true), clearValueToPixelValue(value, format));
2917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getDepthStencilClear())
2920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
292158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const DepthStencilClear&	dsClear			= *renderInfo.getDepthStencilClear();
292258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const UVec2					offset			= dsClear.getOffset();
292358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const UVec2					size			= dsClear.getSize();
292458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const deUint32				attachmentIndex	= subpass.getDepthStencilAttachment().getAttachment();
292558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
292658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
292758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const bool					hasStencil		= tcu::hasStencilComponent(format.order);
292858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const bool					hasDepth		= tcu::hasDepthComponent(format.order);
292958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			vector<PixelValue>&			reference		= referenceAttachments[attachmentIndex];
293058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			VkClearValue				value;
2931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
293258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			value.depthStencil.depth = dsClear.getDepth();
293358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			value.depthStencil.stencil = dsClear.getStencil();
2934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
293558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			clearReferenceValues(reference, targetSize, offset, size, BVec4(hasDepth, hasStencil, false, false), clearValueToPixelValue(value, format));
2936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
2937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
2938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderInfo.getRenderQuad())
2939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
2940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const RenderQuad&	renderQuad	= *renderInfo.getRenderQuad();
294158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const Vec2			posA		= renderQuad.getCornerA();
294258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const Vec2			posB		= renderQuad.getCornerB();
2943c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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);
2944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Vec2			p			= Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f);
294558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const IVec2			posAI		(deRoundFloatToInt32(origin.x() + (p.x() * posA.x())),
294658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											 deRoundFloatToInt32(origin.y() + (p.y() * posA.y())));
294758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const IVec2			posBI		(deRoundFloatToInt32(origin.x() + (p.x() * posB.x())),
294858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											 deRoundFloatToInt32(origin.y() + (p.y() * posB.y())));
2949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
295058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			DE_ASSERT(posAI.x() < posBI.x());
295158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			DE_ASSERT(posAI.y() < posBI.y());
2952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
295358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (subpass.getInputAttachments().empty())
295458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
295558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++)
295658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
295758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getColorAttachments()[attachmentRefNdx].getAttachment();
295858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
295958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
296058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::BVec4			channelMask		= tcu::getTextureFormatChannelMask(format);
296158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vector<PixelValue>&			reference		= referenceAttachments[attachmentIndex];
296258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
296358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (int y = posAI.y(); y < (int)posBI.y(); y++)
296458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (int x = posAI.x(); x < (int)posBI.x(); x++)
296558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
296658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (int compNdx = 0; compNdx < 4; compNdx++)
296758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
296858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const size_t	index	= subpassNdx + attachmentIndex + compNdx;
296958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const BoolOp	op		= boolOpFromIndex(index);
297058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const bool		boolX	= x % 2 == (int)(index % 2);
297158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const bool		boolY	= y % 2 == (int)((index / 2) % 2);
297258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
297358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if (channelMask[compNdx])
297458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								reference[x + y * targetSize.x()].setValue(compNdx, performBoolOp(op, boolX, boolY));
297558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
297658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
297758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
2978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
297958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
2980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
298158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getDepthStencilAttachment().getAttachment();
298258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
298358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
298458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vector<PixelValue>&			reference		= referenceAttachments[attachmentIndex];
2985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
298658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (int y = posAI.y(); y < (int)posBI.y(); y++)
298758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (int x = posAI.x(); x < (int)posBI.x(); x++)
298858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
298958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (tcu::hasDepthComponent(format.order))
299058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
299158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const size_t	index	= subpassNdx + 1;
299258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const BoolOp	op		= boolOpFromIndex(index);
299358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const bool		boolX	= x % 2 == (int)(index % 2);
299458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const bool		boolY	= y % 2 == (int)((index / 2) % 2);
299558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
299658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							reference[x + y * targetSize.x()].setValue(0, performBoolOp(op, boolX, boolY));
299758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
299858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
299958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (tcu::hasStencilComponent(format.order))
300058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
300158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const size_t	index	= subpassNdx;
300258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							reference[x + y * targetSize.x()].setValue(1, (index % 2) == 0);
300358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
300458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
3005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
300758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else
3008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
300958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				size_t					outputComponentCount	= 0;
301058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<Maybe<bool> >	inputs;
3011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.x() < posBI.x());
3013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_ASSERT(posAI.y() < posBI.y());
3014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
301558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++)
3016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
301758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getColorAttachments()[attachmentRefNdx].getAttachment();
301858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
301958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
302058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const int					componentCount	= tcu::getNumUsedChannels(format.order);
3021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
302258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					outputComponentCount += (size_t)componentCount;
3023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
302558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
302658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					outputComponentCount++;
3027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
302858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (int y = posAI.y(); y < (int)posBI.y(); y++)
302958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (int x = posAI.x(); x < (int)posBI.x(); x++)
303058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
303158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t inputAttachmentNdx = 0; inputAttachmentNdx < subpass.getInputAttachments().size(); inputAttachmentNdx++)
303258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
303358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const deUint32				attachmentIndex	= subpass.getInputAttachments()[inputAttachmentNdx].getAttachment();
303458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
303558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
303658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const int					componentCount	= tcu::getNumUsedChannels(format.order);
3037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
303858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (int compNdx = 0; compNdx < componentCount; compNdx++)
303958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							inputs.push_back(referenceAttachments[attachmentIndex][x + y * targetSize.x()].getValue(compNdx));
304058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
3041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
304258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t inputsPerOutput = inputs.size() >= outputComponentCount
304358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													? ((inputs.size() / outputComponentCount)
304458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														+ ((inputs.size() % outputComponentCount) != 0 ? 1 : 0))
304558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													: 1;
3046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
304758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					size_t outputValueNdx = 0;
3048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
304958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++)
305058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
305158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const deUint32				attachmentIndex	= subpass.getColorAttachments()[attachmentRefNdx].getAttachment();
305258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
305358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
305458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<PixelValue>&			reference		= referenceAttachments[attachmentIndex];
305558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const int					componentCount	= tcu::getNumUsedChannels(format.order);
305658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
305758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (int compNdx = 0; compNdx < componentCount; compNdx++)
305858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
305958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const size_t	index	= subpassNdx + attachmentIndex + outputValueNdx;
306058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const BoolOp	op		= boolOpFromIndex(index);
306158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const bool		boolX	= x % 2 == (int)(index % 2);
306258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const bool		boolY	= y % 2 == (int)((index / 2) % 2);
306358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							Maybe<bool>		output	= tcu::just(performBoolOp(op, boolX, boolY));
306458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
306558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							for (size_t i = 0; i < inputsPerOutput; i++)
306658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
306758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								if (!output)
306858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									break;
306958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								else if (!inputs[((outputValueNdx + compNdx) * inputsPerOutput + i) % inputs.size()])
307058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									output = tcu::nothing<bool>();
307158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								else
307258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									output = (*output) == (*inputs[((outputValueNdx + compNdx) * inputsPerOutput + i) % inputs.size()]);
307358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
307458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
307558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if (output)
307658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								reference[x + y * targetSize.x()].setValue(compNdx, *output);
307758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							else
307858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								reference[x + y * targetSize.x()].setUndefined(compNdx);
307958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
308058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
308158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						outputValueNdx += componentCount;
308258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
3083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
308458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
308558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
308658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const deUint32		attachmentIndex	= subpass.getDepthStencilAttachment().getAttachment();
308758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<PixelValue>&	reference		= referenceAttachments[attachmentIndex];
308858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const size_t		index			= subpassNdx + attachmentIndex;
308958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const BoolOp		op				= boolOpFromIndex(index);
309058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const bool			boolX			= x % 2 == (int)(index % 2);
309158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const bool			boolY			= y % 2 == (int)((index / 2) % 2);
309258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						Maybe<bool>			output			= tcu::just(performBoolOp(op, boolX, boolY));
309358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
309458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t i = 0; i < inputsPerOutput; i++)
309558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
309658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if (!output)
309758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								break;
309858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							else if (inputs[(outputValueNdx * inputsPerOutput + i) % inputs.size()])
309958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								output = (*output) == (*inputs[(outputValueNdx * inputsPerOutput + i) % inputs.size()]);
310058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							else
310158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								output = tcu::nothing<bool>();
310258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
310358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
310458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (output)
310558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							reference[x + y * targetSize.x()].setValue(0, *output);
310658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
310758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							reference[x + y * targetSize.x()].setUndefined(0);
310858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
3109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
311058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					inputs.clear();
311158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
3112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
311358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
311458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
311558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getDepthStencilAttachment().getAttachment();
311658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment&			attachment		= renderPassInfo.getAttachments()[attachmentIndex];
311758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
311858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vector<PixelValue>&			reference		= referenceAttachments[attachmentIndex];
3119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
312058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (tcu::hasStencilComponent(format.order))
312158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
312258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (int y = posAI.y(); y < (int)posBI.y(); y++)
312358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (int x = posAI.x(); x < (int)posBI.x(); x++)
312458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
312558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const size_t	index	= subpassNdx;
312658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							reference[x + y * targetSize.x()].setValue(1, (index % 2) == 0);
312758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
312858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
312958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
313058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
3131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
313458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	// Mark all attachments that were used but not stored as undefined
313558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (size_t attachmentIndex = 0; attachmentIndex < renderPassInfo.getAttachments().size(); attachmentIndex++)
3136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
313758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Attachment			attachment					= renderPassInfo.getAttachments()[attachmentIndex];
313858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const tcu::TextureFormat	format						= mapVkFormat(attachment.getFormat());
313958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		vector<PixelValue>&			reference					= referenceAttachments[attachmentIndex];
314058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					isStencilAttachment			= hasStencilComponent(format.order);
314158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					isDepthOrStencilAttachment	= hasDepthComponent(format.order) || isStencilAttachment;
3142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
314358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (attachmentUsed[attachmentIndex] && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
3144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
314558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (isDepthOrStencilAttachment)
314658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				markUndefined(reference, BVec4(true, false, false, false), targetSize, renderPos, renderSize);
314758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else
314858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				markUndefined(reference, BVec4(true), targetSize, renderPos, renderSize);
3149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
315158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (attachmentUsed[attachmentIndex] && isStencilAttachment && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE)
315258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			markUndefined(reference, BVec4(false, true, false, false), targetSize, renderPos, renderSize);
3153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
315658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid renderReferenceImagesFromValues (vector<tcu::TextureLevel>&			referenceImages,
315758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									  const vector<vector<PixelValue> >&	referenceValues,
315858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									  const UVec2&							targetSize,
315958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									  const RenderPass&						renderPassInfo)
3160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
316158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	referenceImages.resize(referenceValues.size());
3162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
316358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
3164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
316558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Attachment			attachment			= renderPassInfo.getAttachments()[attachmentNdx];
316658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const tcu::TextureFormat	format				= mapVkFormat(attachment.getFormat());
316758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const vector<PixelValue>&	reference			= referenceValues[attachmentNdx];
316858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					hasDepth			= tcu::hasDepthComponent(format.order);
316958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					hasStencil			= tcu::hasStencilComponent(format.order);
317058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const bool					hasDepthOrStencil	= hasDepth || hasStencil;
317158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		tcu::TextureLevel&			referenceImage		= referenceImages[attachmentNdx];
3172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
317358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		referenceImage.setStorage(format, targetSize.x(), targetSize.y());
3174d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz
317558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (hasDepthOrStencil)
3176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
317758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (hasDepth)
3178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
317958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const PixelBufferAccess depthAccess (tcu::getEffectiveDepthStencilAccess(referenceImage.getAccess(), tcu::Sampler::MODE_DEPTH));
3180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
318158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 y = 0; y < targetSize.y(); y++)
318258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 x = 0; x < targetSize.x(); x++)
3183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
318458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (reference[x + y * targetSize.x()].getValue(0))
3185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
318658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (*reference[x + y * targetSize.x()].getValue(0))
318758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							depthAccess.setPixDepth(1.0f, x, y);
318858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
318958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							depthAccess.setPixDepth(0.0f, x, y);
3190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
319158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					else // Fill with 3x3 grid
319258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						depthAccess.setPixDepth(((x / 3) % 2) == ((y / 3) % 2) ? 0.33f : 0.66f, x, y);
3193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
319658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (hasStencil)
3197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
319858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const PixelBufferAccess stencilAccess (tcu::getEffectiveDepthStencilAccess(referenceImage.getAccess(), tcu::Sampler::MODE_STENCIL));
3199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
320058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 y = 0; y < targetSize.y(); y++)
320158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 x = 0; x < targetSize.x(); x++)
3202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
320358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (reference[x + y * targetSize.x()].getValue(1))
3204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
320558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (*reference[x + y * targetSize.x()].getValue(1))
320658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							stencilAccess.setPixStencil(0xFFu, x, y);
320758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
320858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							stencilAccess.setPixStencil(0x0u, x, y);
3209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
321058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					else // Fill with 3x3 grid
321158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						stencilAccess.setPixStencil(((x / 3) % 2) == ((y / 3) % 2) ? 85 : 170, x, y);
3212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
321558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		else
3216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
321758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			for (deUint32 y = 0; y < targetSize.y(); y++)
321858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			for (deUint32 x = 0; x < targetSize.x(); x++)
3219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
322058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				tcu::Vec4 color;
3221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
322258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (int compNdx = 0; compNdx < 4; compNdx++)
3223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
322458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (reference[x + y * targetSize.x()].getValue(compNdx))
3225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
322658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (*reference[x + y * targetSize.x()].getValue(compNdx))
322758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							color[compNdx] = 1.0f;
322858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
322958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							color[compNdx] = 0.0f;
3230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
323158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					else // Fill with 3x3 grid
323258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						color[compNdx] = ((compNdx + (x / 3)) % 2) == ((y / 3) % 2) ? 0.33f : 0.66f;
3233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
323558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				referenceImage.getAccess().setPixel(color, x, y);
323658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
3237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
324158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool verifyColorAttachment (const vector<PixelValue>&		reference,
324258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const ConstPixelBufferAccess&	result,
324358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const PixelBufferAccess&		errorImage)
3244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
324558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec4	red		(1.0f, 0.0f, 0.0f, 1.0f);
324658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec4	green	(0.0f, 1.0f, 0.0f, 1.0f);
324758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	bool		ok		= true;
3248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
324958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getWidth() * result.getHeight() == (int)reference.size());
325058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getWidth() == errorImage.getWidth());
325158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getHeight() == errorImage.getHeight());
3252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
325358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (int y = 0; y < result.getHeight(); y++)
325458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (int x = 0; x < result.getWidth(); x++)
3255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
325658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Vec4			resultColor		= result.getPixel(x, y);
325758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const PixelValue&	referenceValue	= reference[x + y * result.getWidth()];
325858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		bool				pixelOk			= true;
3259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
326058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		for (int compNdx = 0; compNdx < 4; compNdx++)
3261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
326258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const Maybe<bool> maybeValue = referenceValue.getValue(compNdx);
3263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
326458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (maybeValue)
326558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
326658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const bool value = *maybeValue;
3267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
326858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if ((value && (resultColor[compNdx] != 1.0f))
326958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					|| (!value && resultColor[compNdx] != 0.0f))
327058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					pixelOk = false;
327158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
3272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
327458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (!pixelOk)
3275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
327658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			errorImage.setPixel(red, x, y);
327758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			ok = false;
3278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
327958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		else
328058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			errorImage.setPixel(green, x, y);
3281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
328258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
328358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return ok;
3284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
328658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool verifyDepthAttachment (const vector<PixelValue>&		reference,
328758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const ConstPixelBufferAccess&	result,
328858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const PixelBufferAccess&		errorImage)
3289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
329058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec4	red		(1.0f, 0.0f, 0.0f, 1.0f);
329158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec4	green	(0.0f, 1.0f, 0.0f, 1.0f);
329258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	bool		ok		= true;
3293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
329458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getWidth() * result.getHeight() == (int)reference.size());
329558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getWidth() == errorImage.getWidth());
329658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getHeight() == errorImage.getHeight());
3297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
329858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (int y = 0; y < result.getHeight(); y++)
329958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (int x = 0; x < result.getWidth(); x++)
3300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
330158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		bool pixelOk = true;
3302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
330358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const float			resultDepth		= result.getPixDepth(x, y);
330458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const PixelValue&	referenceValue	= reference[x + y * result.getWidth()];
330558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Maybe<bool>	maybeValue		= referenceValue.getValue(0);
3306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
330758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (maybeValue)
330858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
330958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const bool value = *maybeValue;
3310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
331158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if ((value && (resultDepth != 1.0f))
331258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				|| (!value && resultDepth != 0.0f))
331358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				pixelOk = false;
3314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
331658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (!pixelOk)
3317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
331858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			errorImage.setPixel(red, x, y);
331958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			ok = false;
3320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
332158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		else
332258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			errorImage.setPixel(green, x, y);
3323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
332558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return ok;
332658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
3327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
332858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool verifyStencilAttachment (const vector<PixelValue>&		reference,
332958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							  const ConstPixelBufferAccess&	result,
333058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							  const PixelBufferAccess&		errorImage)
333158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
333258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec4	red		(1.0f, 0.0f, 0.0f, 1.0f);
333358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const Vec4	green	(0.0f, 1.0f, 0.0f, 1.0f);
333458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	bool		ok		= true;
3335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
333658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getWidth() * result.getHeight() == (int)reference.size());
333758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getWidth() == errorImage.getWidth());
333858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	DE_ASSERT(result.getHeight() == errorImage.getHeight());
3339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
334058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (int y = 0; y < result.getHeight(); y++)
334158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (int x = 0; x < result.getWidth(); x++)
3342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
334358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		bool pixelOk = true;
3344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
334558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const deUint32		resultStencil	= result.getPixStencil(x, y);
334658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const PixelValue&	referenceValue	= reference[x + y * result.getWidth()];
334758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const Maybe<bool>	maybeValue		= referenceValue.getValue(1);
3348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
334958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (maybeValue)
3350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
335158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const bool value = *maybeValue;
3352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
335358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if ((value && (resultStencil != 0xFFu))
335458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				|| (!value && resultStencil != 0x0u))
335558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				pixelOk = false;
3356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
335858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		if (!pixelOk)
335958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
336058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			errorImage.setPixel(red, x, y);
336158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			ok = false;
336258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
336358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		else
336458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			errorImage.setPixel(green, x, y);
3365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
336658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
336758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return ok;
3368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool logAndVerifyImages (TestLog&											log,
3371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const DeviceInterface&								vk,
3372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 VkDevice											device,
3373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<de::SharedPtr<AttachmentResources> >&	attachmentResources,
3374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<bool>&								attachmentIsLazy,
3375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const RenderPass&									renderPassInfo,
3376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<Maybe<VkClearValue> >&				renderPassClearValues,
3377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<Maybe<VkClearValue> >&				imageClearValues,
3378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const vector<SubpassRenderInfo>&					subpassRenderInfo,
3379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const UVec2&										targetSize,
3380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 const TestConfig&									config)
3381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
338258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	vector<vector<PixelValue> >	referenceValues;
3383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<tcu::TextureLevel>	referenceAttachments;
3384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool						isOk					= true;
3385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
338658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	log << TestLog::Message << "Reference images fill undefined pixels with 3x3 grid pattern." << TestLog::EndMessage;
3387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
338858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	renderReferenceValues(referenceValues, renderPassInfo, targetSize, imageClearValues, renderPassClearValues, subpassRenderInfo, config.renderPos, config.renderSize);
338958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	renderReferenceImagesFromValues(referenceAttachments, referenceValues, targetSize, renderPassInfo);
3390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
3392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!attachmentIsLazy[attachmentNdx])
3394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment			attachment		= renderPassInfo.getAttachments()[attachmentNdx];
3396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
3397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order))
3399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
340058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::TextureFormat	depthFormat			= getDepthCopyFormat(attachment.getFormat());
340158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkDeviceSize			depthBufferSize		= targetSize.x() * targetSize.y() * depthFormat.getPixelSize();
340258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				void* const					depthPtr			= attachmentResources[attachmentNdx]->getResultMemory().getHostPtr();
3403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3404bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz				const tcu::TextureFormat	stencilFormat		= getStencilCopyFormat(attachment.getFormat());
3405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			stencilBufferSize	= targetSize.x() * targetSize.y() * stencilFormat.getPixelSize();
3406a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz				void* const					stencilPtr			= attachmentResources[attachmentNdx]->getSecondaryResultMemory().getHostPtr();
3407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
340858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkMappedMemoryRange	ranges[]			=
3409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,								// sType;
3412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						DE_NULL,															// pNext;
3413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getResultMemory().getMemory(),	// mem;
3414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getResultMemory().getOffset(),	// offset;
3415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						depthBufferSize														// size;
3416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					},
3417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,										// sType;
3419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						DE_NULL,																	// pNext;
3420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getSecondaryResultMemory().getMemory(),	// mem;
3421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						attachmentResources[attachmentNdx]->getSecondaryResultMemory().getOffset(),	// offset;
3422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						stencilBufferSize															// size;
3423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_CHECK(vk.invalidateMappedMemoryRanges(device, 2u, ranges));
3426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
342858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const ConstPixelBufferAccess	depthAccess			(depthFormat, targetSize.x(), targetSize.y(), 1, depthPtr);
342958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const ConstPixelBufferAccess	stencilAccess		(stencilFormat, targetSize.x(), targetSize.y(), 1, stencilPtr);
343058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					tcu::TextureLevel				depthErrorImage		(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
343158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					tcu::TextureLevel				stencilErrorImage	(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
3432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Depth", "Attachment " + de::toString(attachmentNdx) + " Depth", depthAccess);
3434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Stencil", "Attachment " + de::toString(attachmentNdx) + " Stencil", stencilAccess);
3435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
3437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
343858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE
343958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&& !verifyDepthAttachment(referenceValues[attachmentNdx], depthAccess, depthErrorImage.getAccess()))
3440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
344158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						log << TestLog::Image("DepthAttachmentError" + de::toString(attachmentNdx), "Depth Attachment Error " + de::toString(attachmentNdx), depthErrorImage.getAccess());
344258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						isOk = false;
344358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
344458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
344558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE
344658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&& !verifyStencilAttachment(referenceValues[attachmentNdx], stencilAccess, stencilErrorImage.getAccess()))
344758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
344858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						log << TestLog::Image("StencilAttachmentError" + de::toString(attachmentNdx), "Stencil Attachment Error " + de::toString(attachmentNdx), stencilErrorImage.getAccess());
3449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						isOk = false;
3450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkDeviceSize			bufferSize	= targetSize.x() * targetSize.y() * format.getPixelSize();
3456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				void* const					ptr			= attachmentResources[attachmentNdx]->getResultMemory().getHostPtr();
3457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
345858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkMappedMemoryRange	range		=
3459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,								// sType;
3461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					DE_NULL,															// pNext;
3462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getResultMemory().getMemory(),	// mem;
3463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					attachmentResources[attachmentNdx]->getResultMemory().getOffset(),	// offset;
3464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					bufferSize															// size;
3465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
3466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				VK_CHECK(vk.invalidateMappedMemoryRanges(device, 1u, &range));
3467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
346858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (tcu::hasDepthComponent(format.order))
346958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
347058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const ConstPixelBufferAccess	access		(format, targetSize.x(), targetSize.y(), 1, ptr);
347158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					tcu::TextureLevel				errorImage	(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
347258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
347358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access);
347458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
347558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
347658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
347758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&& !verifyDepthAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess()))
347858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
347958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
348058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						isOk = false;
348158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
348258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
348358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else if (tcu::hasStencilComponent(format.order))
348458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
348558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const ConstPixelBufferAccess	access		(format, targetSize.x(), targetSize.y(), 1, ptr);
348658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					tcu::TextureLevel				errorImage	(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
348758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
348858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access);
348958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
349058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
349158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
349258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&& !verifyStencilAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess()))
349358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
349458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
349558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						isOk = false;
349658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
349758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
349858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else
3499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
3500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					const ConstPixelBufferAccess	access		(format, targetSize.x(), targetSize.y(), 1, ptr);
3501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					tcu::TextureLevel				errorImage	(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y());
3502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access);
3504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess());
3505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)
350758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						&& !verifyColorAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess()))
3508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
3509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess());
3510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						isOk = false;
3511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
3512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
3513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return isOk;
3518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
352058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvistd::string getInputAttachmentType (VkFormat vkFormat)
352158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
352258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
352358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
352458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
352558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	switch (channelClass)
352658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
352758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
352858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "isubpassInput";
352958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
353058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
353158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "usubpassInput";
353258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
353358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
353458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
353558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
353658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "subpassInput";
353758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
353858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		default:
353958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			DE_FATAL("Unknown channel class");
354058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			return "";
354158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	}
354258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
354358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
3544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string getAttachmentType (VkFormat vkFormat)
3545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureFormat		format			= mapVkFormat(vkFormat);
3547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
3548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	switch (channelClass)
3550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
3552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "ivec4";
3553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
3555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "uvec4";
3556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
3558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
3559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
3560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "vec4";
3561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		default:
3563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown channel class");
3564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return "";
3565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid createTestShaders (SourceCollections& dst, TestConfig config)
3569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (config.renderTypes & TestConfig::RENDERTYPES_DRAW)
3571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<Subpass>&	subpasses	= config.renderPass.getSubpasses();
3573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
3575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
357658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const Subpass&		subpass					= subpasses[subpassNdx];
357758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			deUint32			inputAttachmentBinding	= 0;
3578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			std::ostringstream	vertexShader;
3579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			std::ostringstream	fragmentShader;
3580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vertexShader << "#version 310 es\n"
358258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 << "layout(location = 0) in highp vec2 a_position;\n"
3583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "void main (void) {\n"
358458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						 << "\tgl_Position = vec4(a_position, 1.0, 1.0);\n"
3585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						 << "}\n";
3586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader << "#version 310 es\n"
358858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						   << "precision highp float;\n";
358958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
359058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
359158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
359258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const deUint32				attachmentIndex	= subpass.getInputAttachments()[attachmentNdx].getAttachment();
359358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const Attachment			attachment		= config.renderPass.getAttachments()[attachmentIndex];
359458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
359558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const bool					isDepthFormat	= tcu::hasDepthComponent(format.order);
359658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const bool					isStencilFormat	= tcu::hasStencilComponent(format.order);
359758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
359858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (isDepthFormat || isStencilFormat)
359958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
360058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (isDepthFormat)
360158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
360258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp subpassInput i_depth" << attachmentNdx << ";\n";
360358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						inputAttachmentBinding++;
360458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
360558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
360658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (isStencilFormat)
360758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
360858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp usubpassInput i_stencil" << attachmentNdx << ";\n";
360958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						inputAttachmentBinding++;
361058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
361158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
361258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else
361358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
361458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const std::string attachmentType = getInputAttachmentType(attachment.getFormat());
361558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
361658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp " << attachmentType << " i_color" << attachmentNdx << ";\n";
361758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					inputAttachmentBinding++;
361858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
361958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
3620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
3622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat());
3624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n";
3625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
362758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			fragmentShader << "void main (void) {\n";
3628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
362958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (subpass.getInputAttachments().empty())
363058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
363158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
363258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
363358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32		attachmentIndex	= subpass.getColorAttachments()[attachmentNdx].getAttachment();
363458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const std::string	attachmentType	= getAttachmentType(config.renderPass.getAttachments()[attachmentIndex].getFormat());
363558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
363658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(vec4(";
363758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
363858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t compNdx = 0; compNdx < 4; compNdx++)
363958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
364058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const size_t	index	= subpassNdx + attachmentIndex + compNdx;
364158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const BoolOp	op		= boolOpFromIndex(index);
364258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
364358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (compNdx > 0)
364458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << ",\n\t\t";
364558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
364658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						fragmentShader	<< "((int(gl_FragCoord.x) % 2 == " << (index % 2)
364758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< ") " << boolOpToString(op) << " ("
364858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2)
364958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< ") ? 1.0 : 0.0)";
365058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
365158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
365258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << "));\n";
365358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
365458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
365558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
365658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
365758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t	index	= subpassNdx + 1;
365858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const BoolOp	op		= boolOpFromIndex(index);
365958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
366058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader	<< "\tgl_FragDepth = ((int(gl_FragCoord.x) % 2 == " << (index % 2)
366158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< ") " << boolOpToString(op) << " ("
366258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2)
366358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< ") ? 1.0 : 0.0);\n";
366458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
366558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
366658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else
3667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
366858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				size_t	inputComponentCount		= 0;
366958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				size_t	outputComponentCount	= 0;
367058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
367158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
367258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
367358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getInputAttachments()[attachmentNdx].getAttachment();
367458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment			attachment		= config.renderPass.getAttachments()[attachmentIndex];
367558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
367658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t				componentCount	= (size_t)tcu::getNumUsedChannels(format.order);
367758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
367858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					inputComponentCount += componentCount;
367958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
368058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
368158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
368258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
368358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getColorAttachments()[attachmentNdx].getAttachment();
368458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment			attachment		= config.renderPass.getAttachments()[attachmentIndex];
368558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
368658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t				componentCount	= (size_t)tcu::getNumUsedChannels(format.order);
368758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
368858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					outputComponentCount += componentCount;
368958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
369058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
369158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
369258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					outputComponentCount++;
369358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
369458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const size_t inputsPerOutput = inputComponentCount >= outputComponentCount
369558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												? ((inputComponentCount / outputComponentCount)
369658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													+ ((inputComponentCount % outputComponentCount) != 0 ? 1 : 0))
369758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												: 1;
369858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
369958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				fragmentShader << "\tbool inputs[" << inputComponentCount << "];\n"
370058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								  "\tbool outputs[" << outputComponentCount << "];\n";
370158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
370258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				size_t inputValueNdx = 0;
370358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
370458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++)
370558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
370658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const char* const	components[]	=
370758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
370858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						"x", "y", "z", "w"
370958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					};
371058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getInputAttachments()[attachmentNdx].getAttachment();
371158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment			attachment		= config.renderPass.getAttachments()[attachmentIndex];
371258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
371358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t				componentCount	= (size_t)tcu::getNumUsedChannels(format.order);
371458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const bool					isDepthFormat	= tcu::hasDepthComponent(format.order);
371558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const bool					isStencilFormat	= tcu::hasStencilComponent(format.order);
371658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
371758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (isDepthFormat || isStencilFormat)
371858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
371958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (isDepthFormat)
372058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
372158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << "\tinputs[" << inputValueNdx << "] = 1.0 == float(subpassLoad(i_depth" << attachmentNdx << ").x);\n";
372258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							inputValueNdx++;
372358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
372458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
372558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (isStencilFormat)
372658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
372758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << "\tinputs[" << inputValueNdx << "] = 255u == subpassLoad(i_stencil" << attachmentNdx << ").x;\n";
372858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							inputValueNdx++;
372958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
373058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
373158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					else
373258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
373358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t compNdx = 0; compNdx < componentCount; compNdx++)
373458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
373558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << "\tinputs[" << inputValueNdx << "] = 1.0 == float(subpassLoad(i_color" << attachmentNdx << ")." << components[compNdx] << ");\n";
373658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							inputValueNdx++;
373758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
373858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
373958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
374058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
374158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				size_t outputValueNdx = 0;
374258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
374358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++)
374458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
374558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				attachmentIndex	= subpass.getColorAttachments()[attachmentNdx].getAttachment();
374658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const Attachment			attachment		= config.renderPass.getAttachments()[attachmentIndex];
374758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const std::string			attachmentType	= getAttachmentType(config.renderPass.getAttachments()[attachmentIndex].getFormat());
374858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const tcu::TextureFormat	format			= mapVkFormat(attachment.getFormat());
374958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t				componentCount	= (size_t)tcu::getNumUsedChannels(format.order);
375058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
375158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t compNdx = 0; compNdx < componentCount; compNdx++)
375258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
375358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const size_t	index	= subpassNdx + attachmentIndex + outputValueNdx;
375458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const BoolOp	op		= boolOpFromIndex(index);
375558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
375658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						fragmentShader << "\toutputs[" << outputValueNdx + compNdx << "] = "
375758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< "(int(gl_FragCoord.x) % 2 == " << (index % 2)
375858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< ") " << boolOpToString(op) << " ("
375958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2)
376058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi										<< ");\n";
376158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
376258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t i = 0; i < inputsPerOutput; i++)
376358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << "\toutputs[" << outputValueNdx + compNdx << "] = outputs[" << outputValueNdx + compNdx << "] == inputs[" <<  ((outputValueNdx + compNdx) * inputsPerOutput + i) %  inputComponentCount << "];\n";
376458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
376558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
376658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(";
376758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
376858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t compNdx = 0; compNdx < 4; compNdx++)
376958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
377058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (compNdx > 0)
377158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << ", ";
377258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
377358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (compNdx < componentCount)
377458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << "outputs[" << outputValueNdx + compNdx << "]";
377558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
377658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							fragmentShader << "0";
377758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
377858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
377958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					outputValueNdx += componentCount;
378058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
378158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << ");\n";
378258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
378358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
378458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
378558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
378658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32	attachmentIndex	= subpass.getDepthStencilAttachment().getAttachment();
378758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const size_t	index			= subpassNdx + attachmentIndex;
378858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const BoolOp	op				= boolOpFromIndex(index);
378958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
379058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << "\toutputs[" << outputValueNdx << "] = "
379158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< "(int(gl_FragCoord.x) % 2 == " << (index % 2)
379258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< ") " << boolOpToString(op) << " ("
379358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2)
379458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									<< ");\n";
379558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
379658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t i = 0; i < inputsPerOutput; i++)
379758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						fragmentShader << "\toutputs[" << outputValueNdx << "] = outputs[" << outputValueNdx << "] == inputs[" <<  (outputValueNdx * inputsPerOutput + i) %  inputComponentCount << "];\n";
379858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
379958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					fragmentShader << "\tgl_FragDepth = outputs[" << outputValueNdx << "] ? 1.0 : 0.0;";
380058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
3801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			fragmentShader << "}\n";
3804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			dst.glslSources.add(de::toString(subpassNdx) + "-vert") << glu::VertexSource(vertexShader.str());
3806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			dst.glslSources.add(de::toString(subpassNdx) + "-frag") << glu::FragmentSource(fragmentShader.str());
3807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeAttachmentIsLazy (vector<bool>& attachmentIsLazy, const vector<Attachment>& attachments, TestConfig::ImageMemory imageMemory)
3812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool lastAttachmentWasLazy = false;
3814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachments[attachmentNdx].getLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD
3818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStoreOp() != VK_ATTACHMENT_STORE_OP_STORE
3819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStencilLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD
3820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			&& attachments[attachmentNdx].getStencilStoreOp() != VK_ATTACHMENT_STORE_OP_STORE)
3821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (imageMemory == TestConfig::IMAGEMEMORY_LAZY || (imageMemory & TestConfig::IMAGEMEMORY_LAZY && !lastAttachmentWasLazy))
3823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentIsLazy.push_back(true);
3825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				lastAttachmentWasLazy = true;
3826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else if (imageMemory & TestConfig::IMAGEMEMORY_STRICT)
3828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
3829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachmentIsLazy.push_back(false);
3830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				lastAttachmentWasLazy = false;
3831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
3832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			else
3833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				DE_FATAL("Unknown imageMemory");
3834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentIsLazy.push_back(false);
3837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
38405b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasserenum AttachmentRefType
38415b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
38425b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_COLOR,
38435b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_DEPTH_STENCIL,
38445b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_INPUT,
38455b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	ATTACHMENTREFTYPE_RESOLVE,
38465b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser};
38475b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
384858a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviVkImageUsageFlags getImageUsageFromLayout (VkImageLayout layout)
38495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
38505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	switch (layout)
38515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
38525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_GENERAL:
38535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_PREINITIALIZED:
38545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return 0;
385558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
38575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
385858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
38605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
38615b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
386258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38635b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
38645b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
386558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38665b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
38675b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
386858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38695b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
38705b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return VK_IMAGE_USAGE_TRANSFER_DST_BIT;
387158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38725b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		default:
38735b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			DE_FATAL("Unexpected image layout");
38745b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			return 0;
38755b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
38765b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
38775b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
38785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, size_t count, const AttachmentReference* references)
38795b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
38805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	for (size_t referenceNdx = 0; referenceNdx < count; ++referenceNdx)
38815b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
38825b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		const deUint32 attachment = references[referenceNdx].getAttachment();
38835b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
38845b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		if (attachment != VK_ATTACHMENT_UNUSED)
38855b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		{
38865b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			VkImageUsageFlags usage;
38875b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
38885b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			switch (refType)
38895b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			{
38905b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_COLOR:
38915b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_RESOLVE:
38925b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
38935b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
389458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38955b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_DEPTH_STENCIL:
38965b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
38975b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
389858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
38995b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				case ATTACHMENTREFTYPE_INPUT:
39005b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
39015b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
390258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
39035b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				default:
39045b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					DE_FATAL("Unexpected attachment reference type");
39055b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					usage = 0;
39065b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser					break;
39075b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			}
39085b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39095b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			attachmentImageUsage[attachment] |= usage;
39105b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		}
39115b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
39125b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
39135b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39145b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, const vector<AttachmentReference>& references)
39155b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
39165b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	if (!references.empty())
39175b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
39185b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, refType, references.size(), &references[0]);
39195b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
39205b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
39215b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
3922277e50dc77528b67562f54c5813b6370e355b614Mais Alnasservoid initializeAttachmentImageUsage (Context &context, vector<VkImageUsageFlags>& attachmentImageUsage, const RenderPass& renderPassInfo, const vector<bool>& attachmentIsLazy, const vector<Maybe<VkClearValue> >& clearValues)
39235b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{
39245b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	attachmentImageUsage.resize(renderPassInfo.getAttachments().size(), VkImageUsageFlags(0));
39255b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39265b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); ++subpassNdx)
39275b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
39285b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		const Subpass& subpass = renderPassInfo.getSubpasses()[subpassNdx];
39295b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39305b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_COLOR, subpass.getColorAttachments());
39315b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_DEPTH_STENCIL, 1, &subpass.getDepthStencilAttachment());
39325b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_INPUT, subpass.getInputAttachments());
39335b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_RESOLVE, subpass.getResolveAttachments());
39345b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
39355b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39365b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
39375b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	{
39385b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		const Attachment& attachment = renderPassInfo.getAttachments()[attachmentNdx];
393958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const VkFormatProperties	formatProperties	= getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), attachment.getFormat());
394058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const VkFormatFeatureFlags	supportedFeatures	= formatProperties.optimalTilingFeatures;
3941277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser
3942277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser		if ((supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0)
3943277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser			attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_SAMPLED_BIT;
3944277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser
3945277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser		if ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0)
3946277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser			attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_STORAGE_BIT;
3947277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser
39485b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getInitialLayout());
39495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getFinalLayout());
39505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		if (!attachmentIsLazy[attachmentNdx])
39525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		{
39535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			if (clearValues[attachmentNdx])
39545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser				attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
39555b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
39565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
39575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser		}
39585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	}
39595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}
39605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser
3961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassIsSecondary (vector<bool>& subpassIsSecondary, const vector<Subpass>& subpasses, TestConfig::CommandBufferTypes commandBuffer)
3962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool lastSubpassWasSecondary = false;
3964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++)
3966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary))
3968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpassIsSecondary.push_back(true);
3970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			lastSubpassWasSecondary = true;
3971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else if (commandBuffer & TestConfig::COMMANDBUFFERTYPES_INLINE)
3973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
3974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			subpassIsSecondary.push_back(false);
3975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			lastSubpassWasSecondary = false;
3976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
3977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			DE_FATAL("Unknown commandBuffer");
3979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeImageClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments, const vector<bool>& isLazy)
3983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (!isLazy[attachmentNdx])
3987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng)));
3988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
3989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(nothing<VkClearValue>());
3990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
3991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
3992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
3993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeRenderPassClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments)
3994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
3995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
3996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
3997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachments[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR
3998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			|| attachments[attachmentNdx].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR)
3999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng)));
4001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
4003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues.push_back(nothing<VkClearValue>());
4004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassClearValues (de::Random& rng, vector<vector<VkClearColorValue> >& clearValues, const RenderPass& renderPass)
4008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	clearValues.resize(renderPass.getSubpasses().size());
4010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++)
4012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&						subpass				= renderPass.getSubpasses()[subpassNdx];
4014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
4015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		clearValues[subpassNdx].resize(colorAttachments.size());
4017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++)
4019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const AttachmentReference&	attachmentRef	= colorAttachments[attachmentRefNdx];
4021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&			attachment		= renderPass.getAttachments()[attachmentRef.getAttachment()];
4022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			clearValues[subpassNdx][attachmentRefNdx] = randomColorClearValue(attachment, rng);
4024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logSubpassRenderInfo (TestLog&					log,
4029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi						   const SubpassRenderInfo&	info)
4030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Viewport, offset: " << info.getViewportOffset() << ", size: " << info.getViewportSize() << TestLog::EndMessage;
4032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.isSecondary())
4034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Subpass uses secondary command buffers" << TestLog::EndMessage;
4035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	else
4036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Subpass uses inlined commands" << TestLog::EndMessage;
4037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 attachmentNdx = 0; attachmentNdx < info.getColorClears().size(); attachmentNdx++)
4039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const ColorClear&	colorClear	= info.getColorClears()[attachmentNdx];
4041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Clearing color attachment " << attachmentNdx
4043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ". Offset: " << colorClear.getOffset()
4044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Size: " << colorClear.getSize()
4045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Color: " << clearColorToString(info.getColorAttachment(attachmentNdx).getFormat(), colorClear.getColor()) << TestLog::EndMessage;
4046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.getDepthStencilClear())
4049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const DepthStencilClear&	depthStencilClear	= *info.getDepthStencilClear();
4051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		log << TestLog::Message << "Clearing depth stencil attachment"
4053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ". Offset: " << depthStencilClear.getOffset()
4054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Size: " << depthStencilClear.getSize()
4055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Depth: " << depthStencilClear.getDepth()
4056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			<< ", Stencil: " << depthStencilClear.getStencil() << TestLog::EndMessage;
4057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (info.getRenderQuad())
4060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderQuad&	renderQuad	= *info.getRenderQuad();
4062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
406358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		log << TestLog::Message << "Rendering grid quad to " << renderQuad.getCornerA() << " -> " << renderQuad.getCornerB() << TestLog::EndMessage;
4064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
406758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid logTestCaseInfo (TestLog&								log,
406858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					  const TestConfig&						config,
406958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					  const vector<bool>&					attachmentIsLazy,
407058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					  const vector<Maybe<VkClearValue> >&	imageClearValues,
407158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					  const vector<Maybe<VkClearValue> >&	renderPassClearValues,
407258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					  const vector<SubpassRenderInfo>&		subpassRenderInfo)
4073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const RenderPass&	renderPass	= config.renderPass;
4075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	logRenderPassInfo(log, renderPass);
4077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(attachmentIsLazy.size() == renderPass.getAttachments().size());
4079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(imageClearValues.size() == renderPass.getAttachments().size());
4080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(renderPassClearValues.size() == renderPass.getAttachments().size());
4081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "TargetSize: " << config.targetSize << TestLog::EndMessage;
4083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	log << TestLog::Message << "Render area, Offset: " << config.renderPos << ", Size: " << config.renderSize << TestLog::EndMessage;
4084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachmentIsLazy.size(); attachmentNdx++)
4086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection	section	(log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx));
4088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (attachmentIsLazy[attachmentNdx])
4090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Is lazy." << TestLog::EndMessage;
4091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (imageClearValues[attachmentNdx])
4093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Image is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *imageClearValues[attachmentNdx]) << " before rendering." << TestLog::EndMessage;
4094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (renderPass.getAttachments()[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR && renderPassClearValues[attachmentNdx])
4096c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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;
4097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++)
4100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::ScopedLogSection section (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx));
4102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		logSubpassRenderInfo(log, subpassRenderInfo[subpassNdx]);
4104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
410758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvifloat roundToViewport (float x, deUint32 offset, deUint32 size)
410858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
410958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const float		origin	= (float)(offset) + ((float(size) / 2.0f));
411058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const float		p		= (float)(size) / 2.0f;
411158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const deInt32	xi		= deRoundFloatToInt32(origin + (p * x));
411258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
411358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return (((float)xi) - origin) / p;
411458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
411558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
4116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassRenderInfo (vector<SubpassRenderInfo>& renderInfos, de::Random& rng, const RenderPass& renderPass, const TestConfig& config)
4117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes	commandBuffer			= config.commandBufferTypes;
4119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const vector<Subpass>&					subpasses				= renderPass.getSubpasses();
4120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool									lastSubpassWasSecondary	= false;
4121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (deUint32 subpassNdx = 0; subpassNdx < (deUint32)subpasses.size(); subpassNdx++)
4123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Subpass&				subpass				= subpasses[subpassNdx];
4125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool					subpassIsSecondary	= commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY
4126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														|| (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary) ? true : false;
4127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const UVec2					viewportSize		((config.renderSize * UVec2(2)) / UVec2(3));
4128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const UVec2					viewportOffset		(config.renderPos.x() + (subpassNdx % 2) * (config.renderSize.x() / 3),
4129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi														 config.renderPos.y() + ((subpassNdx / 2) % 2) * (config.renderSize.y() / 3));
4130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<ColorClear>			colorClears;
4132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Maybe<DepthStencilClear>	depthStencilClear;
4133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Maybe<RenderQuad>			renderQuad;
4134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		lastSubpassWasSecondary		= subpassIsSecondary;
4136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (config.renderTypes & TestConfig::RENDERTYPES_CLEAR)
4138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const vector<AttachmentReference>&	colorAttachments	= subpass.getColorAttachments();
4140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++)
4142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const AttachmentReference&	attachmentRef	= colorAttachments[attachmentRefNdx];
4144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Attachment&			attachment		= renderPass.getAttachments()[attachmentRef.getAttachment()];
4145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2					size			((viewportSize * UVec2(2)) / UVec2(3));
4146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2					offset			(viewportOffset.x() + ((deUint32)attachmentRefNdx % 2u) * (viewportSize.x() / 3u),
4147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi															 viewportOffset.y() + (((deUint32)attachmentRefNdx / 2u) % 2u) * (viewportSize.y() / 3u));
4148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkClearColorValue		color			= randomColorClearValue(attachment, rng);
4149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				colorClears.push_back(ColorClear(offset, size, color));
4151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED)
4154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
415558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const Attachment&	attachment	= renderPass.getAttachments()[subpass.getDepthStencilAttachment().getAttachment()];
415658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const UVec2			size		((viewportSize * UVec2(2)) / UVec2(3));
415758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const UVec2			offset		(viewportOffset.x() + ((deUint32)colorAttachments.size() % 2u) * (viewportSize.x() / 3u),
415858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												 viewportOffset.y() + (((deUint32)colorAttachments.size() / 2u) % 2u) * (viewportSize.y() / 3u));
415958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkClearValue	value		= randomClearValue(attachment, rng);
4160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				depthStencilClear = tcu::just(DepthStencilClear(offset, size, value.depthStencil.depth, value.depthStencil.stencil));
4162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (config.renderTypes & TestConfig::RENDERTYPES_DRAW)
4166b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes		{
416758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const float	w	= (subpassNdx % 2) == 0 ? 1.0f : 1.25f;
416858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const float	h	= (subpassNdx % 2) == 0 ? 1.25f : 1.0f;
416958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
417058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const float	x0	= roundToViewport((subpassNdx % 2) == 0 ? 1.0f - w : -1.0f, viewportOffset.x(), viewportSize.x());
417158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const float	x1	= roundToViewport((subpassNdx % 2) == 0 ? 1.0f : -1.0f + w, viewportOffset.x(), viewportSize.x());
417258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
417358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const float	y0	= roundToViewport(((subpassNdx / 2) % 2) == 0 ? 1.0f - h : -1.0f, viewportOffset.y(), viewportSize.y());
417458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			const float	y1	= roundToViewport(((subpassNdx / 2) % 2) == 0 ? 1.0f : -1.0f + h, viewportOffset.y(), viewportSize.y());
417558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
417658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			renderQuad = tcu::just(RenderQuad(tcu::Vec2(x0, y0), tcu::Vec2(x1, y1)));
4177b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes		}
4178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		renderInfos.push_back(SubpassRenderInfo(renderPass, subpassNdx, subpassIsSecondary, viewportOffset, viewportSize, renderQuad, colorClears, depthStencilClear));
4180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkTextureFormatSupport (TestLog&					log,
4184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								const InstanceInterface&	vk,
4185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								VkPhysicalDevice			device,
4186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi								const vector<Attachment>&	attachments)
4187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	bool supported = true;
4189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++)
4191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment&			attachment					= attachments[attachmentNdx];
4193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const tcu::TextureFormat	format						= mapVkFormat(attachment.getFormat());
4194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const bool					isDepthOrStencilAttachment	= hasDepthComponent(format.order) || hasStencilComponent(format.order);
4195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkFormatFeatureFlags	flags						= isDepthOrStencilAttachment? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
4196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VkFormatProperties			properties;
4197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
419868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		vk.getPhysicalDeviceFormatProperties(device, attachment.getFormat(), &properties);
4199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if ((properties.optimalTilingFeatures & flags) != flags)
4201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			supported = false;
4203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			log << TestLog::Message << "Format: " << attachment.getFormat() << " not supported as " << (isDepthOrStencilAttachment ? "depth stencil attachment" : "color attachment") << TestLog::EndMessage;
4204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	if (!supported)
4208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TCU_THROW(NotSupportedError, "Format not supported");
4209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestStatus renderPassTest (Context& context, TestConfig config)
4212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							targetSize			= config.targetSize;
4214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							renderPos			= config.renderPos;
4215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2							renderSize			= config.renderSize;
4216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const RenderPass&					renderPassInfo		= config.renderPass;
4217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	TestLog&							log					= context.getTestContext().getLog();
4219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random							rng					(config.seed);
4220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>						attachmentIsLazy;
42225b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser	vector<VkImageUsageFlags>			attachmentImageUsage;
4223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Maybe<VkClearValue> >		imageClearValues;
4224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<Maybe<VkClearValue> >		renderPassClearValues;
4225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<bool>						subpassIsSecondary;
4227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<SubpassRenderInfo>			subpassRenderInfo;
4228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	vector<vector<VkClearColorValue> >	subpassColorClearValues;
4229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeAttachmentIsLazy(attachmentIsLazy, renderPassInfo.getAttachments(), config.imageMemory);
4231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeImageClearValues(rng, imageClearValues, renderPassInfo.getAttachments(), attachmentIsLazy);
4232277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser	initializeAttachmentImageUsage(context, attachmentImageUsage, renderPassInfo, attachmentIsLazy, imageClearValues);
4233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeRenderPassClearValues(rng, renderPassClearValues, renderPassInfo.getAttachments());
4234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassIsSecondary(subpassIsSecondary, renderPassInfo.getSubpasses(), config.commandBufferTypes);
4236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassClearValues(rng, subpassColorClearValues, renderPassInfo);
4237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	initializeSubpassRenderInfo(subpassRenderInfo, rng, renderPassInfo, config);
4238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	logTestCaseInfo(log, config, attachmentIsLazy, imageClearValues, renderPassClearValues, subpassRenderInfo);
4240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	checkTextureFormatSupport(log, context.getInstanceInterface(), context.getPhysicalDevice(), config.renderPass.getAttachments());
4242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
424486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		const vk::VkPhysicalDeviceProperties properties = vk::getPhysicalDeviceProperties(context.getInstanceInterface(), context.getPhysicalDevice());
424586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
424686abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		log << TestLog::Message << "Max color attachments: " << properties.limits.maxColorAttachments << TestLog::EndMessage;
424786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
424886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
424986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		{
425086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi			 if (renderPassInfo.getSubpasses()[subpassNdx].getColorAttachments().size() > (size_t)properties.limits.maxColorAttachments)
425186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi				 TCU_THROW(NotSupportedError, "Subpass uses more than maxColorAttachments.");
425286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi		}
425386abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi	}
425486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi
425586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi	{
4256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkDevice								device								= context.getDevice();
4257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const DeviceInterface&						vk									= context.getDeviceInterface();
4258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkQueue								queue								= context.getUniversalQueue();
4259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32								queueIndex							= context.getUniversalQueueFamilyIndex();
4260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		Allocator&									allocator							= context.getDefaultAllocator();
4261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Unique<VkRenderPass>					renderPass							(createRenderPass(vk, device, renderPassInfo));
426368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandPool>					commandBufferPool					(createCommandPool(vk, device, queueIndex, 0));
426468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				initializeImagesCommandBuffer		(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
426568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				renderCommandBuffer					(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
426668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const Unique<VkCommandBuffer>				readImagesToBuffersCommandBuffer	(allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
4267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<de::SharedPtr<AttachmentResources> >	attachmentResources;
4269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<de::SharedPtr<SubpassRenderer> >		subpassRenderers;
427058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		vector<VkImage>								attachmentImages;
4271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		vector<VkImageView>							attachmentViews;
427258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		vector<pair<VkImageView, VkImageView> >		inputAttachmentViews;
4273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++)
4275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Attachment&	attachmentInfo	= renderPassInfo.getAttachments()[attachmentNdx];
4277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
42785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser			attachmentResources.push_back(de::SharedPtr<AttachmentResources>(new AttachmentResources(vk, device, allocator, queueIndex, targetSize, attachmentInfo, attachmentImageUsage[attachmentNdx])));
4279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			attachmentViews.push_back(attachmentResources[attachmentNdx]->getAttachmentView());
428058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			attachmentImages.push_back(attachmentResources[attachmentNdx]->getImage());
428158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
428258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			inputAttachmentViews.push_back(attachmentResources[attachmentNdx]->getInputAttachmentViews());
4283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
428568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		beginCommandBuffer(vk, *initializeImagesCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
4286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		pushImageInitializationCommands(vk, *initializeImagesCommandBuffer, renderPassInfo.getAttachments(), attachmentResources, queueIndex, imageClearValues);
4287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		endCommandBuffer(vk, *initializeImagesCommandBuffer);
4288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, *renderPass, targetSize, attachmentViews));
4291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++)
429358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				subpassRenderers.push_back(de::SharedPtr<SubpassRenderer>(new SubpassRenderer(context, vk, device, allocator, *renderPass, *framebuffer, *commandBufferPool, queueIndex, attachmentImages, inputAttachmentViews, subpassRenderInfo[subpassNdx], config.renderPass.getAttachments())));
4294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
429568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			beginCommandBuffer(vk, *renderCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
4296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushRenderPassCommands(vk, *renderCommandBuffer, *renderPass, *framebuffer, subpassRenderers, renderPos, renderSize, renderPassClearValues, config.renderTypes);
4297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *renderCommandBuffer);
4298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
429968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			beginCommandBuffer(vk, *readImagesToBuffersCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0);
4300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			pushReadImagesToBuffers(vk, *readImagesToBuffersCommandBuffer, queueIndex, attachmentResources, renderPassInfo.getAttachments(), attachmentIsLazy, targetSize);
4301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			endCommandBuffer(vk, *readImagesToBuffersCommandBuffer);
4302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
430368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkCommandBuffer commandBuffers[] =
4304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
4305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*initializeImagesCommandBuffer,
4306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*renderCommandBuffer,
4307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					*readImagesToBuffersCommandBuffer
4308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				};
4309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const Unique<VkFence>	fence		(createFence(vk, device, 0u));
4310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				queueSubmit(vk, queue, DE_LENGTH_OF_ARRAY(commandBuffers), commandBuffers, *fence);
4312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				waitForFences(vk, device, 1, &fence.get(), VK_TRUE, ~0ull);
4313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		if (logAndVerifyImages(log, vk, device, attachmentResources, attachmentIsLazy, renderPassInfo, renderPassClearValues, imageClearValues, subpassRenderInfo, targetSize, config))
4317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::TestStatus::pass("Pass");
4318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		else
4319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			return tcu::TestStatus::fail("Result verification failed");
4320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
4321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
432318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreColorFormats[] =
4324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
432568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_FORMAT_R5G6B5_UNORM_PACK16,
4326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_UNORM,
4327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_SNORM,
4328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_UINT,
4329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8_SINT,
4330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_UNORM,
4331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_SNORM,
4332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_UINT,
4333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8_SINT,
4334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_UNORM,
4335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SNORM,
4336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_UINT,
4337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SINT,
4338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R8G8B8A8_SRGB,
433918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_UNORM_PACK32,
434018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SNORM_PACK32,
434118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_UINT_PACK32,
434218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SINT_PACK32,
434318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A8B8G8R8_SRGB_PACK32,
434418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_B8G8R8A8_UNORM,
434518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_B8G8R8A8_SRGB,
434618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2R10G10B10_UNORM_PACK32,
434718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2B10G10R10_UNORM_PACK32,
434818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_A2B10G10R10_UINT_PACK32,
4349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_UNORM,
4350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SNORM,
4351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_UINT,
4352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SINT,
4353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16_SFLOAT,
4354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_UNORM,
4355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SNORM,
4356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_UINT,
4357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SINT,
4358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16_SFLOAT,
4359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_UNORM,
4360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SNORM,
4361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_UINT,
4362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SINT,
4363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R16G16B16A16_SFLOAT,
4364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_UINT,
4365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_SINT,
4366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32_SFLOAT,
4367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_UINT,
4368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_SINT,
4369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32_SFLOAT,
4370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_UINT,
4371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_SINT,
4372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_R32G32B32A32_SFLOAT
4373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
4374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
437518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreDepthStencilFormats[] =
4376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_D16_UNORM,
437818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
437968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos	VK_FORMAT_X8_D24_UNORM_PACK32,
4380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	VK_FORMAT_D32_SFLOAT,
438118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
438218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_D24_UNORM_S8_UINT,
438318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	VK_FORMAT_D32_SFLOAT_S8_UINT
4384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi};
4385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
438658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addAttachmentTests (tcu::TestCaseGroup* group)
4387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
438886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi	const deUint32 attachmentCounts[] = { 1, 3, 4, 8 };
4389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentLoadOp loadOps[] =
4390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_LOAD,
4392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,
4393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE
4394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentStoreOp storeOps[] =
4397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,
4399775c33feeee3a8a7cfe1a51447424d4160083fffscygan		VK_ATTACHMENT_STORE_OP_DONT_CARE
4400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
440200d994858ab64bb5e1c6cb534bb049dcbb9269descygan	const VkImageLayout initialAndFinalColorLayouts[] =
4403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
440600d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
440700d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
440800d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
440900d994858ab64bb5e1c6cb534bb049dcbb9269descygan	};
441000d994858ab64bb5e1c6cb534bb049dcbb9269descygan
441100d994858ab64bb5e1c6cb534bb049dcbb9269descygan	const VkImageLayout initialAndFinalDepthStencilLayouts[] =
441200d994858ab64bb5e1c6cb534bb049dcbb9269descygan	{
441300d994858ab64bb5e1c6cb534bb049dcbb9269descygan		VK_IMAGE_LAYOUT_GENERAL,
4414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
4416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
441768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
441868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
4419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout subpassLayouts[] =
4422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout depthStencilLayouts[] =
4428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
4431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::RenderTypes renderCommands[] =
4434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_NONE,
4436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR,
4437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_DRAW,
4438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW,
4439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes commandBuffers[] =
4442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE,
4444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_SECONDARY,
4445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY
4446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::ImageMemory imageMemories[] =
4449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT,
4451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_LAZY,
4452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY
4453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSizes[] =
4456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(64, 64),
4458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(63, 65)
4459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPositions[] =
4462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(0, 0),
4464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(3, 17)
4465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSizes[] =
4468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(32, 32),
4470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(60, 47)
4471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
447358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	tcu::TestContext&	testCtx	= group->getTestContext();
447458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	de::Random			rng		(1433774382u);
4475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t attachmentCountNdx = 0; attachmentCountNdx < DE_LENGTH_OF_ARRAY(attachmentCounts); attachmentCountNdx++)
4477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32					attachmentCount			= attachmentCounts[attachmentCountNdx];
4479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const deUint32					testCaseCount			= (attachmentCount == 1 ? 100 : 200);
4480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	attachmentCountGroup	(new tcu::TestCaseGroup(testCtx, de::toString(attachmentCount).c_str(), de::toString(attachmentCount).c_str()));
4481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++)
4483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
4484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const bool					useDepthStencil		= rng.getBool();
4485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			VkImageLayout				depthStencilLayout	= VK_IMAGE_LAYOUT_GENERAL;
4486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<Attachment>			attachments;
4487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			vector<AttachmentReference>	colorAttachmentReferences;
4488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++)
4490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
449168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos				const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
449218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi				const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
4493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
449600d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
449700d994858ab64bb5e1c6cb534bb049dcbb9269descygan				const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
4498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkImageLayout			subpassLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
4501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
4505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			if (useDepthStencil)
4508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
450958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
451058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats));
451158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
451258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
451458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts));
451558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts));
4516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
451758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
451858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				depthStencilLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(depthStencilLayouts), DE_ARRAY_END(depthStencilLayouts));
4521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
4525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
4526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
4527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
452858a80a6102cf592f064b8094c59812081ee5d323Mika 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<deUint32>()));
4529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const vector<SubpassDependency>			deps;
4530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const string							testCaseName	= de::toString(attachmentCountNdx * testCaseCount + testCaseNdx);
4532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass						renderPass		(attachments, subpasses, deps);
4533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
4534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
4535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
4536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				addFunctionCaseWithPrograms<TestConfig>(attachmentCountGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 1293809));
4538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
4539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
4540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(attachmentCountGroup.release());
4542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
454358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}
454458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
454558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvitemplate<typename T>
454658a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviT chooseRandom (de::Random& rng, const set<T>& values)
454758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{
454858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	size_t							ndx		= ((size_t)rng.getUint32()) % values.size();
454958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	typename set<T>::const_iterator	iter	= values.begin();
455058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
455158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	for (; ndx > 0; ndx--)
455258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		iter++;
4553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
455458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	return *iter;
4555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
4556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
455758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addAttachmentAllocationTests (tcu::TestCaseGroup* group)
4558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
4559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const deUint32 attachmentCounts[] = { 4, 8 };
4560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentLoadOp loadOps[] =
4561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_LOAD,
4563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_CLEAR,
4564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_LOAD_OP_DONT_CARE
4565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkAttachmentStoreOp storeOps[] =
4568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_STORE,
4570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_ATTACHMENT_STORE_OP_DONT_CARE
4571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
457324fb688e68b85c2752c5ab81d8292a1fed1e9addscygan	const VkImageLayout initialAndFinalColorLayouts[] =
4574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
457724fb688e68b85c2752c5ab81d8292a1fed1e9addscygan		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
457824fb688e68b85c2752c5ab81d8292a1fed1e9addscygan		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
457924fb688e68b85c2752c5ab81d8292a1fed1e9addscygan		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
458024fb688e68b85c2752c5ab81d8292a1fed1e9addscygan	};
458124fb688e68b85c2752c5ab81d8292a1fed1e9addscygan
458258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const VkImageLayout initialAndFinalDepthStencilLayouts[] =
458358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
458458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
458558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
458658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
458758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
458858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
458958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
459058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	};
459158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
4592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const VkImageLayout subpassLayouts[] =
4593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_GENERAL,
4595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	enum AllocationType
4599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass uses one more attachmen than previous one
4601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW,
4602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass uses one less attachment than previous one
4603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_SHRINK,
4604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Each pass drops one attachment and picks up new one
4605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_ROLL,
4606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		// Start by growing and end by shrinking
460758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		ALLOCATIONTYPE_GROW_SHRINK,
460858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		// Each subpass has single input and single output attachment
460958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		ALLOCATIONTYPE_IO_CHAIN,
461058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		// Each subpass has multiple inputs and multiple outputs attachment
461158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		ALLOCATIONTYPE_IO_GENERIC
4612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const AllocationType allocationTypes[] =
4615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_GROW,
4617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_SHRINK,
4618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		ALLOCATIONTYPE_ROLL,
461958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		ALLOCATIONTYPE_GROW_SHRINK,
462058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		ALLOCATIONTYPE_IO_CHAIN,
462158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		ALLOCATIONTYPE_IO_GENERIC
4622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const char* const allocationTypeStr[] =
4625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"grow",
4627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"shrink",
4628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		"roll",
462958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		"grow_shrink",
463058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		"input_output_chain",
463158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		"input_output",
4632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::RenderTypes renderCommands[] =
4635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_NONE,
4637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR,
4638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_DRAW,
4639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW,
4640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::CommandBufferTypes commandBuffers[] =
4643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE,
4645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_SECONDARY,
4646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY
4647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const TestConfig::ImageMemory imageMemories[] =
4650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT,
4652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_LAZY,
4653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY
4654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 targetSizes[] =
4657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(64, 64),
4659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(63, 65)
4660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderPositions[] =
4663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(0, 0),
4665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(3, 17)
4666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const UVec2 renderSizes[] =
4669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(32, 32),
4671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		UVec2(60, 47)
4672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
4673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
467458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	tcu::TestContext&				testCtx	= group->getTestContext();
4675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::Random						rng		(3700649827u);
4676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	for (size_t allocationTypeNdx = 0; allocationTypeNdx < DE_LENGTH_OF_ARRAY(allocationTypes); allocationTypeNdx++)
4678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
4679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const AllocationType			allocationType		= allocationTypes[allocationTypeNdx];
4680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const size_t					testCaseCount		= 100;
4681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	allocationTypeGroup	(new tcu::TestCaseGroup(testCtx, allocationTypeStr[allocationTypeNdx], allocationTypeStr[allocationTypeNdx]));
4682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++)
4684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
468558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			if (allocationType == ALLOCATIONTYPE_IO_GENERIC)
4686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
468758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const deUint32		attachmentCount	= 4u + rng.getUint32() % 31u;
468858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const deUint32		subpassCount	= 4u + rng.getUint32() % 31u;
468958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<Attachment>	attachments;
4690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
469158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				set<deUint32>		definedAttachments;
4692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
469358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<Subpass>		subpasses;
469458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				set<deUint32>		colorAttachments;
469558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				set<deUint32>		depthStencilAttachments;
4696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
469758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 attachmentIndex = 0; attachmentIndex < attachmentCount; attachmentIndex++)
4698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
469958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const bool					isDepthStencilAttachment	= rng.getFloat() < 0.01f;
470058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkSampleCountFlagBits	sampleCount					= VK_SAMPLE_COUNT_1_BIT;
470158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentLoadOp	loadOp						= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
470258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentStoreOp	storeOp						= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
470358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
470458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkImageLayout			initialLayout				= isDepthStencilAttachment
470558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			? rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts))
470658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			: rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
470758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkImageLayout			finalizeLayout				= isDepthStencilAttachment
470858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			? rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts))
470958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			: rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
471058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
471158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentLoadOp	stencilLoadOp				= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
471258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentStoreOp	stencilStoreOp				= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
471358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
471458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (isDepthStencilAttachment)
4715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
471658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const VkFormat	format	= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats));
471758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
471858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (loadOp == VK_ATTACHMENT_LOAD_OP_LOAD || loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR
471958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							|| stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD || stencilLoadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
472058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							definedAttachments.insert(attachmentIndex);
4721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
472258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						depthStencilAttachments.insert(attachmentIndex);
472358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
472458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
472658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					else
472758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
472858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const VkFormat	format	= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
472958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
473058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (loadOp == VK_ATTACHMENT_LOAD_OP_LOAD || loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
473158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							definedAttachments.insert(attachmentIndex);
4732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
473358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						colorAttachments.insert(attachmentIndex);
473458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
473558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
473658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
4737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
473858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<Maybe<deUint32> >	lastUseOfAttachment	(attachments.size(), nothing<deUint32>());
473958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<SubpassDependency>	deps;
474058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
474158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (deUint32 subpassIndex = 0; subpassIndex < subpassCount; subpassIndex++)
4742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
474358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				colorAttachmentCount		= depthStencilAttachments.empty()
474458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			? 1 + rng.getUint32() % de::min(4u, (deUint32)colorAttachments.size())
474558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			: rng.getUint32() % (de::min(4u, (deUint32)colorAttachments.size()) + 1u);
474658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const deUint32				inputAttachmentCount		= rng.getUint32() % (deUint32)(de::min<size_t>(4, definedAttachments.size()) + 1);
474758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const bool					useDepthStencilAttachment	= !depthStencilAttachments.empty() && (colorAttachmentCount == 0 || rng.getBool());
474858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					std::vector<deUint32>		subpassColorAttachments		(colorAttachmentCount);
474958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					std::vector<deUint32>		subpassInputAttachments		(inputAttachmentCount);
475058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					Maybe<deUint32>				depthStencilAttachment		(useDepthStencilAttachment
475158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			? just(chooseRandom(rng, depthStencilAttachments))
475258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			: nothing<deUint32>());
475358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					std::vector<deUint32>		subpassPreserveAttachments;
475458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
475558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					rng.choose(colorAttachments.begin(), colorAttachments.end(), subpassColorAttachments.begin(), colorAttachmentCount);
475658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					rng.choose(definedAttachments.begin(), definedAttachments.end(), subpassInputAttachments.begin(), inputAttachmentCount);
475758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
475858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpassColorAttachments.size(); colorAttachmentNdx++)
475958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						definedAttachments.insert(subpassColorAttachments[colorAttachmentNdx]);
476058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
476158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					if (depthStencilAttachment)
476258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						definedAttachments.insert(*depthStencilAttachment);
4763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
4764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
476558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						std::vector<AttachmentReference>	inputAttachmentReferences;
476658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						std::vector<AttachmentReference>	colorAttachmentReferences;
476758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						AttachmentReference					depthStencilAttachmentReference (VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL);
476858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
476958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpassColorAttachments.size(); colorAttachmentNdx++)
477058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
477158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const deUint32		colorAttachmentIndex	= subpassColorAttachments[colorAttachmentNdx];
477258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							// \todo [mika 2016-08-25] Check if attachment is not used as input attachment and use other image layouts
477358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout	subpassLayout			= VK_IMAGE_LAYOUT_GENERAL;
477458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
477558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if (lastUseOfAttachment[colorAttachmentIndex])
477658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
477758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const bool byRegion = rng.getBool();
477858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
477958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								deps.push_back(SubpassDependency(*lastUseOfAttachment[colorAttachmentIndex], subpassIndex,
478058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
478158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
478258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
478358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
478458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
478558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
478658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
478758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
478858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
478958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
479058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
479158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
479258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
479358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																 byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u));
479458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
479558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
479658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							lastUseOfAttachment[colorAttachmentIndex] = just(subpassIndex);
479758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
479858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							colorAttachmentReferences.push_back(AttachmentReference((deUint32)subpassColorAttachments[colorAttachmentNdx], subpassLayout));
479958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
480058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
480158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t inputAttachmentNdx = 0; inputAttachmentNdx < subpassInputAttachments.size(); inputAttachmentNdx++)
480258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
480358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const deUint32		inputAttachmentIndex	= subpassInputAttachments[inputAttachmentNdx];
480458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							// \todo [mika 2016-08-25] Check if attachment is not used as color attachment and use other image layouts
480558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout	subpassLayout			= VK_IMAGE_LAYOUT_GENERAL;
480658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
480758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if(lastUseOfAttachment[inputAttachmentIndex])
480858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
480958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								if(*lastUseOfAttachment[inputAttachmentIndex] == subpassIndex)
481058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
481158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									deps.push_back(SubpassDependency(subpassIndex, subpassIndex,
481258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
481358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
481458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
481558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
481658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
481758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
481858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
481958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
482058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
482158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
482258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
482358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
482458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
482558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_DEPENDENCY_BY_REGION_BIT));
482658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								}
482758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								else
482858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
482958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const bool byRegion = rng.getBool();
483058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
483158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									deps.push_back(SubpassDependency(*lastUseOfAttachment[inputAttachmentIndex], subpassIndex,
483258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
483358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
483458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
483558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
483658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
483758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
483858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
483958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
484058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
484158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
484258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
484358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
484458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
484558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u));
484658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								}
484758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
484858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								lastUseOfAttachment[inputAttachmentIndex] = just(subpassIndex);
484958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
485058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								inputAttachmentReferences.push_back(AttachmentReference((deUint32)subpassInputAttachments[inputAttachmentNdx], subpassLayout));
485158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
485258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
485358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
485458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						if (depthStencilAttachment)
485558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
485658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							// \todo [mika 2016-08-25] Check if attachment is not used as input attachment and use other image layouts
485758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if (lastUseOfAttachment[*depthStencilAttachment])
485858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
485958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								if(*lastUseOfAttachment[*depthStencilAttachment] == subpassIndex)
486058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
486158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									deps.push_back(SubpassDependency(subpassIndex, subpassIndex,
486258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
486358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
486458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
486558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
486658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
486758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
486858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
486958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
487058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
487158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
487258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
487358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
487458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
487558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_DEPENDENCY_BY_REGION_BIT));
487658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								}
487758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								else
487858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								{
487958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									const bool byRegion = rng.getBool();
488058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
488158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi									deps.push_back(SubpassDependency(*lastUseOfAttachment[*depthStencilAttachment], subpassIndex,
488258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
488358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
488458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
488558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
488658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
488758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
488858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
488958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
489058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																		| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
489158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
489258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
489358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
489458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
489558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	 byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u));
489658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								}
489758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
489858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
489958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							lastUseOfAttachment[*depthStencilAttachment] = just(subpassIndex);
490058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							depthStencilAttachmentReference = AttachmentReference(*depthStencilAttachment, VK_IMAGE_LAYOUT_GENERAL);
490158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
490258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						else
490358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							depthStencilAttachmentReference = AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL);
490458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
490558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<deUint32>	preserveAttachments;
490658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (deUint32 attachmentIndex = 0; attachmentIndex < (deUint32)attachments.size(); attachmentIndex++)
490758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
490858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							if (lastUseOfAttachment[attachmentIndex] && (*lastUseOfAttachment[attachmentIndex]) != subpassIndex)
490958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								preserveAttachments.push_back(attachmentIndex);
491058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
491158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
491258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
491358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												inputAttachmentReferences,
491458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												colorAttachmentReferences,
491558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<AttachmentReference>(),
491658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												depthStencilAttachmentReference,
491758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												preserveAttachments));
4918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
4919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
492158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
492258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
492358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
4924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
492558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const string							testCaseName	= de::toString(testCaseNdx);
492658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
492758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
492858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
4929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
493058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const RenderPass						renderPass		(attachments, subpasses, deps);
4931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
493258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329));
4933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
493558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			else
4936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
493758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const deUint32		attachmentCount	= rng.choose<deUint32>(DE_ARRAY_BEGIN(attachmentCounts), DE_ARRAY_END(attachmentCounts));
493858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<Attachment>	attachments;
493958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				vector<Subpass>		subpasses;
494058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
494158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++)
4942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
494358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkSampleCountFlagBits	sampleCount		= VK_SAMPLE_COUNT_1_BIT;
494458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkFormat				format			= rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats));
494558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentLoadOp	loadOp			= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
494658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentStoreOp	storeOp			= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
494858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkImageLayout			initialLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
494958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkImageLayout			finalizeLayout	= rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts));
4950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
495158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentLoadOp	stencilLoadOp	= rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps));
495258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentStoreOp	stencilStoreOp	= rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps));
4953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
495458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout));
4955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
4956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
495758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				if (allocationType == ALLOCATIONTYPE_GROW)
4958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
495958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
496058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
496158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<AttachmentReference>	colorAttachmentReferences;
496258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
496358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++)
496458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
496558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
496658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
496758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
496858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
4969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
497058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
497158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<AttachmentReference>(),
497258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												colorAttachmentReferences,
497358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<AttachmentReference>(),
497458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
497558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<deUint32>()));
497658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
497758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
497858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else if (allocationType == ALLOCATIONTYPE_SHRINK)
497958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
498058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
4981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					{
498258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<AttachmentReference>	colorAttachmentReferences;
498358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
498458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
498558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
498658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
4987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
498858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
498958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
499058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
499158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
499258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<AttachmentReference>(),
499358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													colorAttachmentReferences,
499458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<AttachmentReference>(),
499558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
499658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<deUint32>()));
4997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					}
499858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
499958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else if (allocationType == ALLOCATIONTYPE_ROLL)
500058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
500158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 0; subpassNdx < attachmentCount / 2; subpassNdx++)
500258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
500358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<AttachmentReference>	colorAttachmentReferences;
5004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
500558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount / 2; attachmentNdx++)
500658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
500758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
500858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
500958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							colorAttachmentReferences.push_back(AttachmentReference((deUint32)(subpassNdx + attachmentNdx), subpassLayout));
501058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
501158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
501258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
501358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<AttachmentReference>(),
501458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													colorAttachmentReferences,
501558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<AttachmentReference>(),
501658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
501758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<deUint32>()));
501858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
5019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
502058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else if (allocationType == ALLOCATIONTYPE_GROW_SHRINK)
502158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
502258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
502358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
502458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<AttachmentReference>	colorAttachmentReferences;
5025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
502658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++)
502758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
502858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
5029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
503058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
503158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
503258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
503358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
503458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<AttachmentReference>(),
503558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													colorAttachmentReferences,
503658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<AttachmentReference>(),
503758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
503858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi													vector<deUint32>()));
503958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
5040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
504158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++)
504258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
504358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						vector<AttachmentReference>	colorAttachmentReferences;
504458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
504558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++)
504658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
504758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts));
5048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
504958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout));
505058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
505158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
505258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
505358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<AttachmentReference>(),
505458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											colorAttachmentReferences,
505558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<AttachmentReference>(),
505658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
505758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<deUint32>()));
505858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
505958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
506058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else if (allocationType == ALLOCATIONTYPE_IO_CHAIN)
5061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				{
506258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
506358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<AttachmentReference>(),
506458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<AttachmentReference>(1, AttachmentReference(0, rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)))),
506558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<AttachmentReference>(),
506658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
506758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi											vector<deUint32>()));
506858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
506958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 1; subpassNdx < attachmentCount; subpassNdx++)
507058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
507158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u,
507258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<AttachmentReference>(1, AttachmentReference((deUint32)(subpassNdx - 1), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)),
507358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<AttachmentReference>(1, AttachmentReference((deUint32)(subpassNdx), rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)))),
507458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<AttachmentReference>(),
507558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
507658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi												vector<deUint32>()));
507758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
5078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				}
507958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				else
508058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					DE_FATAL("Unknown allocation type");
5081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
508258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
508358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const TestConfig::RenderTypes			render			= rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands));
508458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const TestConfig::CommandBufferTypes	commandBuffer	= rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers));
508558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const TestConfig::ImageMemory			imageMemory		= rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories));
508658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
508758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const string							testCaseName	= de::toString(testCaseNdx);
508858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2								targetSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes));
508958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2								renderPos		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions));
509058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const UVec2								renderSize		= rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes));
509158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
509258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					vector<SubpassDependency>				deps;
509358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
509458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t subpassNdx = 0; subpassNdx < subpasses.size() - 1; subpassNdx++)
509558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
509658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						const bool byRegion				= rng.getBool();
509758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						deps.push_back(SubpassDependency((deUint32)subpassNdx, (deUint32)subpassNdx + 1,
509858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
509958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
510058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
510158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
510258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
510358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
510458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
510558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															| VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
510658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
510758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
510858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
510958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
511058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
511158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														 byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u));
511258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
5113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
511458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const RenderPass					renderPass		(attachments, subpasses, deps);
511558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
511658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329));
511758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
5118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
5119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
5120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(allocationTypeGroup.release());
5121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
5123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
512458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addSimpleTests (tcu::TestCaseGroup* group)
5125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
512658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2	targetSize	(64, 64);
512758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2	renderPos	(0, 0);
512858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2	renderSize	(64, 64);
5129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color
5131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_R8G8B8A8_UNORM,
513368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
5134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
5135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
5136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
5138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
514658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
514958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "color", "Single color attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
5150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// depth
5153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
515468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_X8_D24_UNORM_PACK32,
515568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
5156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
5157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
5158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
5160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
5161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
5162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
516858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
517158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "depth", "Single depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
5172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// stencil
5175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_S8_UINT,
517768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
5178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_DONT_CARE,
5180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
5181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
5182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
5183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
5184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
519058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
519358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "stencil", "Single stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
5194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// depth_stencil
5197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(1, Attachment(VK_FORMAT_D24_UNORM_S8_UINT,
519968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																		  VK_SAMPLE_COUNT_1_BIT,
5200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
5201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
5202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_LOAD_OP_CLEAR,
5203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_ATTACHMENT_STORE_OP_STORE,
5204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
5205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																		  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
5206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
521258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
521558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "depth_stencil", "Single depth stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
5216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_depth
5219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
5221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
5222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
522368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
5224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
5228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
523068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos			Attachment(VK_FORMAT_X8_D24_UNORM_PACK32,
523168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
5232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
5236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
5237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
5238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
5239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
5241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
524758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
525058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "color_depth", "Color and depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
5251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_stencil
5254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
5256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
5257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
525868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
5259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
5263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
5265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_S8_UINT,
526668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
5267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
5271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
5272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
5273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
5274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
5276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
528258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
528658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "color_stencil", "Color and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239));
5287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	// color_depth_stencil
5290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const Attachment	attachments[] =
5292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
5293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_R8G8B8A8_UNORM,
529468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
5295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_DONT_CARE,
5299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL),
5301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			Attachment(VK_FORMAT_D24_UNORM_S8_UINT,
530268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos					   VK_SAMPLE_COUNT_1_BIT,
5303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_LOAD_OP_CLEAR,
5306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_ATTACHMENT_STORE_OP_STORE,
5307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
5308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi					   VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
5309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		};
5310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const RenderPass	renderPass	(vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)),
5312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	0u,
5314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	vector<AttachmentReference>(),
5317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																	AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
531858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																	vector<deUint32>())),
5319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi										 vector<SubpassDependency>());
5320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
532158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		addFunctionCaseWithPrograms<TestConfig>(group, "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));
5322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
5324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string formatToName (VkFormat format)
5326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
5327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const std::string	formatStr	= de::toString(format);
5328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const std::string	prefix		= "VK_FORMAT_";
5329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	DE_ASSERT(formatStr.substr(0, prefix.length()) == prefix);
5331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return de::toLower(formatStr.substr(prefix.length()));
5333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
5334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
533558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addFormatTests (tcu::TestCaseGroup* group)
5336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
533758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	tcu::TestContext&	testCtx		= group->getTestContext();
533858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
533958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2			targetSize	(64, 64);
534058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2			renderPos	(0, 0);
534158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const UVec2			renderSize	(64, 64);
5342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
534358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	const struct
534458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
534558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const char* const			str;
534658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		const VkAttachmentStoreOp	op;
534758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	} storeOps[] =
534858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	{
534958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{ "store",		VK_ATTACHMENT_STORE_OP_STORE		},
535058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{ "dont_care",	VK_ATTACHMENT_STORE_OP_DONT_CARE	}
535158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	};
5352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const struct
5354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const char* const			str;
5356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		const VkAttachmentLoadOp	op;
5357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	} loadOps[] =
5358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear",		VK_ATTACHMENT_LOAD_OP_CLEAR		},
5360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "load",		VK_ATTACHMENT_LOAD_OP_LOAD		},
5361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "dont_care",	VK_ATTACHMENT_LOAD_OP_DONT_CARE	}
5362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
5363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	const struct
5365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		 const char* const				str;
5367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		 const TestConfig::RenderTypes	types;
5368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	} renderTypes[] =
5369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
5370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear",		TestConfig::RENDERTYPES_CLEAR								},
5371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "draw",		TestConfig::RENDERTYPES_DRAW								},
5372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{ "clear_draw",	TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW	}
5373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	};
5374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
537518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	// Color formats
537618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreColorFormats); formatNdx++)
5377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	{
537818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		const VkFormat					format		= s_coreColorFormats[formatNdx];
5379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str()));
5380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
5382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		{
5383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			const VkAttachmentLoadOp		loadOp	= loadOps[loadOpNdx].op;
5384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
5385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
5387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			{
5388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi				const RenderPass	renderPass	(vector<Attachment>(1, Attachment(format,
538968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos																				  VK_SAMPLE_COUNT_1_BIT,
5390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  loadOp,
5391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_STORE_OP_STORE,
5392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_LOAD_OP_DONT_CARE,
5393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_ATTACHMENT_STORE_OP_DONT_CARE,
5394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																				  VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
5397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			0u,
5398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(),
5399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
5400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			vector<AttachmentReference>(),
5401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi																			AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
540258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			vector<deUint32>())),
5403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi												 vector<SubpassDependency>());
540418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
540518cca0001c3ce503dcc339c839ed85be639e11e5Mika 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));
540618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			}
540718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
540818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			formatGroup->addChild(loadOpGroup.release());
540918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		}
541018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
541158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
541258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	inputGroup (new tcu::TestCaseGroup(testCtx, "input", "Test attachment format as input"));
541358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
541458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
541558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
541658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkAttachmentLoadOp		loadOp		= loadOps[loadOpNdx].op;
541758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
541858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
541958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t storeOpNdx = 0; storeOpNdx < DE_LENGTH_OF_ARRAY(storeOps); storeOpNdx++)
542058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
542158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentStoreOp		storeOp			= storeOps[storeOpNdx].op;
542258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					de::MovePtr<tcu::TestCaseGroup>	storeOpGroup	(new tcu::TestCaseGroup(testCtx, storeOps[storeOpNdx].str, storeOps[storeOpNdx].str));
542358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
542458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
542558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
542658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
542758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Attachment>			attachments;
542858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Subpass>				subpasses;
542958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<SubpassDependency>	deps;
543058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
543158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							attachments.push_back(Attachment(format,
543258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_SAMPLE_COUNT_1_BIT,
543358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 loadOp,
543458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 storeOp,
543558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
543658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_DONT_CARE,
543758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
543858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
543958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
544058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							attachments.push_back(Attachment(vk::VK_FORMAT_R8G8B8A8_UNORM,
544158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_SAMPLE_COUNT_1_BIT,
544258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
544358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_STORE,
544458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
544558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_DONT_CARE,
544658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
544758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
544858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
544958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
545058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
545158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
545258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
545358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
545458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
545558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
545658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
545758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
545858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)),
545958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
546058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
546158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
546258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
546358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
546458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							deps.push_back(SubpassDependency(0, 1,
546558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
546658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
546758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
546858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
546958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
547058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
547158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_DEPENDENCY_BY_REGION_BIT));
547258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
547358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
547458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const RenderPass renderPass (attachments, subpasses, deps);
547558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
547658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246));
547758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
547858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
547958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
548058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Attachment>			attachments;
548158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Subpass>				subpasses;
548258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<SubpassDependency>	deps;
548358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
548458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							attachments.push_back(Attachment(format,
548558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_SAMPLE_COUNT_1_BIT,
548658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 loadOp,
548758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 storeOp,
548858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
548958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_DONT_CARE,
549058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
549158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
549258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
549358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
549458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
549558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
549658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
549758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
549858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
549958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
550058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
550158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
550258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL)),
550358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL)),
550458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
550558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
550658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
550758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
550858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							deps.push_back(SubpassDependency(0, 1,
550958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
551058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
551158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
551258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
551358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
551458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_DEPENDENCY_BY_REGION_BIT));
551558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
551658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
551758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const RenderPass renderPass (attachments, subpasses, deps);
551858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
551958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), string("self_dep_") + renderTypes[renderTypeNdx].str, string("self_dep_") + renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246));
552058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
552158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
552258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
552358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
552458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					loadOpGroup->addChild(storeOpGroup.release());
552558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
552658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
552758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				inputGroup->addChild(loadOpGroup.release());
552858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
552958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
553058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			formatGroup->addChild(inputGroup.release());
553158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
553258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
553318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		group->addChild(formatGroup.release());
553418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	}
553518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
553618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	// Depth stencil formats
553718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreDepthStencilFormats); formatNdx++)
553818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi	{
55399475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi		const VkFormat					vkFormat		= s_coreDepthStencilFormats[formatNdx];
55409475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi		de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx, formatToName(vkFormat).c_str(), de::toString(vkFormat).c_str()));
554118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
554218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
554318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi		{
554418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			const VkAttachmentLoadOp		loadOp	= loadOps[loadOpNdx].op;
554518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
554618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi
554718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
554818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi			{
55499475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi				const tcu::TextureFormat	format				= mapVkFormat(vkFormat);
55509475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi				const bool					isStencilAttachment	= hasStencilComponent(format.order);
55519475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi				const bool					isDepthAttachment	= hasDepthComponent(format.order);
55529475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi				const RenderPass			renderPass			(vector<Attachment>(1, Attachment(vkFormat,
555318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_SAMPLE_COUNT_1_BIT,
55549475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi																				  isDepthAttachment ? loadOp : VK_ATTACHMENT_LOAD_OP_DONT_CARE,
55559475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi																				  isDepthAttachment ? VK_ATTACHMENT_STORE_OP_STORE :VK_ATTACHMENT_STORE_OP_DONT_CARE,
55569475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi																				  isStencilAttachment ? loadOp : VK_ATTACHMENT_LOAD_OP_DONT_CARE,
55579475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi																				  isStencilAttachment ? VK_ATTACHMENT_STORE_OP_STORE :VK_ATTACHMENT_STORE_OP_DONT_CARE,
555818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
555918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																				  VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)),
556018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi												 vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
556118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			0u,
556218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
556318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
556418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			vector<AttachmentReference>(),
556518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi																			AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
556658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi																			vector<deUint32>())),
556718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi												 vector<SubpassDependency>());
5568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5569c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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));
5570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			}
5571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi			formatGroup->addChild(loadOpGroup.release());
5573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		}
5574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
557558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		{
557658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			de::MovePtr<tcu::TestCaseGroup>	inputGroup (new tcu::TestCaseGroup(testCtx, "input", "Test attachment format as input"));
557758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
557858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++)
557958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			{
558058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				const VkAttachmentLoadOp		loadOp		= loadOps[loadOpNdx].op;
558158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				de::MovePtr<tcu::TestCaseGroup>	loadOpGroup	(new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str));
558258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
558358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				for (size_t storeOpNdx = 0; storeOpNdx < DE_LENGTH_OF_ARRAY(storeOps); storeOpNdx++)
558458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				{
558558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					const VkAttachmentStoreOp		storeOp			= storeOps[storeOpNdx].op;
558658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					de::MovePtr<tcu::TestCaseGroup>	storeOpGroup	(new tcu::TestCaseGroup(testCtx, storeOps[storeOpNdx].str, storeOps[storeOpNdx].str));
558758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
558858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++)
558958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					{
559058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
559158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Attachment>			attachments;
559258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Subpass>				subpasses;
559358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<SubpassDependency>	deps;
559458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
559558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							attachments.push_back(Attachment(vkFormat,
559658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_SAMPLE_COUNT_1_BIT,
559758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 loadOp,
559858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 storeOp,
559958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
560058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_DONT_CARE,
560158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
560258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
560358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
560458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							attachments.push_back(Attachment(vk::VK_FORMAT_R8G8B8A8_UNORM,
560558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_SAMPLE_COUNT_1_BIT,
560658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
560758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_STORE,
560858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
560958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_DONT_CARE,
561058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
561158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
561258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
561358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
561458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
561558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
561658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
561758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
561858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
561958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
562058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
562158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
562258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)),
562358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)),
562458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
562558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL),
562658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
562758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
562858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							deps.push_back(SubpassDependency(0, 1,
562958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
563058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
563158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
563258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
563358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
563458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															0u));
563558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
563658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							deps.push_back(SubpassDependency(1, 1,
563758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
563858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
563958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
564058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
564158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
564258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_DEPENDENCY_BY_REGION_BIT));
564358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
564458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const RenderPass renderPass (attachments, subpasses, deps);
564558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
564658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246));
564758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
564858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
564958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						{
565058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Attachment>			attachments;
565158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<Subpass>				subpasses;
565258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							vector<SubpassDependency>	deps;
565358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
565458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							attachments.push_back(Attachment(vkFormat,
565558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_SAMPLE_COUNT_1_BIT,
565658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 loadOp,
565758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 storeOp,
565858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
565958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_ATTACHMENT_STORE_OP_DONT_CARE,
566058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
566158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
566258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
566358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
566458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
566558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
566658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
566758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
566858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL),
566958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
567058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS,
567158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														0u,
567258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL)),
567358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
567458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<AttachmentReference>(),
567558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL),
567658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi														vector<deUint32>()));
567758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
567858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							deps.push_back(SubpassDependency(0, 1,
567958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
568058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
568158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
568258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
568358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
568458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi															vk::VK_DEPENDENCY_BY_REGION_BIT));
568558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
568658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							{
568758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								const RenderPass renderPass (attachments, subpasses, deps);
568858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
568958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi								addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), string("self_dep_") + renderTypes[renderTypeNdx].str, string("self_dep_") + renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246));
569058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi							}
569158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi						}
569258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					}
569358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
569458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi					loadOpGroup->addChild(storeOpGroup.release());
569558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				}
569658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
569758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi				inputGroup->addChild(loadOpGroup.release());
569858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			}
569958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
570058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi			formatGroup->addChild(inputGroup.release());
570158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi		}
570258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi
5703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi		group->addChild(formatGroup.release());
5704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	}
5705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
5706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // anonymous
5708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestCaseGroup* createRenderPassTests (tcu::TestContext& testCtx)
5710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{
5711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	de::MovePtr<tcu::TestCaseGroup>	renderpassTests	(new tcu::TestCaseGroup(testCtx, "renderpass", "RenderPass Tests"));
5712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
571358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	addTestGroup(renderpassTests.get(), "simple", "Simple basic render pass tests", addSimpleTests);
571458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	addTestGroup(renderpassTests.get(), "formats", "Tests for different image formats.", addFormatTests);
571558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	addTestGroup(renderpassTests.get(), "attachment", "Attachment format and count tests with load and store ops and image layouts", addAttachmentTests);
571658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi	addTestGroup(renderpassTests.get(), "attachment_allocation", "Attachment allocation tests", addAttachmentAllocationTests);
5717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi	return renderpassTests.release();
5719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}
5720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi
5721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // vkt
5722