1e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga/*------------------------------------------------------------------------
2e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Vulkan Conformance Tests
3e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * ------------------------
4e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *
5e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Copyright (c) 2017 The Khronos Group Inc.
6e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *
7e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Licensed under the Apache License, Version 2.0 (the "License");
8e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * you may not use this file except in compliance with the License.
9e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * You may obtain a copy of the License at
10e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *
11e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *      http://www.apache.org/licenses/LICENSE-2.0
12e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *
13e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Unless required by applicable law or agreed to in writing, software
14e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * distributed under the License is distributed on an "AS IS" BASIS,
15e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * See the License for the specific language governing permissions and
17e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * limitations under the License.
18e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *
19e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *//*!
20e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * \file
21e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * \brief Tests for mutable images
22e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *//*--------------------------------------------------------------------*/
23e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
24e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vktImageMutableTests.hpp"
25e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vktTestCaseUtil.hpp"
26e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vktImageTexture.hpp"
27e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
28e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vkBuilderUtil.hpp"
29e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vkQueryUtil.hpp"
30e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vkImageUtil.hpp"
31e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
32e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "deUniquePtr.hpp"
33e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "deSharedPtr.hpp"
34e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
35e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "tcuImageCompare.hpp"
36e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "tcuTestLog.hpp"
37e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "tcuTextureUtil.hpp"
38e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
39e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include <string>
40e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include <vector>
41e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
42e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing namespace vk;
43e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing namespace tcu;
44e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
45e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing de::UniquePtr;
46e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing de::MovePtr;
47e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing de::SharedPtr;
48e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing std::vector;
49e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
50e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroganamespace vkt
51e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
52e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroganamespace image
53e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
54e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
55e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatypedef SharedPtr<Unique<VkPipeline> >	SharedPtrVkPipeline;
56e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatypedef SharedPtr<Unique<VkImageView> >	SharedPtrVkImageView;
57e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
58e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatemplate<typename T>
59e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move)
60e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
61e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return SharedPtr<Unique<T> >(new Unique<T>(move));
62e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
63e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
64e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaenum Upload {
65e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UPLOAD_CLEAR = 0,
66e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UPLOAD_COPY,
67e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UPLOAD_STORE,
68e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UPLOAD_DRAW,
69e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UPLOAD_LAST
70e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
71e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
72e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaenum Download {
73e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DOWNLOAD_COPY = 0,
74e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DOWNLOAD_LOAD,
75e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DOWNLOAD_TEXTURE,
76e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DOWNLOAD_LAST
77e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
78e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
79e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getUploadString (const int upload)
80e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
81e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const char* strs[] = { "clear", "copy", "store", "draw" };
82e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return strs[upload];
83e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
84e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
85e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getDownloadString (const int download)
86e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
87e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const char* strs[] = { "copy", "load", "texture" };
88e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return strs[download];
89e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
90e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
91e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastruct CaseDef
92e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
93e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	ImageType		imageType;
94e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	IVec3			size;
95e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	deUint32		numLayers;
96e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkFormat		imageFormat;
97e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkFormat		viewFormat;
98e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	enum Upload		upload;
99e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	enum Download	download;
10016b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	bool			isFormatListTest;
101e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
102e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
103e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const deUint32 COLOR_TABLE_SIZE = 4;
104e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
105e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Reference color values for float color rendering. Values have been chosen
106e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// so that when the bit patterns are reinterpreted as a 16-bit float, we do not
107e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// run into NaN / inf / denorm values.
108e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const Vec4	COLOR_TABLE_FLOAT[COLOR_TABLE_SIZE]	=
109e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
110e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Vec4(0.00f, 0.40f, 0.80f, 0.10f),
111e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Vec4(0.10f, 0.50f, 0.90f, 0.20f),
112e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Vec4(0.20f, 0.60f, 1.00f, 0.30f),
113e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Vec4(0.30f, 0.70f, 0.00f, 0.40f),
114e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
115e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
116e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Reference color values for integer color rendering. We avoid negative
117e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// values (even for SINT formats) to avoid the situation where sign extension
118e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// leads to NaN / inf values when they are reinterpreted with a float
119e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// format.
120e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const IVec4	COLOR_TABLE_INT[COLOR_TABLE_SIZE]	=
121e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
122e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	IVec4(112,  60,	101,  41),
123e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	IVec4( 60, 101,	 41, 112),
124e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	IVec4( 41, 112,	 60, 101),
125e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	IVec4(101,  41,	112,  60),
126e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
127e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
128e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Reference clear colors created from the color table values
129e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const VkClearValue REFERENCE_CLEAR_COLOR_FLOAT[COLOR_TABLE_SIZE]	=
130e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
131e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorF32(COLOR_TABLE_FLOAT[0].x(), COLOR_TABLE_FLOAT[0].y(), COLOR_TABLE_FLOAT[0].z(), COLOR_TABLE_FLOAT[0].w()),
132e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorF32(COLOR_TABLE_FLOAT[1].x(), COLOR_TABLE_FLOAT[1].y(), COLOR_TABLE_FLOAT[1].z(), COLOR_TABLE_FLOAT[1].w()),
133e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorF32(COLOR_TABLE_FLOAT[2].x(), COLOR_TABLE_FLOAT[2].y(), COLOR_TABLE_FLOAT[2].z(), COLOR_TABLE_FLOAT[2].w()),
134e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorF32(COLOR_TABLE_FLOAT[3].x(), COLOR_TABLE_FLOAT[3].y(), COLOR_TABLE_FLOAT[3].z(), COLOR_TABLE_FLOAT[3].w()),
135e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
136e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
137e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const VkClearValue REFERENCE_CLEAR_COLOR_INT[COLOR_TABLE_SIZE]	=
138e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
139e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorI32(COLOR_TABLE_INT[0].x(), COLOR_TABLE_INT[0].y(), COLOR_TABLE_INT[0].z(), COLOR_TABLE_INT[0].w()),
140e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorI32(COLOR_TABLE_INT[1].x(), COLOR_TABLE_INT[1].y(), COLOR_TABLE_INT[1].z(), COLOR_TABLE_INT[1].w()),
141e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorI32(COLOR_TABLE_INT[2].x(), COLOR_TABLE_INT[2].y(), COLOR_TABLE_INT[2].z(), COLOR_TABLE_INT[2].w()),
142e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	makeClearValueColorI32(COLOR_TABLE_INT[3].x(), COLOR_TABLE_INT[3].y(), COLOR_TABLE_INT[3].z(), COLOR_TABLE_INT[3].w()),
143e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
144e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
145e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const Texture s_textures[] =
146e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
147e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Texture(IMAGE_TYPE_2D,			tcu::IVec3(32, 32, 1),	1),
148e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Texture(IMAGE_TYPE_2D_ARRAY,	tcu::IVec3(32, 32, 1),	4),
149e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
150e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
151e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaVkImageType getImageType (const ImageType textureImageType)
152e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
153e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (textureImageType)
154e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
155e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case IMAGE_TYPE_2D:
156e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case IMAGE_TYPE_2D_ARRAY:
157e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return VK_IMAGE_TYPE_2D;
158e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
159e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		default:
160e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_ASSERT(0);
161e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return VK_IMAGE_TYPE_LAST;
162e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
163e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
164e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
165e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaVkImageViewType getImageViewType (const ImageType textureImageType)
166e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
167e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (textureImageType)
168e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
169e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case IMAGE_TYPE_2D:
170e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return VK_IMAGE_VIEW_TYPE_2D;
171e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case IMAGE_TYPE_2D_ARRAY:
172e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
173e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
174e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		default:
175e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_ASSERT(0);
176e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return VK_IMAGE_VIEW_TYPE_LAST;
177e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
178e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
179e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
180e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const VkFormat s_formats[] =
181e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
182e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32G32B32A32_SFLOAT,
183e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R16G16B16A16_SFLOAT,
184e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32G32_SFLOAT,
185e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R16G16_SFLOAT,
186e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32_SFLOAT,
187e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
188e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32G32B32A32_UINT,
189e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R16G16B16A16_UINT,
190e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R8G8B8A8_UINT,
191e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32G32_UINT,
192e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R16G16_UINT,
193e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32_UINT,
194e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
195e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32G32B32A32_SINT,
196e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R16G16B16A16_SINT,
197e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R8G8B8A8_SINT,
198e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32G32_SINT,
199e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R16G16_SINT,
200e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R32_SINT,
201e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
202e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R8G8B8A8_UNORM,
203e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
204e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_FORMAT_R8G8B8A8_SNORM,
205e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
206e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
207e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline bool formatsAreCompatible (const VkFormat format0, const VkFormat format1)
208e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
209e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return format0 == format1 || mapVkFormat(format0).getPixelSize() == mapVkFormat(format1).getPixelSize();
210e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
211e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
212e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getColorFormatStr (const int numComponents, const bool isUint, const bool isSint)
213e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
214e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	std::ostringstream str;
215e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (numComponents == 1)
216e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		str << (isUint ? "uint" : isSint ? "int" : "float");
217e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	else
218e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		str << (isUint ? "u" : isSint ? "i" : "") << "vec" << numComponents;
219e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
220e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return str.str();
221e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
222e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
223e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getShaderSamplerType (const tcu::TextureFormat& format, VkImageViewType type)
224e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
225e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	std::ostringstream samplerType;
226e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
227e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
228e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		samplerType << "u";
229e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
230e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		samplerType << "i";
231e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
232e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (type)
233e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
234e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_IMAGE_VIEW_TYPE_2D:
235e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			samplerType << "sampler2D";
236e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			break;
237e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
238e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
239e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			samplerType << "sampler2DArray";
240e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			break;
241e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
242e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		default:
243e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_FATAL("Ivalid image view type");
244e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			break;
245e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
246e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
247e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return samplerType.str();
248e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
249e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
250e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid initPrograms (SourceCollections& programCollection, const CaseDef caseDef)
251e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
252e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (caseDef.upload == UPLOAD_DRAW)
253e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
254e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
255e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			std::ostringstream src;
256e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
257e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "\n"
258e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "layout(location = 0) in  vec4 in_position;\n"
259e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "layout(location = 1) in  vec4 in_color;\n"
260e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "layout(location = 0) out vec4 out_color;\n"
261e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "\n"
262e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "out gl_PerVertex {\n"
263e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "	vec4 gl_Position;\n"
264e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "};\n"
265e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "\n"
266e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "void main(void)\n"
267e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "{\n"
268e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "	gl_Position	= in_position;\n"
269e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "	out_color	= in_color;\n"
270e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "}\n";
271e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
272e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			programCollection.glslSources.add("uploadDrawVert") << glu::VertexSource(src.str());
273e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
274e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
275e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
276e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			const int	numComponents		= getNumUsedChannels(mapVkFormat(caseDef.viewFormat).order);
277e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			const bool	isUint				= isUintFormat(caseDef.viewFormat);
278e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			const bool	isSint				= isIntFormat(caseDef.viewFormat);
279e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			const std::string colorFormat	= getColorFormatStr(numComponents, isUint, isSint);
280e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
281e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			std::ostringstream src;
282e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
283e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "\n"
284e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "layout(location = 0) in  vec4 in_color;\n"
285e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "layout(location = 0) out " << colorFormat << " out_color;\n"
286e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "\n"
287e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "void main(void)\n"
288e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "{\n"
289e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "    out_color = " << colorFormat << "("
290e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< (numComponents == 1 ? "in_color.r"   :
291e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga					numComponents == 2 ? "in_color.rg"  :
292e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga					numComponents == 3 ? "in_color.rgb" : "in_color")
293e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< ");\n"
294e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				<< "}\n";
295e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
296e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			programCollection.glslSources.add("uploadDrawFrag") << glu::FragmentSource(src.str());
297e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
298e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
299e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
300e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (caseDef.upload == UPLOAD_STORE)
301e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
302e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const TextureFormat	tcuFormat		= mapVkFormat(caseDef.viewFormat);
303e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string	imageFormatStr	= getShaderImageFormatQualifier(tcuFormat);
304e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string	imageTypeStr	= getShaderImageType(tcuFormat, caseDef.imageType);
305e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string	colorTypeStr	= isUintFormat(caseDef.viewFormat) ? "uvec4" : isIntFormat(caseDef.viewFormat) ? "ivec4" : "vec4";
306e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const bool			isIntegerFormat	= isUintFormat(caseDef.viewFormat) || isIntFormat(caseDef.viewFormat);
307e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
308e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		std::ostringstream src;
309e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
310e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
311e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout (local_size_x = 1) in;\n"
312e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
313e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout(binding=0, " << imageFormatStr << ") writeonly uniform " << imageTypeStr << " u_image;\n"
314e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
315e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "const " << colorTypeStr << " colorTable[] = " << colorTypeStr << "[](\n";
316e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		for (deUint32 idx = 0; idx < COLOR_TABLE_SIZE; idx++)
317e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
318e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			if (isIntegerFormat)
319e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				src << "     " << colorTypeStr << "(" << COLOR_TABLE_INT[idx].x() << ", " << COLOR_TABLE_INT[idx].y() << ", " << COLOR_TABLE_INT[idx].z() << ", " << COLOR_TABLE_INT[idx].w() << ")";
320e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			else
321e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				src << "     " << colorTypeStr << "(" << COLOR_TABLE_FLOAT[idx].x() << ", " << COLOR_TABLE_FLOAT[idx].y() << ", " << COLOR_TABLE_FLOAT[idx].z() << ", " << COLOR_TABLE_FLOAT[idx].w() << ")";
322e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			if (idx < COLOR_TABLE_SIZE - 1)
323e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				src << ",";
324e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src << "\n";
325e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
326e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src << ");\n"
327e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
328e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "void main(void)\n"
329e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "{\n";
330e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		if (caseDef.imageType == IMAGE_TYPE_2D)
331e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
332e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src	<< "    ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n";
333e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
334e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		else
335e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
336e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_ASSERT(caseDef.imageType == IMAGE_TYPE_2D_ARRAY);
337e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src	<< "    ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n";
338e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
339e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src << "    " << colorTypeStr << " color = colorTable[gl_GlobalInvocationID.z];\n"
340e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "    imageStore(u_image, pos, color);\n"
341e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "}\n";
342e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
343e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		programCollection.glslSources.add("uploadStoreComp") << glu::ComputeSource(src.str());
344e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
345e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
346e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (caseDef.download == DOWNLOAD_LOAD)
347e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
348e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const TextureFormat	tcuFormat		= mapVkFormat(caseDef.viewFormat);
349e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string	imageFormatStr	= getShaderImageFormatQualifier(tcuFormat);
350e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string	imageTypeStr	= getShaderImageType(tcuFormat, caseDef.imageType);
351e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string	colorTypeStr	= isUintFormat(caseDef.viewFormat) ? "uvec4" : isIntFormat(caseDef.viewFormat) ? "ivec4" : "vec4";
352e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
353e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		std::ostringstream src;
354e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
355e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
356e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout (local_size_x = 1) in;\n"
357e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
358e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout(binding=0, " << imageFormatStr << ") readonly uniform " << imageTypeStr << " in_image;\n"
359e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout(binding=1, " << imageFormatStr << ") writeonly uniform " << imageTypeStr << " out_image;\n"
360e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
361e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "void main(void)\n"
362e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "{\n";
363e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		if (caseDef.imageType == IMAGE_TYPE_2D)
364e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
365e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src	<< "    ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n";
366e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
367e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		else
368e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
369e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_ASSERT(caseDef.imageType == IMAGE_TYPE_2D_ARRAY);
370e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src	<< "    ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n";
371e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
372e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src	<< "    imageStore(out_image, pos, imageLoad(in_image, pos));\n"
373e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "}\n";
374e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
375e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		programCollection.glslSources.add("downloadLoadComp") << glu::ComputeSource(src.str());
376e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
377e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
378e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (caseDef.download == DOWNLOAD_TEXTURE)
379e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
380e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const TextureFormat		tcuFormat		= mapVkFormat(caseDef.viewFormat);
381e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkImageViewType	viewType		= getImageViewType(caseDef.imageType);
382e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string		samplerTypeStr	= getShaderSamplerType(tcuFormat, viewType);
383e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string		imageFormatStr	= getShaderImageFormatQualifier(tcuFormat);
384e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string		imageTypeStr	= getShaderImageType(tcuFormat, caseDef.imageType);
385e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const std::string		colorTypeStr	= isUintFormat(caseDef.viewFormat) ? "uvec4" : isIntFormat(caseDef.viewFormat) ? "ivec4" : "vec4";
386e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
387e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		std::ostringstream src;
388e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
389e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
390e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout (local_size_x = 1) in;\n"
391e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
392e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout(binding=0) uniform " << samplerTypeStr << " u_tex;\n"
393e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "layout(binding=1, " << imageFormatStr << ") writeonly uniform " << imageTypeStr << " out_image;\n"
394e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "\n"
395e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "void main(void)\n"
396e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "{\n";
397e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		if (caseDef.imageType == IMAGE_TYPE_2D)
398e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
399e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src	<< "    ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n";
400e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
401e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		else
402e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
403e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_ASSERT(caseDef.imageType == IMAGE_TYPE_2D_ARRAY);
404e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			src	<< "    ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n";
405e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
406e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		src	<< "    imageStore(out_image, pos, texelFetch(u_tex, pos, 0));\n"
407e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			<< "}\n";
408e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
409e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		programCollection.glslSources.add("downloadTextureComp") << glu::ComputeSource(src.str());
410e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
411e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
412e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
413e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkImage> makeImage (const DeviceInterface&		vk,
414e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 const VkDevice				device,
415e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 VkImageCreateFlags			flags,
416e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 VkImageType				imageType,
417e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 const VkFormat				format,
41816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga						 const VkFormat				viewFormat,
41916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga						 const bool					useImageFormatList,
420e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 const IVec3&				size,
421e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 const deUint32				numMipLevels,
422e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 const deUint32				numLayers,
423e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						 const VkImageUsageFlags	usage)
424e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
42516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	const VkFormat formatList[2] =
42616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	{
42716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		format,
42816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		viewFormat
42916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	};
43016b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga
43116b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	const VkImageFormatListCreateInfoKHR formatListInfo =
43216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	{
43316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR,	// VkStructureType			sType;
43416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		DE_NULL,												// const void*				pNext;
435da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		2u,														// deUint32					viewFormatCount
43616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		formatList												// const VkFormat*			pViewFormats
43716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	};
43816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga
439e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageCreateInfo imageParams =
440e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
44116b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
44216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		useImageFormatList ? &formatListInfo : DE_NULL,			// const void*				pNext;
44316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		flags,													// VkImageCreateFlags		flags;
44416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		imageType,												// VkImageType				imageType;
44516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		format,													// VkFormat					format;
44616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		makeExtent3D(size),										// VkExtent3D				extent;
44716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		numMipLevels,											// deUint32					mipLevels;
44816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		numLayers,												// deUint32					arrayLayers;
44916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
45016b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
45116b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		usage,													// VkImageUsageFlags		usage;
45216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
45316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		0u,														// deUint32					queueFamilyIndexCount;
45416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		DE_NULL,												// const deUint32*			pQueueFamilyIndices;
45516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		VK_IMAGE_LAYOUT_UNDEFINED,								// VkImageLayout			initialLayout;
456e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
457e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createImage(vk, device, &imageParams);
458e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
459e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
460e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
461e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
462e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
463e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createBuffer(vk, device, &bufferCreateInfo);
464e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
465e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
466e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline VkImageSubresourceRange makeColorSubresourceRange (const int baseArrayLayer, const int layerCount)
467e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
468e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, static_cast<deUint32>(baseArrayLayer), static_cast<deUint32>(layerCount));
469e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
470e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
471e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkSampler> makeSampler (const DeviceInterface& vk, const VkDevice device)
472e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
473e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkSamplerCreateInfo samplerParams =
474e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
475e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,		// VkStructureType			sType;
476e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,									// const void*				pNext;
477e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkSamplerCreateFlags)0,					// VkSamplerCreateFlags		flags;
478e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FILTER_NEAREST,							// VkFilter					magFilter;
479e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FILTER_NEAREST,							// VkFilter					minFilter;
480e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SAMPLER_MIPMAP_MODE_NEAREST,				// VkSamplerMipmapMode		mipmapMode;
481e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		// VkSamplerAddressMode		addressModeU;
482e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		// VkSamplerAddressMode		addressModeV;
483e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		// VkSamplerAddressMode		addressModeW;
484e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,										// float					mipLodBias;
485e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,									// VkBool32					anisotropyEnable;
486e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		1.0f,										// float					maxAnisotropy;
487e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,									// VkBool32					compareEnable;
488e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_COMPARE_OP_ALWAYS,						// VkCompareOp				compareOp;
489e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,										// float					minLod;
490e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,										// float					maxLod;
491e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,	// VkBorderColor			borderColor;
492e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,									// VkBool32					unnormalizedCoordinates;
493e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
494e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
495e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createSampler(vk, device, &samplerParams);
496e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
497e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
498e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
499e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface&	vk,
500e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga										   const VkDevice			device)
501e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
502e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineLayoutCreateInfo info =
503e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
504e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
505e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,
506e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineLayoutCreateFlags)0,
507e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u,
508e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,
509e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u,
510e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,
511e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
512e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createPipelineLayout(vk, device, &info);
513e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
514e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
515e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface&		vk,
516e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const VkDevice				device,
517e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const VkPipelineLayout		pipelineLayout,
518e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const VkRenderPass			renderPass,
519e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const VkShaderModule			vertexModule,
520e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const VkShaderModule			fragmentModule,
521e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const IVec2&					renderSize,
522e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const VkPrimitiveTopology	topology,
523e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									   const deUint32				subpass)
524e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
525e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkVertexInputBindingDescription vertexInputBindingDescription =
526e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
527da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,									// deUint32				binding;
528da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		(deUint32)(2 * sizeof(Vec4)),		// deUint32				stride;
529e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_VERTEX_INPUT_RATE_VERTEX,		// VkVertexInputRate	inputRate;
530e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
531e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
532e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
533e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
534e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
535da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa			0u,								// deUint32			location;
536da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa			0u,								// deUint32			binding;
537e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_FORMAT_R32G32B32A32_SFLOAT,	// VkFormat			format;
538da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa			0u,								// deUint32			offset;
539e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		},
540e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
541da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa			1u,								// deUint32			location;
542da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa			0u,								// deUint32			binding;
543e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_FORMAT_R32G32B32A32_SFLOAT,	// VkFormat			format;
544da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa			(deUint32)sizeof(Vec4),			// deUint32			offset;
545e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
546e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
547e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
548e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
549e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
550e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	// VkStructureType							sType;
551e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const void*								pNext;
552e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineVertexInputStateCreateFlags)0,					// VkPipelineVertexInputStateCreateFlags	flags;
553da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		1u,															// deUint32									vertexBindingDescriptionCount;
554e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&vertexInputBindingDescription,								// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
555da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions),		// deUint32									vertexAttributeDescriptionCount;
556e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vertexInputAttributeDescriptions,							// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
557e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
558e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
559e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
560e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
561e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
562e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,														// const void*								pNext;
563e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineInputAssemblyStateCreateFlags)0,						// VkPipelineInputAssemblyStateCreateFlags	flags;
564e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		topology,														// VkPrimitiveTopology						topology;
565e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,														// VkBool32									primitiveRestartEnable;
566e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
567e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
568e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkViewport viewport = makeViewport(
569e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f, 0.0f,
570e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()),
571e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f, 1.0f);
572e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
573e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkRect2D scissor =
574e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
575e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeOffset2D(0, 0),
576e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeExtent2D(renderSize.x(), renderSize.y()),
577e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
578e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
579e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
580e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
581e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,		// VkStructureType						sType;
582e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const void*							pNext;
583e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineViewportStateCreateFlags)0,						// VkPipelineViewportStateCreateFlags	flags;
584da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		1u,															// deUint32								viewportCount;
585e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&viewport,													// const VkViewport*					pViewports;
586da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		1u,															// deUint32								scissorCount;
587e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&scissor,													// const VkRect2D*						pScissors;
588e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
589e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
590e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
591e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
592e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,	// VkStructureType							sType;
593e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const void*								pNext;
594e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineRasterizationStateCreateFlags)0,					// VkPipelineRasterizationStateCreateFlags	flags;
595e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									depthClampEnable;
596e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									rasterizerDiscardEnable;
597e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_POLYGON_MODE_FILL,										// VkPolygonMode							polygonMode;
598e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_CULL_MODE_NONE,											// VkCullModeFlags							cullMode;
599e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FRONT_FACE_COUNTER_CLOCKWISE,							// VkFrontFace								frontFace;
600e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									depthBiasEnable;
601e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,														// float									depthBiasConstantFactor;
602e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,														// float									depthBiasClamp;
603e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,														// float									depthBiasSlopeFactor;
604e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		1.0f,														// float									lineWidth;
605e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
606e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
607e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
608e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
609e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
610e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const void*								pNext;
611e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineMultisampleStateCreateFlags)0,					// VkPipelineMultisampleStateCreateFlags	flags;
612e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
613e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									sampleShadingEnable;
614e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,														// float									minSampleShading;
615e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const VkSampleMask*						pSampleMask;
616e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									alphaToCoverageEnable;
617e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE													// VkBool32									alphaToOneEnable;
618e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
619e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
620e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkStencilOpState stencilOpState = makeStencilOpState(
621e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STENCIL_OP_KEEP,											// stencil fail
622e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STENCIL_OP_ZERO,											// depth & stencil pass
623e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STENCIL_OP_KEEP,											// depth only fail
624e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_COMPARE_OP_EQUAL,										// compare op
625e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		~0u,														// compare mask
626e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		~0u,														// write mask
627e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u);														// reference
628e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
629e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
630e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
631e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
632e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const void*								pNext;
633e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineDepthStencilStateCreateFlags)0,					// VkPipelineDepthStencilStateCreateFlags	flags;
634e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									depthTestEnable;
635e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									depthWriteEnable;
636e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
637e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									depthBoundsTestEnable;
638e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32									stencilTestEnable;
639e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		stencilOpState,												// VkStencilOpState							front;
640e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		stencilOpState,												// VkStencilOpState							back;
641e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0.0f,														// float									minDepthBounds;
642e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		1.0f,														// float									maxDepthBounds;
643e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
644e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
645e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
646e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState =
647e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
648e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32					blendEnable;
649e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BLEND_FACTOR_ONE,										// VkBlendFactor			srcColorBlendFactor;
650e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BLEND_FACTOR_ZERO,										// VkBlendFactor			dstColorBlendFactor;
651e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BLEND_OP_ADD,											// VkBlendOp				colorBlendOp;
652e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BLEND_FACTOR_ONE,										// VkBlendFactor			srcAlphaBlendFactor;
653e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BLEND_FACTOR_ZERO,										// VkBlendFactor			dstAlphaBlendFactor;
654e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_BLEND_OP_ADD,											// VkBlendOp				alphaBlendOp;
655e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		colorComponentsAll,											// VkColorComponentFlags	colorWriteMask;
656e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
657e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
658e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
659e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
660e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
661e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,													// const void*									pNext;
662e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineColorBlendStateCreateFlags)0,					// VkPipelineColorBlendStateCreateFlags			flags;
663e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_FALSE,													// VkBool32										logicOpEnable;
664e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
665e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		1u,															// deUint32										attachmentCount;
666e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineColorBlendAttachmentState,							// const VkPipelineColorBlendAttachmentState*	pAttachments;
667e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{ 0.0f, 0.0f, 0.0f, 0.0f },									// float										blendConstants[4];
668e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
669e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
670e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineShaderStageCreateInfo pShaderStages[] =
671e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
672e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
673e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
674e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,												// const void*							pNext;
675e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags		flags;
676e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_SHADER_STAGE_VERTEX_BIT,								// VkShaderStageFlagBits				stage;
677e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			vertexModule,											// VkShaderModule						module;
678e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			"main",													// const char*							pName;
679e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,												// const VkSpecializationInfo*			pSpecializationInfo;
680e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		},
681e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
682e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
683e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,												// const void*							pNext;
684e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags		flags;
685e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_SHADER_STAGE_FRAGMENT_BIT,							// VkShaderStageFlagBits				stage;
686e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			fragmentModule,											// VkShaderModule						module;
687e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			"main",													// const char*							pName;
688e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,												// const VkSpecializationInfo*			pSpecializationInfo;
689e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
690e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
691e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
692e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkGraphicsPipelineCreateInfo	graphicsPipelineInfo =
693e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
694e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
695e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*										pNext;
696e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u,													// VkPipelineCreateFlags							flags;
697e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_LENGTH_OF_ARRAY(pShaderStages),					// deUint32											stageCount;
698e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		pShaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
699e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&vertexInputStateInfo,								// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
700e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineInputAssemblyStateInfo,					// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
701e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
702e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineViewportStateInfo,							// const VkPipelineViewportStateCreateInfo*			pViewportState;
703e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineRasterizationStateInfo,					// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
704e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineMultisampleStateInfo,						// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
705e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineDepthStencilStateInfo,						// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
706e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&pipelineColorBlendStateInfo,						// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
707e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
708e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		pipelineLayout,										// VkPipelineLayout									layout;
709e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		renderPass,											// VkRenderPass										renderPass;
710e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		subpass,											// deUint32											subpass;
711e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// VkPipeline										basePipelineHandle;
712e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0,													// deInt32											basePipelineIndex;
713e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
714e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
715e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
716e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
717e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
718e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkPipeline> makeComputePipeline (const DeviceInterface&		vk,
719e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									  const VkDevice				device,
720e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									  const VkPipelineLayout		pipelineLayout,
721e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									  const VkShaderModule			shaderModule,
722e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									  const VkSpecializationInfo*	specInfo)
723e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
724e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPipelineShaderStageCreateInfo shaderStageInfo =
725e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
726e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType					sType;
727e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,												// const void*						pNext;
728e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags	flags;
729e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SHADER_STAGE_COMPUTE_BIT,							// VkShaderStageFlagBits			stage;
730e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		shaderModule,											// VkShaderModule					module;
731e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		"main",													// const char*						pName;
732e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		specInfo,												// const VkSpecializationInfo*		pSpecializationInfo;
733e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
734e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkComputePipelineCreateInfo pipelineInfo =
735e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
736e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,			// VkStructureType					sType;
737e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,												// const void*						pNext;
738e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkPipelineCreateFlags)0,								// VkPipelineCreateFlags			flags;
739e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		shaderStageInfo,										// VkPipelineShaderStageCreateInfo	stage;
740e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		pipelineLayout,											// VkPipelineLayout					layout;
741e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,												// VkPipeline						basePipelineHandle;
742e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0,														// deInt32							basePipelineIndex;
743e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
744e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createComputePipeline(vk, device, DE_NULL , &pipelineInfo);
745e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
746e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
747e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkRenderPass> makeRenderPass (const DeviceInterface&	vk,
748e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga								   const VkDevice			device,
749e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga								   const VkFormat			colorFormat,
750e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga								   const deUint32			numLayers)
751e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
752e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkAttachmentDescription colorAttachmentDescription =
753e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
754e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkAttachmentDescriptionFlags)0,					// VkAttachmentDescriptionFlags		flags;
755e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		colorFormat,										// VkFormat							format;
756e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits			samples;
757e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp				loadOp;
758e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
759e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
760e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
761e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout					initialLayout;
762e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout					finalLayout;
763e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
764e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	vector<VkAttachmentDescription> attachmentDescriptions(numLayers, colorAttachmentDescription);
765e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
766e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create a subpass for each attachment (each attachement is a layer of an arrayed image).
767e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	vector<VkAttachmentReference>	colorAttachmentReferences	(numLayers);
768e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	vector<VkSubpassDescription>	subpasses;
769e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
770e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Ordering here must match the framebuffer attachments
771e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (deUint32 i = 0; i < numLayers; ++i)
772e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
773e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkAttachmentReference attachmentRef =
774e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
775e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			i,													// deUint32			attachment;
776e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
777e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		};
778e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
779e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		colorAttachmentReferences[i]	= attachmentRef;
780e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
781e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkSubpassDescription		subpassDescription	=
782e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
783e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkSubpassDescriptionFlags)0,					// VkSubpassDescriptionFlags		flags;
784e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_PIPELINE_BIND_POINT_GRAPHICS,				// VkPipelineBindPoint				pipelineBindPoint;
785e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			0u,												// deUint32							inputAttachmentCount;
786e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,										// const VkAttachmentReference*		pInputAttachments;
787e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			1u,												// deUint32							colorAttachmentCount;
788e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			&colorAttachmentReferences[i],					// const VkAttachmentReference*		pColorAttachments;
789e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,										// const VkAttachmentReference*		pResolveAttachments;
790e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,										// const VkAttachmentReference*		pDepthStencilAttachment;
791e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			0u,												// deUint32							preserveAttachmentCount;
792e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL											// const deUint32*					pPreserveAttachments;
793e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		};
794e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		subpasses.push_back(subpassDescription);
795e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
796e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
797e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkRenderPassCreateInfo renderPassInfo =
798e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
799e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,				// VkStructureType					sType;
800e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,												// const void*						pNext;
801e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkRenderPassCreateFlags)0,								// VkRenderPassCreateFlags			flags;
802e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		static_cast<deUint32>(attachmentDescriptions.size()),	// deUint32							attachmentCount;
803e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&attachmentDescriptions[0],								// const VkAttachmentDescription*	pAttachments;
804e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		static_cast<deUint32>(subpasses.size()),				// deUint32							subpassCount;
805e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		&subpasses[0],											// const VkSubpassDescription*		pSubpasses;
806e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u,														// deUint32							dependencyCount;
807e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL													// const VkSubpassDependency*		pDependencies;
808e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
809e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
810e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createRenderPass(vk, device, &renderPassInfo);
811e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
812e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
813e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkFramebuffer> makeFramebuffer (const DeviceInterface&	vk,
814e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									 const VkDevice			device,
815e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									 const VkRenderPass		renderPass,
816e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									 const deUint32			attachmentCount,
817e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									 const VkImageView*		pAttachments,
818e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga									 const IVec2			size)
819e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
820e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkFramebufferCreateInfo framebufferInfo =
821e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
822e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
823e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,
824e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkFramebufferCreateFlags)0,
825e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		renderPass,
826e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		attachmentCount,
827e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		pAttachments,
828e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		static_cast<deUint32>(size.x()),
829e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		static_cast<deUint32>(size.y()),
830e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		1u,
831e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
832e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
833e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return createFramebuffer(vk, device, &framebufferInfo);
834e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
835e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
836e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkCommandBuffer> makeCommandBuffer	(const DeviceInterface& vk, const VkDevice device, const VkCommandPool commandPool)
837e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
838e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return allocateCommandBuffer(vk, device, commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
839e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
840e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
841e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
842e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
843e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga        MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
844e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga        VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
845e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga        return alloc;
846e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
847e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
848e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
849e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
850e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga        MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
851e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga        VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
852e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga        return alloc;
853e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
854e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
855e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavector<Vec4> genVertexData (const CaseDef& caseDef)
856e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
857e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	vector<Vec4>	vectorData;
858e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const bool		isIntegerFormat	= isUintFormat(caseDef.viewFormat) || isIntFormat(caseDef.viewFormat);
859e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
860e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (deUint32 z = 0; z < caseDef.numLayers; z++)
861e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
862e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const deUint32	colorIdx	= z % COLOR_TABLE_SIZE;
863e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const Vec4		color		= isIntegerFormat ? COLOR_TABLE_INT[colorIdx].cast<float>() : COLOR_TABLE_FLOAT[colorIdx];
864e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
865e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(Vec4(-1.0f, -1.0f, 0.0f, 1.0f));
866e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(color);
867e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(Vec4(-1.0f,  1.0f, 0.0f, 1.0f));
868e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(color);
869e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(Vec4( 1.0f, -1.0f, 0.0f, 1.0f));
870e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(color);
871e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(Vec4( 1.0f,  1.0f, 0.0f, 1.0f));
872e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vectorData.push_back(color);
873e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
874e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
875e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return vectorData;
876e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
877e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
878e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid generateExpectedImage(const tcu::PixelBufferAccess& image, const CaseDef& caseDef)
879e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
880e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(image.getFormat().type);
881e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const bool						isIntegerFormat	= channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER || channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
882e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const IVec2						size			= caseDef.size.swizzle(0, 1);
883e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
884e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (int z = 0; z < static_cast<int>(caseDef.numLayers); z++)
885e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
886e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const deUint32	colorIdx	= z % COLOR_TABLE_SIZE;
887e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		for (int y = 0; y < size.y(); y++)
888e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		for (int x = 0; x < size.x(); x++)
889e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
890e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			if (isIntegerFormat)
891e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				image.setPixel(COLOR_TABLE_INT[colorIdx], x, y, z);
892e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			else
893e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				image.setPixel(COLOR_TABLE_FLOAT[colorIdx], x, y, z);
894e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
895e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
896e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
897e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
898e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaVkImageUsageFlags getImageUsageForTestCase (const CaseDef& caseDef)
899e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
900e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkImageUsageFlags flags = 0u;
901e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
902e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (caseDef.upload)
903e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
904e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_CLEAR:
905e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
906e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
907e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_DRAW:
908e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
909e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
910e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_STORE:
911e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_STORAGE_BIT;
912e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
913e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_COPY:
914e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
915e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
916e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	default:
917e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_ASSERT("Invalid upload method");
918e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
919e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
920e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
921e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (caseDef.download)
922e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
923e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_TEXTURE:
924e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_SAMPLED_BIT;
925e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
926e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_LOAD:
927e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_STORAGE_BIT;
928e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
929e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_COPY:
930e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
931e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
932e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	default:
933e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_ASSERT("Invalid download method");
934e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
935e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
936e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
937e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// We can only create a view for the image if it is going to be used for any of these usages,
938e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// so let's make sure that we have at least one of them.
939e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkImageUsageFlags viewRequiredFlags = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
940e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if (!(flags & viewRequiredFlags))
941e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
942e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
943e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return flags;
944e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
945e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
946e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Executes a combination of upload/download methods
947e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaclass UploadDownloadExecutor
948e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
949e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogapublic:
950e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UploadDownloadExecutor(Context &context, const CaseDef& caseSpec) :
951e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_caseDef(caseSpec),
952e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_haveMaintenance2(de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance2")),
953e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk(context.getDeviceInterface()),
954e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_device(context.getDevice()),
955e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_queue(context.getUniversalQueue()),
956e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_queueFamilyIndex(context.getUniversalQueueFamilyIndex()),
957e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_allocator(context.getDefaultAllocator())
958e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
959e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
960e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
961e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void run(Context& context, VkBuffer buffer);
962e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
963e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaprivate:
964e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void uploadClear(Context& context);
965e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void uploadStore(Context& context);
966e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void uploadCopy(Context& context);
967e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void uploadDraw(Context& context);
968e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void downloadCopy(Context& context, VkBuffer buffer);
969e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void downloadTexture(Context& context, VkBuffer buffer);
970e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void downloadLoad(Context& context, VkBuffer buffer);
971e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
972e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	void copyImageToBuffer(VkImage				image,
973e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						   VkBuffer				buffer,
974e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						   const IVec3			size,
975e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						   const VkAccessFlags	srcAccessMask,
976e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						   const VkImageLayout	oldLayout,
977e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						   const deUint32		numLayers);
978e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
979e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const CaseDef&						m_caseDef;
980e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
981e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	bool								m_haveMaintenance2;
982e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
983e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const DeviceInterface&				m_vk;
984e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkDevice						m_device;
985e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkQueue						m_queue;
986e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const deUint32						m_queueFamilyIndex;
987e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Allocator&							m_allocator;
988e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
989e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Move<VkCommandPool>					m_cmdPool;
990e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Move<VkCommandBuffer>				m_cmdBuffer;
991e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
992e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	bool								m_imageIsIntegerFormat;
993e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	bool								m_viewIsIntegerFormat;
994e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
995e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Target image for upload paths
996e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Move<VkImage>						m_image;
997e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	MovePtr<Allocation>					m_imageAlloc;
998e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
999e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Upload copy
1000e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	struct
1001e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1002e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkBuffer>					colorBuffer;
1003e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDeviceSize					colorBufferSize;
1004e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		MovePtr<Allocation>				colorBufferAlloc;
1005e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	} m_uCopy;
1006e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1007e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Upload draw
1008e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	struct
1009e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1010e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkBuffer>					vertexBuffer;
1011e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		MovePtr<Allocation>				vertexBufferAlloc;
1012e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipelineLayout>			pipelineLayout;
1013e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkRenderPass>				renderPass;
1014e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkShaderModule>			vertexModule;
1015e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkShaderModule>			fragmentModule;
1016e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vector<SharedPtrVkImageView>	attachments;
1017e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vector<VkImageView>				attachmentHandles;
1018e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		vector<SharedPtrVkPipeline>		pipelines;
1019e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkFramebuffer>				framebuffer;
1020e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	} m_uDraw;
1021e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1022e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Upload store
1023e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	struct
1024e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1025e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorPool>			descriptorPool;
1026e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipelineLayout>			pipelineLayout;
1027e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorSetLayout>		descriptorSetLayout;
1028e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorSet>			descriptorSet;
1029e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDescriptorImageInfo			imageDescriptorInfo;
1030e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkShaderModule>			computeModule;
1031e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipeline>				computePipeline;
1032e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImageView>				imageView;
1033e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	} m_uStore;
1034e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1035e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Download load
1036e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	struct
1037e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1038e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorPool>			descriptorPool;
1039e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipelineLayout>			pipelineLayout;
1040e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorSetLayout>		descriptorSetLayout;
1041e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorSet>			descriptorSet;
1042e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkShaderModule>			computeModule;
1043e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipeline>				computePipeline;
1044e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImageView>				inImageView;
1045e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDescriptorImageInfo			inImageDescriptorInfo;
1046e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImage>					outImage;
1047e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImageView>				outImageView;
1048e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		MovePtr<Allocation>				outImageAlloc;
1049e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDescriptorImageInfo			outImageDescriptorInfo;
1050e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	} m_dLoad;
1051e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1052e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Download texture
1053e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	struct
1054e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1055e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorPool>			descriptorPool;
1056e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipelineLayout>			pipelineLayout;
1057e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorSetLayout>		descriptorSetLayout;
1058e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkDescriptorSet>			descriptorSet;
1059e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkShaderModule>			computeModule;
1060e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkPipeline>				computePipeline;
1061e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImageView>				inImageView;
1062e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDescriptorImageInfo			inImageDescriptorInfo;
1063e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkSampler>					sampler;
1064e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImage>					outImage;
1065e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImageView>				outImageView;
1066e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		MovePtr<Allocation>				outImageAlloc;
1067e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDescriptorImageInfo			outImageDescriptorInfo;
1068e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	} m_dTex;
1069e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1070e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkImageLayout						m_imageLayoutAfterUpload;
1071e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkAccessFlagBits					m_imageUploadAccessMask;
1072e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga};
1073e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1074e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::run(Context& context, VkBuffer buffer)
1075e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1076e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageIsIntegerFormat	= isUintFormat(m_caseDef.imageFormat) || isIntFormat(m_caseDef.imageFormat);
1077e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_viewIsIntegerFormat	= isUintFormat(m_caseDef.viewFormat) || isIntFormat(m_caseDef.viewFormat);
1078e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1079e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_cmdPool				= createCommandPool(m_vk, m_device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, m_queueFamilyIndex);
1080e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_cmdBuffer				= makeCommandBuffer(m_vk, m_device, *m_cmdPool);
1081e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	beginCommandBuffer(m_vk, *m_cmdBuffer);
1082e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1083e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageUsageFlags		imageUsage	= getImageUsageForTestCase(m_caseDef);
1084e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageCreateFlags	imageFlags	= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | (m_haveMaintenance2 ? VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR : 0);
108516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	m_image									= makeImage(m_vk, m_device, imageFlags, getImageType(m_caseDef.imageType), m_caseDef.imageFormat, m_caseDef.viewFormat,
108616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga														m_caseDef.isFormatListTest, m_caseDef.size, 1u, m_caseDef.numLayers, imageUsage);
1087e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageAlloc							= bindImage(m_vk, m_device, m_allocator, *m_image, MemoryRequirement::Any);
1088e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1089e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (m_caseDef.upload)
1090e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1091e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_DRAW:
1092e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		uploadDraw(context);
1093e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1094e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_STORE:
1095e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		uploadStore(context);
1096e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1097e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_CLEAR:
1098e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		uploadClear(context);
1099e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1100e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_COPY:
1101e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		uploadCopy(context);
1102e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1103e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	default:
1104e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_ASSERT("Unsupported upload method");
1105e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1106e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1107e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (m_caseDef.download)
1108e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1109e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_COPY:
1110e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		downloadCopy(context, buffer);
1111e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1112e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_LOAD:
1113e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		downloadLoad(context, buffer);
1114e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1115e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_TEXTURE:
1116e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		downloadTexture(context, buffer);
1117e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1118e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	default:
1119e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_ASSERT("Unsupported download method");
1120e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1121e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1122e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VK_CHECK(m_vk.endCommandBuffer(*m_cmdBuffer));
1123e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	submitCommandsAndWait(m_vk, m_device, m_queue, *m_cmdBuffer);
1124e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1125e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1126e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadClear(Context& context)
1127e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1128e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	(void) context;
1129e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1130e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkImageLayout					requiredImageLayout	= VK_IMAGE_LAYOUT_GENERAL;
1131e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1132e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageSubresourceRange	subresourceRange	= makeColorSubresourceRange(0, m_caseDef.numLayers);
1133e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier		imageInitBarrier	=
1134e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1135e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// VkStructureType			sType;
1136e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,										// const void*				pNext;
1137e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u,												// VkAccessFlags			srcAccessMask;
1138e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_WRITE_BIT,					// VkAccessFlags			dstAcessMask;
1139e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_UNDEFINED,						// VkImageLayout			oldLayout;
1140e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		requiredImageLayout,							// VkImageLayout			newLayout;
1141e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,						// deUint32					srcQueueFamilyIndex;
1142e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,						// deUint32					destQueueFamilyIndex;
1143e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		*m_image,										// VkImage					image;
1144e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		subresourceRange								// VkImageSubresourceRange	subresourceRange;
1145e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1146e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1147e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u,
1148e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 0u, DE_NULL, 1u, &imageInitBarrier);
1149e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1150e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (deUint32 layer = 0; layer < m_caseDef.numLayers; layer++)
1151e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1152e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkImageSubresourceRange	layerSubresourceRange	= makeColorSubresourceRange(layer, 1u);
1153e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const deUint32					colorIdx				= layer % COLOR_TABLE_SIZE;
1154e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkClearColorValue			clearColor				= m_imageIsIntegerFormat ? REFERENCE_CLEAR_COLOR_INT[colorIdx].color : REFERENCE_CLEAR_COLOR_FLOAT[colorIdx].color;
1155e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_vk.cmdClearColorImage(*m_cmdBuffer, *m_image, requiredImageLayout, &clearColor, 1u, &layerSubresourceRange);
1156e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1157e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1158e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageLayoutAfterUpload	= requiredImageLayout;
1159e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageUploadAccessMask		= VK_ACCESS_TRANSFER_WRITE_BIT;
1160e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1161e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1162e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadStore(Context& context)
1163e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1164e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = {
1165e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,	// VkStructureType		sType
1166e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*			pNext
1167e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_USAGE_STORAGE_BIT,							// VkImageUsageFlags	usage;
1168e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1169e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.imageView				= makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat,
1170e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga													makeColorSubresourceRange(0, m_caseDef.numLayers), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL);
1171e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1172e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Setup compute pipeline
1173e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.descriptorPool			= DescriptorPoolBuilder()
1174e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
1175e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.build(m_vk, m_device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
1176e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1177e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.descriptorSetLayout	= DescriptorSetLayoutBuilder()
1178e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
1179e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.build(m_vk, m_device);
1180e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1181e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.pipelineLayout			= makePipelineLayout(m_vk, m_device, *m_uStore.descriptorSetLayout);
1182e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.descriptorSet			= makeDescriptorSet(m_vk, m_device, *m_uStore.descriptorPool, *m_uStore.descriptorSetLayout);
1183e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.imageDescriptorInfo	= makeDescriptorImageInfo(DE_NULL, *m_uStore.imageView, VK_IMAGE_LAYOUT_GENERAL);
1184e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.computeModule			= createShaderModule(m_vk, m_device, context.getBinaryCollection().get("uploadStoreComp"), 0);
1185e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uStore.computePipeline		= makeComputePipeline(m_vk, m_device, *m_uStore.pipelineLayout, *m_uStore.computeModule, DE_NULL);
1186e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1187e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DescriptorSetUpdateBuilder()
1188e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.writeSingle(*m_uStore.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_uStore.imageDescriptorInfo)
1189e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.update(m_vk, m_device);
1190e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1191e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Transition storage image for shader access (imageStore)
1192e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkImageLayout requiredImageLayout	= VK_IMAGE_LAYOUT_GENERAL;
1193e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier imageBarrier	=
1194e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1195e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1196e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*				pNext;
1197e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkAccessFlags)0,									// VkAccessFlags			srcAccessMask;
1198e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		(VkAccessFlags)VK_ACCESS_SHADER_WRITE_BIT,			// VkAccessFlags			dstAccessMask;
1199e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			oldLayout;
1200e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		requiredImageLayout,								// VkImageLayout			newLayout;
1201e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1202e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1203e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		*m_image,											// VkImage					image;
1204e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeColorSubresourceRange(0, m_caseDef.numLayers),	// VkImageSubresourceRange	subresourceRange;
1205e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1206e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1207e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u,
1208e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 0u, DE_NULL, 1u, &imageBarrier);
1209e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1210e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Dispatch
1211e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_uStore.computePipeline);
1212e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_uStore.pipelineLayout, 0u, 1u, &m_uStore.descriptorSet.get(), 0u, DE_NULL);
1213e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdDispatch(*m_cmdBuffer, m_caseDef.size.x(), m_caseDef.size.y(), m_caseDef.numLayers);
1214e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1215e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageLayoutAfterUpload	= requiredImageLayout;
1216e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageUploadAccessMask		= VK_ACCESS_SHADER_WRITE_BIT;
1217e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1218e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1219e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadCopy(Context& context)
1220e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1221e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	(void) context;
1222e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1223e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create a host-mappable buffer with the color data to upload
1224e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkDeviceSize	pixelSize			= tcu::getPixelSize(mapVkFormat(m_caseDef.imageFormat));
1225e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkDeviceSize	layerSize			= m_caseDef.size.x() * m_caseDef.size.y() * m_caseDef.size.z() * pixelSize;
1226e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1227e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uCopy.colorBufferSize					= layerSize * m_caseDef.numLayers;
1228e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uCopy.colorBuffer						= makeBuffer(m_vk, m_device, m_uCopy.colorBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
1229e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uCopy.colorBufferAlloc				= bindBuffer(m_vk, m_device, m_allocator, *m_uCopy.colorBuffer, MemoryRequirement::HostVisible);
1230e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1231e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Fill color buffer
1232e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const tcu::TextureFormat	tcuFormat	= mapVkFormat(m_caseDef.imageFormat);
1233e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkDeviceSize				layerOffset = 0ull;
1234e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (deUint32 layer = 0; layer < m_caseDef.numLayers; layer++)
1235e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1236e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		tcu::PixelBufferAccess	imageAccess	= tcu::PixelBufferAccess(tcuFormat, m_caseDef.size.x(), m_caseDef.size.y(), 1u, (deUint8*) m_uCopy.colorBufferAlloc->getHostPtr() + layerOffset);
1237e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const deUint32			colorIdx	= layer % COLOR_TABLE_SIZE;
1238e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		if (m_imageIsIntegerFormat)
1239e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			tcu::clear(imageAccess, COLOR_TABLE_INT[colorIdx]);
1240e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		else
1241e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			tcu::clear(imageAccess, COLOR_TABLE_FLOAT[colorIdx]);
1242e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		layerOffset += layerSize;
1243e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1244e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1245e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	flushMappedMemoryRange(m_vk, m_device, m_uCopy.colorBufferAlloc->getMemory(), m_uCopy.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
1246e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1247e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Prepare buffer and image for copy
1248e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkBufferMemoryBarrier	bufferInitBarrier	=
1249e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1250e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,			// VkStructureType    sType;
1251e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*        pNext;
1252e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_HOST_WRITE_BIT,							// VkAccessFlags      srcAccessMask;
1253e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_READ_BIT,						// VkAccessFlags      dstAccessMask;
1254da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		VK_QUEUE_FAMILY_IGNORED,							// deUint32           srcQueueFamilyIndex;
1255da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		VK_QUEUE_FAMILY_IGNORED,							// deUint32           dstQueueFamilyIndex;
1256e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		*m_uCopy.colorBuffer,								// VkBuffer           buffer;
1257e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0ull,												// VkDeviceSize       offset;
1258e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_WHOLE_SIZE,										// VkDeviceSize       size;
1259e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1260e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1261e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier	imageInitBarrier	=
1262e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1263e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1264e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*				pNext;
1265e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u,													// VkAccessFlags			outputMask;
1266e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_WRITE_BIT,						// VkAccessFlags			inputMask;
1267e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			oldLayout;
1268e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,				// VkImageLayout			newLayout;
1269e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1270e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1271e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		*m_image,											// VkImage					image;
1272e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeColorSubresourceRange(0, m_caseDef.numLayers)	// VkImageSubresourceRange	subresourceRange;
1273e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1274e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1275e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u,
1276e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 1u, &bufferInitBarrier, 1u, &imageInitBarrier);
1277e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1278e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Copy buffer to image
1279e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageSubresourceLayers	subresource	=
1280e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1281e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_ASPECT_COLOR_BIT,							// VkImageAspectFlags    aspectMask;
1282da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,													// deUint32              mipLevel;
1283da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,													// deUint32              baseArrayLayer;
1284da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		m_caseDef.numLayers,								// deUint32              layerCount;
1285e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1286e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1287e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkBufferImageCopy			region		=
1288e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1289e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0ull,												// VkDeviceSize                bufferOffset;
1290da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,													// deUint32                    bufferRowLength;
1291da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,													// deUint32                    bufferImageHeight;
1292e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		subresource,										// VkImageSubresourceLayers    imageSubresource;
1293e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeOffset3D(0, 0, 0),								// VkOffset3D                  imageOffset;
1294e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeExtent3D(m_caseDef.size),						// VkExtent3D                  imageExtent;
1295e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1296e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1297e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdCopyBufferToImage(*m_cmdBuffer, *m_uCopy.colorBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &region);
1298e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1299e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier	imagePostInitBarrier	=
1300e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1301e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1302e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*				pNext;
1303e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_WRITE_BIT,						// VkAccessFlags			outputMask;
1304e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_READ_BIT,						// VkAccessFlags			inputMask;
1305e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,				// VkImageLayout			oldLayout;
1306e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,				// VkImageLayout			newLayout;
1307e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1308e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1309e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		*m_image,											// VkImage					image;
1310e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeColorSubresourceRange(0, m_caseDef.numLayers)	// VkImageSubresourceRange	subresourceRange;
1311e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1312e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1313e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u,
1314e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 0u, DE_NULL, 1u, &imagePostInitBarrier);
1315e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1316e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageLayoutAfterUpload	= VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
1317e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageUploadAccessMask		= VK_ACCESS_TRANSFER_WRITE_BIT;
1318e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1319e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1320e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadDraw(Context& context)
1321e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1322e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create vertex buffer
1323e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1324e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const vector<Vec4>	vertices				= genVertexData(m_caseDef);
1325e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkDeviceSize	vertexBufferSize		= vertices.size() * sizeof(Vec4);
1326e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1327e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_uDraw.vertexBuffer						= makeBuffer(m_vk, m_device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1328e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_uDraw.vertexBufferAlloc					= bindBuffer(m_vk, m_device, m_allocator, *m_uDraw.vertexBuffer, MemoryRequirement::HostVisible);
1329e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		deMemcpy(m_uDraw.vertexBufferAlloc->getHostPtr(), &vertices[0], static_cast<std::size_t>(vertexBufferSize));
1330e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		flushMappedMemoryRange(m_vk, m_device, m_uDraw.vertexBufferAlloc->getMemory(), m_uDraw.vertexBufferAlloc->getOffset(), vertexBufferSize);
1331e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1332e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1333e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create attachments and pipelines for each image layer
1334e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uDraw.pipelineLayout							= makePipelineLayout(m_vk, m_device);
1335e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uDraw.renderPass								= makeRenderPass(m_vk, m_device, m_caseDef.viewFormat, m_caseDef.numLayers);
1336e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uDraw.vertexModule							= createShaderModule(m_vk, m_device, context.getBinaryCollection().get("uploadDrawVert"), 0u);
1337e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uDraw.fragmentModule							= createShaderModule(m_vk, m_device, context.getBinaryCollection().get("uploadDrawFrag"), 0u);
1338e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1339e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (deUint32 subpassNdx = 0; subpassNdx < m_caseDef.numLayers; ++subpassNdx)
1340e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1341e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = {
1342e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,	// VkStructureType		sType
1343e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,											// const void*			pNext
1344e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,				// VkImageUsageFlags	usage;
1345e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		};
1346e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		Move<VkImageView>	imageView	= makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat,
1347e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga														makeColorSubresourceRange(subpassNdx, 1), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL);
1348e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_uDraw.attachmentHandles.push_back(*imageView);
1349e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_uDraw.attachments.push_back(makeSharedPtr(imageView));
1350e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_uDraw.pipelines.push_back(makeSharedPtr(makeGraphicsPipeline(m_vk, m_device, *m_uDraw.pipelineLayout, *m_uDraw.renderPass, *m_uDraw.vertexModule, *m_uDraw.fragmentModule,
1351e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_caseDef.size.swizzle(0, 1), VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, subpassNdx)));
1352e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1353e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1354e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create framebuffer
1355e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_uDraw.framebuffer	= makeFramebuffer(m_vk, m_device, *m_uDraw.renderPass, static_cast<deUint32>(m_uDraw.attachmentHandles.size()), &m_uDraw.attachmentHandles[0], m_caseDef.size.swizzle(0, 1));
1356e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1357e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create command buffer
1358e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1359e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1360e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			vector<VkClearValue>	clearValues		(m_caseDef.numLayers, m_viewIsIntegerFormat ? REFERENCE_CLEAR_COLOR_INT[0] : REFERENCE_CLEAR_COLOR_FLOAT[0]);
1361e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1362e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			const VkRect2D			renderArea	=
1363e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			{
1364e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				makeOffset2D(0, 0),
1365e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				makeExtent2D(m_caseDef.size.x(), m_caseDef.size.y()),
1366e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			};
1367e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1368e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			const VkRenderPassBeginInfo	renderPassBeginInfo	=
1369e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			{
1370e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,	// VkStructureType         sType;
1371e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				DE_NULL,									// const void*             pNext;
1372e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				*m_uDraw.renderPass,							// VkRenderPass            renderPass;
1373e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				*m_uDraw.framebuffer,							// VkFramebuffer           framebuffer;
1374e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				renderArea,									// VkRect2D                renderArea;
1375da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa				static_cast<deUint32>(clearValues.size()),	// deUint32                clearValueCount;
1376e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				&clearValues[0],							// const VkClearValue*     pClearValues;
1377e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			};
1378e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1379e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
1380e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
1381e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1382e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		// Render
1383e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkDeviceSize	vertexDataPerDraw	= 4 * 2 * sizeof(Vec4);
1384e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VkDeviceSize		vertexBufferOffset	= 0ull;
1385e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		for (deUint32 subpassNdx = 0; subpassNdx < m_caseDef.numLayers; ++subpassNdx)
1386e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1387e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			if (subpassNdx != 0)
1388e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				m_vk.cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
1389e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1390e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **m_uDraw.pipelines[subpassNdx]);
1391e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1392e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &m_uDraw.vertexBuffer.get(), &vertexBufferOffset);
1393e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1394e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			vertexBufferOffset	+= vertexDataPerDraw;
1395e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
1396e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1397e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		m_vk.cmdEndRenderPass(*m_cmdBuffer);
1398e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1399e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1400e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageLayoutAfterUpload	= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
1401e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_imageUploadAccessMask		= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
1402e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1403e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1404e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::downloadCopy(Context& context, VkBuffer buffer)
1405e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1406e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	(void) context;
1407e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1408e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	copyImageToBuffer(*m_image, buffer, m_caseDef.size, m_imageUploadAccessMask, m_imageLayoutAfterUpload, m_caseDef.numLayers);
1409e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1410e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1411e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::downloadTexture(Context& context, VkBuffer buffer)
1412e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1413e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create output image with download result
1414e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageUsageFlags	usageFlags	= VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
141516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	m_dTex.outImage						= makeImage(m_vk, m_device, 0u, VK_IMAGE_TYPE_2D, m_caseDef.viewFormat, m_caseDef.viewFormat, false, m_caseDef.size, 1u, m_caseDef.numLayers, usageFlags);
1416e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.outImageAlloc				= bindImage(m_vk, m_device, m_allocator, *m_dTex.outImage, MemoryRequirement::Any);
1417e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.outImageView					= makeImageView(m_vk, m_device, *m_dTex.outImage, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, makeColorSubresourceRange(0, m_caseDef.numLayers));
1418e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1419e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = {
1420e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,	// VkStructureType		sType
1421e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*			pNext
1422e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_USAGE_SAMPLED_BIT,							// VkImageUsageFlags	usage;
1423e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1424e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.inImageView					= makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat,
1425e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga														makeColorSubresourceRange(0, m_caseDef.numLayers), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL);
1426e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.sampler						= makeSampler(m_vk, m_device);
1427e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1428e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Setup compute pipeline
1429e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.descriptorPool				= DescriptorPoolBuilder()
1430e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
1431e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
1432e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.build(m_vk, m_device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
1433e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1434e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.descriptorSetLayout			= DescriptorSetLayoutBuilder()
1435e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_COMPUTE_BIT, &m_dTex.sampler.get())
1436e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
1437e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.build(m_vk, m_device);
1438e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1439e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.pipelineLayout				= makePipelineLayout(m_vk, m_device, *m_dTex.descriptorSetLayout);
1440e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.descriptorSet				= makeDescriptorSet(m_vk, m_device, *m_dTex.descriptorPool, *m_dTex.descriptorSetLayout);
1441e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.inImageDescriptorInfo		= makeDescriptorImageInfo(DE_NULL, *m_dTex.inImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
1442e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.outImageDescriptorInfo		= makeDescriptorImageInfo(DE_NULL, *m_dTex.outImageView, VK_IMAGE_LAYOUT_GENERAL);
1443e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.computeModule				= createShaderModule(m_vk, m_device, context.getBinaryCollection().get("downloadTextureComp"), 0);
1444e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dTex.computePipeline				= makeComputePipeline(m_vk, m_device, *m_dTex.pipelineLayout, *m_dTex.computeModule, DE_NULL);
1445e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1446e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DescriptorSetUpdateBuilder()
1447e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.writeSingle(*m_dTex.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &m_dTex.inImageDescriptorInfo)
1448e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.writeSingle(*m_dTex.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_dTex.outImageDescriptorInfo)
1449e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.update(m_vk, m_device);
1450e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1451e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Transition images for shader access (texture / imageStore)
1452e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier imageBarriers[]	=
1453e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1454e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1455e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1456e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,											// const void*				pNext;
1457e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)m_imageUploadAccessMask,				// VkAccessFlags			srcAccessMask;
1458e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)VK_ACCESS_SHADER_READ_BIT,			// VkAccessFlags			dstAccessMask;
1459e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_imageLayoutAfterUpload,							// VkImageLayout			oldLayout;
1460e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,			// VkImageLayout			newLayout;
1461e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1462e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1463e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			*m_image,											// VkImage					image;
1464e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			makeColorSubresourceRange(0, m_caseDef.numLayers),	// VkImageSubresourceRange	subresourceRange;
1465e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		},
1466e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1467e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1468e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,											// const void*				pNext;
1469e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)0,									// VkAccessFlags			srcAccessMask;
1470e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)VK_ACCESS_SHADER_WRITE_BIT,			// VkAccessFlags			dstAccessMask;
1471e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			oldLayout;
1472e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_IMAGE_LAYOUT_GENERAL,							// VkImageLayout			newLayout;
1473e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1474e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1475e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			*m_dTex.outImage,									// VkImage					image;
1476e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			makeColorSubresourceRange(0, m_caseDef.numLayers),	// VkImageSubresourceRange	subresourceRange;
1477e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
1478e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1479e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1480e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u,
1481e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 0u, DE_NULL, 2u, imageBarriers);
1482e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1483e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Dispatch
1484e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dTex.computePipeline);
1485e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dTex.pipelineLayout, 0u, 1u, &m_dTex.descriptorSet.get(), 0u, DE_NULL);
1486e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdDispatch(*m_cmdBuffer, m_caseDef.size.x(), m_caseDef.size.y(), m_caseDef.numLayers);
1487e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1488e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Copy output image to color buffer
1489e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	copyImageToBuffer(*m_dTex.outImage, buffer, m_caseDef.size, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL, m_caseDef.numLayers);
1490e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1491e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1492e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::downloadLoad(Context& context, VkBuffer buffer)
1493e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1494e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create output image with download result
1495e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageUsageFlags usageFlags	= VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
149616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	m_dLoad.outImage					= makeImage(m_vk, m_device, 0u, VK_IMAGE_TYPE_2D, m_caseDef.viewFormat, m_caseDef.viewFormat, false, m_caseDef.size, 1u, m_caseDef.numLayers, usageFlags);
1497e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.outImageAlloc				= bindImage(m_vk, m_device, m_allocator, *m_dLoad.outImage, MemoryRequirement::Any);
1498e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.outImageView				= makeImageView(m_vk, m_device, *m_dLoad.outImage, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, makeColorSubresourceRange(0, m_caseDef.numLayers));
1499e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1500e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = {
1501e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,	// VkStructureType		sType
1502e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,											// const void*			pNext
1503e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_USAGE_STORAGE_BIT,							// VkImageUsageFlags	usage;
1504e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1505e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.inImageView					= makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat,
1506e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga														makeColorSubresourceRange(0, m_caseDef.numLayers), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL);
1507e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1508e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Setup compute pipeline
1509e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.descriptorPool				= DescriptorPoolBuilder()
1510e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u)
1511e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.build(m_vk, m_device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
1512e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1513e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.descriptorSetLayout			= DescriptorSetLayoutBuilder()
1514e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
1515e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
1516e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.build(m_vk, m_device);
1517e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1518e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.pipelineLayout				= makePipelineLayout(m_vk, m_device, *m_dLoad.descriptorSetLayout);
1519e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.descriptorSet				= makeDescriptorSet(m_vk, m_device, *m_dLoad.descriptorPool, *m_dLoad.descriptorSetLayout);
1520e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.inImageDescriptorInfo		= makeDescriptorImageInfo(DE_NULL, *m_dLoad.inImageView, VK_IMAGE_LAYOUT_GENERAL);
1521e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.outImageDescriptorInfo		= makeDescriptorImageInfo(DE_NULL, *m_dLoad.outImageView, VK_IMAGE_LAYOUT_GENERAL);
1522e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.computeModule				= createShaderModule(m_vk, m_device, context.getBinaryCollection().get("downloadLoadComp"), 0);
1523e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_dLoad.computePipeline				= makeComputePipeline(m_vk, m_device, *m_dLoad.pipelineLayout, *m_dLoad.computeModule, DE_NULL);
1524e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1525e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	DescriptorSetUpdateBuilder()
1526e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.writeSingle(*m_dLoad.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_dLoad.inImageDescriptorInfo)
1527e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.writeSingle(*m_dLoad.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_dLoad.outImageDescriptorInfo)
1528e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		.update(m_vk, m_device);
1529e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1530e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Transition storage images for shader access (imageLoad/Store)
1531e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkImageLayout requiredImageLayout = VK_IMAGE_LAYOUT_GENERAL;
1532e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier imageBarriers[]	=
1533e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1534e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1535e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1536e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,											// const void*				pNext;
1537e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)m_imageUploadAccessMask,				// VkAccessFlags			srcAccessMask;
1538e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)VK_ACCESS_SHADER_READ_BIT,			// VkAccessFlags			dstAccessMask;
1539e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			m_imageLayoutAfterUpload,							// VkImageLayout			oldLayout;
1540e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			requiredImageLayout,								// VkImageLayout			newLayout;
1541e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1542e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1543e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			*m_image,											// VkImage					image;
1544e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			makeColorSubresourceRange(0, m_caseDef.numLayers),	// VkImageSubresourceRange	subresourceRange;
1545e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		},
1546e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1547e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,				// VkStructureType			sType;
1548e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			DE_NULL,											// const void*				pNext;
1549e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)0,									// VkAccessFlags			srcAccessMask;
1550e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			(VkAccessFlags)VK_ACCESS_SHADER_WRITE_BIT,			// VkAccessFlags			dstAccessMask;
1551e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			oldLayout;
1552e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			requiredImageLayout,								// VkImageLayout			newLayout;
1553e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					srcQueueFamilyIndex;
1554e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			VK_QUEUE_FAMILY_IGNORED,							// deUint32					destQueueFamilyIndex;
1555e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			*m_dLoad.outImage,									// VkImage					image;
1556e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			makeColorSubresourceRange(0, m_caseDef.numLayers),	// VkImageSubresourceRange	subresourceRange;
1557e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
1558e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1559e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1560e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u,
1561e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 0u, DE_NULL, 2u, imageBarriers);
1562e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1563e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Dispatch
1564e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dLoad.computePipeline);
1565e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dLoad.pipelineLayout, 0u, 1u, &m_dLoad.descriptorSet.get(), 0u, DE_NULL);
1566e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdDispatch(*m_cmdBuffer, m_caseDef.size.x(), m_caseDef.size.y(), m_caseDef.numLayers);
1567e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1568e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Copy output image to color buffer
1569e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	copyImageToBuffer(*m_dLoad.outImage, buffer, m_caseDef.size, VK_ACCESS_SHADER_WRITE_BIT, requiredImageLayout, m_caseDef.numLayers);
1570e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1571e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1572e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::copyImageToBuffer(VkImage				sourceImage,
1573e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga											   VkBuffer				buffer,
1574e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga											   const IVec3			size,
1575e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga											   const VkAccessFlags	srcAccessMask,
1576e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga											   const VkImageLayout	oldLayout,
1577e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga											   const deUint32		numLayers)
1578e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1579e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Copy result to host visible buffer for inspection
1580e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageMemoryBarrier	imageBarrier	=
1581e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1582e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// VkStructureType			sType;
1583e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,									// const void*				pNext;
1584e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		srcAccessMask,								// VkAccessFlags			outputMask;
1585e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_READ_BIT,				// VkAccessFlags			inputMask;
1586e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		oldLayout,									// VkImageLayout			oldLayout;
1587e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,		// VkImageLayout			newLayout;
1588e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,					// deUint32					srcQueueFamilyIndex;
1589e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_QUEUE_FAMILY_IGNORED,					// deUint32					destQueueFamilyIndex;
1590e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		sourceImage,								// VkImage					image;
1591e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeColorSubresourceRange(0, numLayers)		// VkImageSubresourceRange	subresourceRange;
1592e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1593e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1594e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u,
1595e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 0u, DE_NULL, 1u, &imageBarrier);
1596e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1597e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkImageSubresourceLayers	subresource	=
1598e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1599e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_IMAGE_ASPECT_COLOR_BIT,					// VkImageAspectFlags    aspectMask;
1600da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,											// deUint32              mipLevel;
1601da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,											// deUint32              baseArrayLayer;
1602da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		numLayers,									// deUint32              layerCount;
1603e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1604e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1605e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkBufferImageCopy			region		=
1606e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1607e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0ull,										// VkDeviceSize                bufferOffset;
1608da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,											// deUint32                    bufferRowLength;
1609da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		0u,											// deUint32                    bufferImageHeight;
1610e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		subresource,								// VkImageSubresourceLayers    imageSubresource;
1611e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeOffset3D(0, 0, 0),						// VkOffset3D                  imageOffset;
1612e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		makeExtent3D(size),							// VkExtent3D                  imageExtent;
1613e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1614e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1615e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdCopyImageToBuffer(*m_cmdBuffer, sourceImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer, 1u, &region);
1616e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1617e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkBufferMemoryBarrier	bufferBarrier =
1618e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1619e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType    sType;
1620e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_NULL,									// const void*        pNext;
1621e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_TRANSFER_WRITE_BIT,				// VkAccessFlags      srcAccessMask;
1622e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_ACCESS_HOST_READ_BIT,					// VkAccessFlags      dstAccessMask;
1623da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		VK_QUEUE_FAMILY_IGNORED,					// deUint32           srcQueueFamilyIndex;
1624da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa		VK_QUEUE_FAMILY_IGNORED,					// deUint32           dstQueueFamilyIndex;
1625e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		buffer,										// VkBuffer           buffer;
1626e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0ull,										// VkDeviceSize       offset;
1627e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		VK_WHOLE_SIZE,								// VkDeviceSize       size;
1628e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	};
1629e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1630e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u,
1631e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
1632e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1633e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1634e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogabool isStorageImageExtendedFormat (const VkFormat format)
1635e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1636e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (format)
1637e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1638e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R32G32_SFLOAT:
1639e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R32G32_SINT:
1640e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R32G32_UINT:
1641e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16B16A16_UNORM:
1642e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16B16A16_SNORM:
1643e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16_SFLOAT:
1644e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16_UNORM:
1645e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16_SNORM:
1646e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16_SINT:
1647e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16G16_UINT:
1648e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16_SFLOAT:
1649e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16_UNORM:
1650e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16_SNORM:
1651e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16_SINT:
1652e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R16_UINT:
1653e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8G8_UNORM:
1654e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8G8_SNORM:
1655e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8G8_SINT:
1656e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8G8_UINT:
1657e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8_UNORM:
1658e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8_SNORM:
1659e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8_SINT:
1660e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		case VK_FORMAT_R8_UINT:
1661e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return true;
1662e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1663e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		default:
1664e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			return false;
1665e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1666e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1667e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1668e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatcu::TestStatus testMutable (Context& context, const CaseDef caseDef)
1669e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1670e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const DeviceInterface&			vk			= context.getDeviceInterface();
1671e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const InstanceInterface&		vki			= context.getInstanceInterface();
1672e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkDevice					device		= context.getDevice();
1673e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkPhysicalDevice			physDevice	= context.getPhysicalDevice();
1674e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	Allocator&						allocator	= context.getDefaultAllocator();
1675e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
167616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	// If this is a VK_KHR_image_format_list test, check that the extension is supported
167716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga	if (caseDef.isFormatListTest && !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_image_format_list"))
167816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga		TCU_THROW(NotSupportedError, "VK_KHR_image_format_list not supported");
167916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga
1680e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Check required features on the format for the required upload/download methods
1681e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkFormatProperties	imageFormatProps, viewFormatProps;
1682e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	vki.getPhysicalDeviceFormatProperties(physDevice, caseDef.imageFormat, &imageFormatProps);
1683e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	vki.getPhysicalDeviceFormatProperties(physDevice, caseDef.viewFormat, &viewFormatProps);
1684e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1685e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	VkFormatFeatureFlags	viewFormatFeatureFlags = 0u;
1686e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (caseDef.upload)
1687e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1688e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_DRAW:
1689e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		viewFormatFeatureFlags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
1690e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1691e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case UPLOAD_STORE:
1692e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
1693e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1694e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	default:
1695e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_ASSERT("Invalid upload method");
1696e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1697e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1698e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	switch (caseDef.download)
1699e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1700e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_TEXTURE:
1701e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		viewFormatFeatureFlags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
1702e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		// For the texture case we write the samples read to a separate output image with the same view format
1703e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		// so we need to check that we can also use the view format for storage
1704e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
1705e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1706e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	case DOWNLOAD_LOAD:
1707e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
1708e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1709e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	default:
1710e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		DE_ASSERT("Invalid download method");
1711e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		break;
1712e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1713e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1714e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if ((viewFormatFeatureFlags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) &&
1715e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		isStorageImageExtendedFormat(caseDef.viewFormat) &&
1716e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		!getPhysicalDeviceFeatures(vki, physDevice).shaderStorageImageExtendedFormats)
1717e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1718e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		TCU_THROW(NotSupportedError, "View format requires shaderStorageImageExtended");
1719e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1720e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1721e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if ((viewFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags)
1722e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		TCU_THROW(NotSupportedError, "View format doesn't support upload/download method");
1723e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1724e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// We don't use the base image for anything other than transfer
1725e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// operations so there are no features to check.  However, The Vulkan
1726e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// 1.0 spec does not allow us to create an image view with usage that
1727e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// is not supported by the main format.  With VK_KHR_maintenance2, we
1728e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// can do this via VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR.
1729e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	if ((imageFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags &&
1730e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	    !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance2"))
1731e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1732e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		TCU_THROW(NotSupportedError, "Image format doesn't support upload/download method");
1733e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1734e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1735e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Create a color buffer for host-inspection of results
1736e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// For the Copy download method, this is the target of the download, for other
1737e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// download methods, pixel data will be copied to this buffer from the download
1738e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// target
1739e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const VkDeviceSize			colorBufferSize		= caseDef.size.x() * caseDef.size.y() * caseDef.size.z() * caseDef.numLayers * tcu::getPixelSize(mapVkFormat(caseDef.imageFormat));
1740e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const Unique<VkBuffer>		colorBuffer			(makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1741e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	const UniquePtr<Allocation>	colorBufferAlloc	(bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
1742e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	deMemset(colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(colorBufferSize));
1743e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	flushMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
1744e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1745e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Execute the test
1746e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	UploadDownloadExecutor executor(context, caseDef);
1747e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	executor.run(context, *colorBuffer);
1748e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1749e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	// Verify results
1750e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1751e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
1752e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1753e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		// For verification purposes, we use the format of the upload to generate the expected image
1754e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const VkFormat						format			= caseDef.upload == UPLOAD_CLEAR || caseDef.upload == UPLOAD_COPY ? caseDef.imageFormat : caseDef.viewFormat;
1755e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const tcu::TextureFormat			tcuFormat		= mapVkFormat(format);
1756e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const bool							isIntegerFormat	= isUintFormat(format) || isIntFormat(format);
1757e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const tcu::ConstPixelBufferAccess	resultImage		(tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers, colorBufferAlloc->getHostPtr());
1758e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		tcu::TextureLevel					textureLevel	(tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers);
1759e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const tcu::PixelBufferAccess		expectedImage	= textureLevel.getAccess();
1760e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		generateExpectedImage(expectedImage, caseDef);
1761e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1762e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		bool ok;
1763e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		if (isIntegerFormat)
1764e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			ok = tcu::intThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::UVec4(1), tcu::COMPARE_LOG_RESULT);
1765e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		else
1766e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			ok = tcu::floatThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::Vec4(0.01f), tcu::COMPARE_LOG_RESULT);
1767e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		return ok ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Fail");
1768e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1769e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1770e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1771e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatcu::TestCaseGroup* createImageMutableTests (TestContext& testCtx)
1772e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{
1773e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	de::MovePtr<TestCaseGroup> testGroup	(new TestCaseGroup(testCtx, "mutable", "Cases with mutable images"));
1774e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	for (int textureNdx = 0; textureNdx < DE_LENGTH_OF_ARRAY(s_textures); ++textureNdx)
1775e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	{
1776e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		const Texture&					texture					= s_textures[textureNdx];
1777e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		de::MovePtr<tcu::TestCaseGroup> groupByImageViewType	(new tcu::TestCaseGroup(testCtx, getImageTypeName(texture.type()).c_str(), ""));
1778e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1779e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		for (int imageFormatNdx = 0; imageFormatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++imageFormatNdx)
1780e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		for (int viewFormatNdx = 0; viewFormatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++viewFormatNdx)
1781e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		{
1782e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			if (imageFormatNdx != viewFormatNdx && formatsAreCompatible(s_formats[imageFormatNdx], s_formats[viewFormatNdx]))
1783e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			{
1784e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				for (int upload = 0; upload < UPLOAD_LAST; upload++)
1785e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				for (int download = 0; download < DOWNLOAD_LAST; download++)
1786e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				{
178716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga					CaseDef caseDef =
1788e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga					{
1789e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						texture.type(),
1790e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						texture.layerSize(),
1791e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						static_cast<deUint32>(texture.numLayers()),
1792e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						s_formats[imageFormatNdx],
1793e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						s_formats[viewFormatNdx],
1794e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						static_cast<enum Upload>(upload),
179516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga						static_cast<enum Download>(download),
179616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga						false
1797e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga					};
1798e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
179916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga					std::string caseName = getFormatShortString(s_formats[imageFormatNdx]) + "_" + getFormatShortString(s_formats[viewFormatNdx]) +
1800e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga						"_" + getUploadString(upload) + "_" + getDownloadString(download);
1801e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga					addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testMutable, caseDef);
180216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga
180316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga					caseDef.isFormatListTest = true;
180416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga					caseName += "_format_list";
180516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga					addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testMutable, caseDef);
1806e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga				}
1807e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga			}
1808e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		}
1809e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1810e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga		testGroup->addChild(groupByImageViewType.release());
1811e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	}
1812e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1813e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga	return testGroup.release();
1814e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}
1815e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga
1816e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} // image
1817e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} // vkt
1818