vktPipelineVertexUtil.cpp revision 0bb5880e80be5e70bc68e56a9e21a197641ccd48
1342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch/*------------------------------------------------------------------------
2342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * Vulkan Conformance Tests
3342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * ------------------------
4342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *
5342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * Copyright (c) 2015 The Khronos Group Inc.
6342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * Copyright (c) 2015 Imagination Technologies Ltd.
7342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *
8342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * Permission is hereby granted, free of charge, to any person obtaining a
9342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * copy of this software and/or associated documentation files (the
10342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * "Materials"), to deal in the Materials without restriction, including
11342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * without limitation the rights to use, copy, modify, merge, publish,
12342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * distribute, sublicense, and/or sell copies of the Materials, and to
13342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * permit persons to whom the Materials are furnished to do so, subject to
14342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * the following conditions:
15342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *
16342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * The above copyright notice(s) and this permission notice shall be included
17342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * in all copies or substantial portions of the Materials.
18342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *
19342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * The Materials are Confidential Information as defined by the
20342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * Khronos Membership Agreement until designated non-confidential by Khronos,
21342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * at which point this condition clause shall be removed.
22342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *
23342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
26342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
27342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
30342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *
31342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *//*!
32342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * \file
33342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch * \brief Utilities for vertex buffers.
34342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch *//*--------------------------------------------------------------------*/
35342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
36342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#include "vktPipelineVertexUtil.hpp"
37342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#include "vkStrUtil.hpp"
38342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#include "tcuVectorUtil.hpp"
39342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#include "deStringUtil.hpp"
40342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
41342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochnamespace vkt
42342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch{
43342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochnamespace pipeline
44342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch{
45342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
46342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochusing namespace vk;
47342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
48342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochdeUint32 getVertexFormatSize (VkFormat format)
49342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch{
50342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch	switch (format)
51342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch	{
52342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_UNORM:
53342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_SNORM:
54342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_USCALED:
55342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_SSCALED:
56342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_UINT:
57342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_SINT:
58342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8_SRGB:
59342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R4G4_UNORM_PACK8:
60342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch			return 1;
61342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
62342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_UNORM:
63342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_SNORM:
64342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_USCALED:
65342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_SSCALED:
66342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_UINT:
67342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_SINT:
68342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8_SRGB:
69342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_UNORM:
70342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_SNORM:
71342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_USCALED:
72342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_SSCALED:
73342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_UINT:
74342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_SINT:
75342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16_SFLOAT:
76342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R5G6B5_UNORM_PACK16:
77342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
78342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch			return 2;
79342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
80342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_UNORM:
81342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_SNORM:
82342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_USCALED:
83342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_SSCALED:
84342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_UINT:
85342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_SINT:
86342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8_SRGB:
87342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_UNORM:
88342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_SNORM:
89342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_USCALED:
90342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_SSCALED:
91342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_UINT:
92342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_SINT:
93342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8_SRGB:
94342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch			return 3;
95342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
96342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_UNORM:
97342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_SNORM:
98342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_USCALED:
99342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_SSCALED:
100342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_UINT:
101342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_SINT:
102342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R8G8B8A8_SRGB:
103342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
104342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
105342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
106342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
107342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2R10G10B10_UINT_PACK32:
108342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2R10G10B10_SINT_PACK32:
109342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_UNORM:
110342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_SNORM:
111342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_USCALED:
112342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_SSCALED:
113342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_UINT:
114342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_SINT:
115342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16_SFLOAT:
116342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R32_UINT:
117342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R32_SINT:
118342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R32_SFLOAT:
119342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
120342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
121342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_UNORM:
122342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_SNORM:
123342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_USCALED:
124342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_SSCALED:
125342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_UINT:
126342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_SINT:
127342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_B8G8R8A8_SRGB:
128342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
129342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
130342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
131342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
132342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2B10G10R10_UINT_PACK32:
133342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_A2B10G10R10_SINT_PACK32:
134342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch			return 4;
135342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
136342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch		case VK_FORMAT_R16G16B16_UNORM:
137		case VK_FORMAT_R16G16B16_SNORM:
138		case VK_FORMAT_R16G16B16_USCALED:
139		case VK_FORMAT_R16G16B16_SSCALED:
140		case VK_FORMAT_R16G16B16_UINT:
141		case VK_FORMAT_R16G16B16_SINT:
142		case VK_FORMAT_R16G16B16_SFLOAT:
143			return 6;
144
145		case VK_FORMAT_R16G16B16A16_UNORM:
146		case VK_FORMAT_R16G16B16A16_SNORM:
147		case VK_FORMAT_R16G16B16A16_USCALED:
148		case VK_FORMAT_R16G16B16A16_SSCALED:
149		case VK_FORMAT_R16G16B16A16_UINT:
150		case VK_FORMAT_R16G16B16A16_SINT:
151		case VK_FORMAT_R16G16B16A16_SFLOAT:
152		case VK_FORMAT_R32G32_UINT:
153		case VK_FORMAT_R32G32_SINT:
154		case VK_FORMAT_R32G32_SFLOAT:
155		case VK_FORMAT_R64_SFLOAT:
156			return 8;
157
158		case VK_FORMAT_R32G32B32_UINT:
159		case VK_FORMAT_R32G32B32_SINT:
160		case VK_FORMAT_R32G32B32_SFLOAT:
161			return 12;
162
163		case VK_FORMAT_R32G32B32A32_UINT:
164		case VK_FORMAT_R32G32B32A32_SINT:
165		case VK_FORMAT_R32G32B32A32_SFLOAT:
166		case VK_FORMAT_R64G64_SFLOAT:
167			return 16;
168
169		case VK_FORMAT_R64G64B64_SFLOAT:
170			return 24;
171
172		case VK_FORMAT_R64G64B64A64_SFLOAT:
173			return 32;
174
175		default:
176			break;
177	}
178
179	DE_ASSERT(false);
180	return 0;
181}
182
183deUint32 getVertexFormatComponentCount (VkFormat format)
184{
185	switch (format)
186	{
187		case VK_FORMAT_R8_USCALED:
188		case VK_FORMAT_R8_UNORM:
189		case VK_FORMAT_R8_UINT:
190		case VK_FORMAT_R8_SSCALED:
191		case VK_FORMAT_R8_SRGB:
192		case VK_FORMAT_R8_SNORM:
193		case VK_FORMAT_R8_SINT:
194		case VK_FORMAT_R16_USCALED:
195		case VK_FORMAT_R16_UNORM:
196		case VK_FORMAT_R16_UINT:
197		case VK_FORMAT_R16_SSCALED:
198		case VK_FORMAT_R16_SNORM:
199		case VK_FORMAT_R16_SINT:
200		case VK_FORMAT_R16_SFLOAT:
201		case VK_FORMAT_R32_UINT:
202		case VK_FORMAT_R32_SINT:
203		case VK_FORMAT_R32_SFLOAT:
204		case VK_FORMAT_R64_SFLOAT:
205			return 1;
206
207		case VK_FORMAT_R4G4_UNORM_PACK8:
208		case VK_FORMAT_R8G8_UNORM:
209		case VK_FORMAT_R8G8_SNORM:
210		case VK_FORMAT_R8G8_USCALED:
211		case VK_FORMAT_R8G8_SSCALED:
212		case VK_FORMAT_R8G8_UINT:
213		case VK_FORMAT_R8G8_SINT:
214		case VK_FORMAT_R8G8_SRGB:
215		case VK_FORMAT_R16G16_UNORM:
216		case VK_FORMAT_R16G16_SNORM:
217		case VK_FORMAT_R16G16_USCALED:
218		case VK_FORMAT_R16G16_SSCALED:
219		case VK_FORMAT_R16G16_UINT:
220		case VK_FORMAT_R16G16_SINT:
221		case VK_FORMAT_R16G16_SFLOAT:
222		case VK_FORMAT_R32G32_UINT:
223		case VK_FORMAT_R32G32_SINT:
224		case VK_FORMAT_R32G32_SFLOAT:
225		case VK_FORMAT_R64G64_SFLOAT:
226			return 2;
227
228		case VK_FORMAT_R8G8B8_UNORM:
229		case VK_FORMAT_R8G8B8_SNORM:
230		case VK_FORMAT_R8G8B8_USCALED:
231		case VK_FORMAT_R8G8B8_SSCALED:
232		case VK_FORMAT_R8G8B8_UINT:
233		case VK_FORMAT_R8G8B8_SINT:
234		case VK_FORMAT_R8G8B8_SRGB:
235		case VK_FORMAT_B8G8R8_UNORM:
236		case VK_FORMAT_B8G8R8_SNORM:
237		case VK_FORMAT_B8G8R8_USCALED:
238		case VK_FORMAT_B8G8R8_SSCALED:
239		case VK_FORMAT_B8G8R8_UINT:
240		case VK_FORMAT_B8G8R8_SINT:
241		case VK_FORMAT_B8G8R8_SRGB:
242		case VK_FORMAT_R16G16B16_UNORM:
243		case VK_FORMAT_R16G16B16_SNORM:
244		case VK_FORMAT_R16G16B16_USCALED:
245		case VK_FORMAT_R16G16B16_SSCALED:
246		case VK_FORMAT_R16G16B16_UINT:
247		case VK_FORMAT_R16G16B16_SINT:
248		case VK_FORMAT_R16G16B16_SFLOAT:
249		case VK_FORMAT_R32G32B32_UINT:
250		case VK_FORMAT_R32G32B32_SINT:
251		case VK_FORMAT_R32G32B32_SFLOAT:
252		case VK_FORMAT_R64G64B64_SFLOAT:
253		case VK_FORMAT_R5G6B5_UNORM_PACK16:
254		case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
255		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
256			return 3;
257
258		case VK_FORMAT_R8G8B8A8_UNORM:
259		case VK_FORMAT_R8G8B8A8_SNORM:
260		case VK_FORMAT_R8G8B8A8_USCALED:
261		case VK_FORMAT_R8G8B8A8_SSCALED:
262		case VK_FORMAT_R8G8B8A8_UINT:
263		case VK_FORMAT_R8G8B8A8_SINT:
264		case VK_FORMAT_R8G8B8A8_SRGB:
265		case VK_FORMAT_B8G8R8A8_UNORM:
266		case VK_FORMAT_B8G8R8A8_SNORM:
267		case VK_FORMAT_B8G8R8A8_USCALED:
268		case VK_FORMAT_B8G8R8A8_SSCALED:
269		case VK_FORMAT_B8G8R8A8_UINT:
270		case VK_FORMAT_B8G8R8A8_SINT:
271		case VK_FORMAT_B8G8R8A8_SRGB:
272		case VK_FORMAT_R16G16B16A16_UNORM:
273		case VK_FORMAT_R16G16B16A16_SNORM:
274		case VK_FORMAT_R16G16B16A16_USCALED:
275		case VK_FORMAT_R16G16B16A16_SSCALED:
276		case VK_FORMAT_R16G16B16A16_UINT:
277		case VK_FORMAT_R16G16B16A16_SINT:
278		case VK_FORMAT_R16G16B16A16_SFLOAT:
279		case VK_FORMAT_R32G32B32A32_UINT:
280		case VK_FORMAT_R32G32B32A32_SINT:
281		case VK_FORMAT_R32G32B32A32_SFLOAT:
282		case VK_FORMAT_R64G64B64A64_SFLOAT:
283		case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
284		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
285		case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
286		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
287		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
288		case VK_FORMAT_A2R10G10B10_UINT_PACK32:
289		case VK_FORMAT_A2R10G10B10_SINT_PACK32:
290		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
291		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
292		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
293		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
294		case VK_FORMAT_A2B10G10R10_UINT_PACK32:
295		case VK_FORMAT_A2B10G10R10_SINT_PACK32:
296			return 4;
297
298		default:
299			break;
300	}
301
302	DE_ASSERT(false);
303	return 0;
304}
305
306deUint32 getVertexFormatComponentSize (VkFormat format)
307{
308	switch (format)
309	{
310		case VK_FORMAT_R8_UNORM:
311		case VK_FORMAT_R8_SNORM:
312		case VK_FORMAT_R8_USCALED:
313		case VK_FORMAT_R8_SSCALED:
314		case VK_FORMAT_R8_UINT:
315		case VK_FORMAT_R8_SINT:
316		case VK_FORMAT_R8_SRGB:
317		case VK_FORMAT_R8G8_UNORM:
318		case VK_FORMAT_R8G8_SNORM:
319		case VK_FORMAT_R8G8_USCALED:
320		case VK_FORMAT_R8G8_SSCALED:
321		case VK_FORMAT_R8G8_UINT:
322		case VK_FORMAT_R8G8_SINT:
323		case VK_FORMAT_R8G8_SRGB:
324		case VK_FORMAT_R8G8B8_UNORM:
325		case VK_FORMAT_R8G8B8_SNORM:
326		case VK_FORMAT_R8G8B8_USCALED:
327		case VK_FORMAT_R8G8B8_SSCALED:
328		case VK_FORMAT_R8G8B8_UINT:
329		case VK_FORMAT_R8G8B8_SINT:
330		case VK_FORMAT_R8G8B8_SRGB:
331		case VK_FORMAT_B8G8R8_UNORM:
332		case VK_FORMAT_B8G8R8_SNORM:
333		case VK_FORMAT_B8G8R8_USCALED:
334		case VK_FORMAT_B8G8R8_SSCALED:
335		case VK_FORMAT_B8G8R8_UINT:
336		case VK_FORMAT_B8G8R8_SINT:
337		case VK_FORMAT_B8G8R8_SRGB:
338		case VK_FORMAT_R8G8B8A8_UNORM:
339		case VK_FORMAT_R8G8B8A8_SNORM:
340		case VK_FORMAT_R8G8B8A8_USCALED:
341		case VK_FORMAT_R8G8B8A8_SSCALED:
342		case VK_FORMAT_R8G8B8A8_UINT:
343		case VK_FORMAT_R8G8B8A8_SINT:
344		case VK_FORMAT_R8G8B8A8_SRGB:
345		case VK_FORMAT_B8G8R8A8_UNORM:
346		case VK_FORMAT_B8G8R8A8_SNORM:
347		case VK_FORMAT_B8G8R8A8_USCALED:
348		case VK_FORMAT_B8G8R8A8_SSCALED:
349		case VK_FORMAT_B8G8R8A8_UINT:
350		case VK_FORMAT_B8G8R8A8_SINT:
351		case VK_FORMAT_B8G8R8A8_SRGB:
352			return 1;
353
354		case VK_FORMAT_R16_UNORM:
355		case VK_FORMAT_R16_SNORM:
356		case VK_FORMAT_R16_USCALED:
357		case VK_FORMAT_R16_SSCALED:
358		case VK_FORMAT_R16_UINT:
359		case VK_FORMAT_R16_SINT:
360		case VK_FORMAT_R16_SFLOAT:
361		case VK_FORMAT_R16G16_UNORM:
362		case VK_FORMAT_R16G16_SNORM:
363		case VK_FORMAT_R16G16_USCALED:
364		case VK_FORMAT_R16G16_SSCALED:
365		case VK_FORMAT_R16G16_UINT:
366		case VK_FORMAT_R16G16_SINT:
367		case VK_FORMAT_R16G16_SFLOAT:
368		case VK_FORMAT_R16G16B16_UNORM:
369		case VK_FORMAT_R16G16B16_SNORM:
370		case VK_FORMAT_R16G16B16_USCALED:
371		case VK_FORMAT_R16G16B16_SSCALED:
372		case VK_FORMAT_R16G16B16_UINT:
373		case VK_FORMAT_R16G16B16_SINT:
374		case VK_FORMAT_R16G16B16_SFLOAT:
375		case VK_FORMAT_R16G16B16A16_UNORM:
376		case VK_FORMAT_R16G16B16A16_SNORM:
377		case VK_FORMAT_R16G16B16A16_USCALED:
378		case VK_FORMAT_R16G16B16A16_SSCALED:
379		case VK_FORMAT_R16G16B16A16_UINT:
380		case VK_FORMAT_R16G16B16A16_SINT:
381		case VK_FORMAT_R16G16B16A16_SFLOAT:
382			return 2;
383
384		case VK_FORMAT_R32_UINT:
385		case VK_FORMAT_R32_SINT:
386		case VK_FORMAT_R32_SFLOAT:
387		case VK_FORMAT_R32G32_UINT:
388		case VK_FORMAT_R32G32_SINT:
389		case VK_FORMAT_R32G32_SFLOAT:
390		case VK_FORMAT_R32G32B32_UINT:
391		case VK_FORMAT_R32G32B32_SINT:
392		case VK_FORMAT_R32G32B32_SFLOAT:
393		case VK_FORMAT_R32G32B32A32_UINT:
394		case VK_FORMAT_R32G32B32A32_SINT:
395		case VK_FORMAT_R32G32B32A32_SFLOAT:
396			return 4;
397
398		case VK_FORMAT_R64_SFLOAT:
399		case VK_FORMAT_R64G64_SFLOAT:
400		case VK_FORMAT_R64G64B64_SFLOAT:
401		case VK_FORMAT_R64G64B64A64_SFLOAT:
402			return 8;
403
404		default:
405			break;
406	}
407
408	DE_ASSERT(false);
409	return 0;
410}
411
412bool isVertexFormatComponentOrderBGR (VkFormat format)
413{
414	switch (format)
415	{
416		case VK_FORMAT_B8G8R8_UNORM:
417		case VK_FORMAT_B8G8R8_SNORM:
418		case VK_FORMAT_B8G8R8_USCALED:
419		case VK_FORMAT_B8G8R8_SSCALED:
420		case VK_FORMAT_B8G8R8_UINT:
421		case VK_FORMAT_B8G8R8_SINT:
422		case VK_FORMAT_B8G8R8_SRGB:
423		case VK_FORMAT_B8G8R8A8_UNORM:
424		case VK_FORMAT_B8G8R8A8_SNORM:
425		case VK_FORMAT_B8G8R8A8_USCALED:
426		case VK_FORMAT_B8G8R8A8_SSCALED:
427		case VK_FORMAT_B8G8R8A8_UINT:
428		case VK_FORMAT_B8G8R8A8_SINT:
429		case VK_FORMAT_B8G8R8A8_SRGB:
430		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
431		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
432		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
433		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
434		case VK_FORMAT_A2B10G10R10_UINT_PACK32:
435		case VK_FORMAT_A2B10G10R10_SINT_PACK32:
436			return true;
437
438		default:
439			break;
440	}
441	return false;
442}
443
444bool isVertexFormatSint (VkFormat format)
445{
446	switch (format)
447	{
448		case VK_FORMAT_R8_SINT:
449		case VK_FORMAT_R8G8_SINT:
450		case VK_FORMAT_R16_SINT:
451		case VK_FORMAT_R8G8B8_SINT:
452		case VK_FORMAT_B8G8R8_SINT:
453		case VK_FORMAT_R8G8B8A8_SINT:
454		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
455		case VK_FORMAT_R16G16_SINT:
456		case VK_FORMAT_R32_SINT:
457		case VK_FORMAT_B8G8R8A8_SINT:
458		case VK_FORMAT_A2B10G10R10_SINT_PACK32:
459		case VK_FORMAT_R16G16B16_SINT:
460		case VK_FORMAT_R16G16B16A16_SINT:
461		case VK_FORMAT_R32G32_SINT:
462		case VK_FORMAT_R32G32B32_SINT:
463		case VK_FORMAT_R32G32B32A32_SINT:
464			return true;
465
466		default:
467			break;
468	}
469
470	return false;
471}
472
473bool isVertexFormatUint (VkFormat format)
474{
475	switch (format)
476	{
477		case VK_FORMAT_R8_UINT:
478		case VK_FORMAT_R8G8_UINT:
479		case VK_FORMAT_R16_UINT:
480		case VK_FORMAT_R8G8B8_UINT:
481		case VK_FORMAT_B8G8R8_UINT:
482		case VK_FORMAT_R8G8B8A8_UINT:
483		case VK_FORMAT_A2R10G10B10_UINT_PACK32:
484		case VK_FORMAT_R16G16_UINT:
485		case VK_FORMAT_R32_UINT:
486		case VK_FORMAT_B8G8R8A8_UINT:
487		case VK_FORMAT_A2B10G10R10_UINT_PACK32:
488		case VK_FORMAT_R16G16B16_UINT:
489		case VK_FORMAT_R16G16B16A16_UINT:
490		case VK_FORMAT_R32G32_UINT:
491		case VK_FORMAT_R32G32B32_UINT:
492		case VK_FORMAT_R32G32B32A32_UINT:
493			return true;
494
495		default:
496			break;
497	}
498
499	return false;
500
501}
502
503bool isVertexFormatSfloat (VkFormat format)
504{
505	switch (format)
506	{
507		case VK_FORMAT_R16_SFLOAT:
508		case VK_FORMAT_R16G16_SFLOAT:
509		case VK_FORMAT_R32_SFLOAT:
510		case VK_FORMAT_R16G16B16_SFLOAT:
511		case VK_FORMAT_R16G16B16A16_SFLOAT:
512		case VK_FORMAT_R32G32_SFLOAT:
513		case VK_FORMAT_R64_SFLOAT:
514		case VK_FORMAT_R32G32B32_SFLOAT:
515		case VK_FORMAT_R32G32B32A32_SFLOAT:
516		case VK_FORMAT_R64G64_SFLOAT:
517		case VK_FORMAT_R64G64B64_SFLOAT:
518		case VK_FORMAT_R64G64B64A64_SFLOAT:
519			return true;
520
521		default:
522			break;
523	}
524
525	return false;
526
527}
528
529bool isVertexFormatUfloat (VkFormat format)
530{
531	switch (format)
532	{
533		case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
534		case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
535			return true;
536
537		default:
538			break;
539	}
540
541	return false;
542
543}
544
545bool isVertexFormatUnorm (VkFormat format)
546{
547	switch (format)
548	{
549		case VK_FORMAT_R8_UNORM:
550		case VK_FORMAT_R4G4_UNORM_PACK8:
551		case VK_FORMAT_R8G8_UNORM:
552		case VK_FORMAT_R16_UNORM:
553		case VK_FORMAT_R5G6B5_UNORM_PACK16:
554		case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
555		case VK_FORMAT_R8G8B8_UNORM:
556		case VK_FORMAT_B8G8R8_UNORM:
557		case VK_FORMAT_R8G8B8A8_UNORM:
558		case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
559		case VK_FORMAT_R16G16_UNORM:
560		case VK_FORMAT_B8G8R8A8_UNORM:
561		case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
562		case VK_FORMAT_R16G16B16_UNORM:
563		case VK_FORMAT_R16G16B16A16_UNORM:
564			return true;
565
566		default:
567			break;
568	}
569
570	return false;
571
572}
573
574bool isVertexFormatSnorm (VkFormat format)
575{
576	switch (format)
577	{
578		case VK_FORMAT_R8_SNORM:
579		case VK_FORMAT_R8G8_SNORM:
580		case VK_FORMAT_R16_SNORM:
581		case VK_FORMAT_R8G8B8_SNORM:
582		case VK_FORMAT_B8G8R8_SNORM:
583		case VK_FORMAT_R8G8B8A8_SNORM:
584		case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
585		case VK_FORMAT_R16G16_SNORM:
586		case VK_FORMAT_B8G8R8A8_SNORM:
587		case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
588		case VK_FORMAT_R16G16B16_SNORM:
589		case VK_FORMAT_R16G16B16A16_SNORM:
590			return true;
591
592		default:
593			break;
594	}
595
596	return false;
597
598}
599
600bool isVertexFormatSRGB (VkFormat format)
601{
602	switch (format)
603	{
604		case VK_FORMAT_R8_SRGB:
605		case VK_FORMAT_R8G8_SRGB:
606		case VK_FORMAT_R8G8B8_SRGB:
607		case VK_FORMAT_B8G8R8_SRGB:
608		case VK_FORMAT_R8G8B8A8_SRGB:
609		case VK_FORMAT_B8G8R8A8_SRGB:
610			return true;
611
612		default:
613			break;
614	}
615
616	return false;
617
618}
619
620bool isVertexFormatSscaled (VkFormat format)
621{
622	switch (format)
623	{
624		case VK_FORMAT_R8_SSCALED:
625		case VK_FORMAT_R8G8_SSCALED:
626		case VK_FORMAT_R16_SSCALED:
627		case VK_FORMAT_R8G8B8_SSCALED:
628		case VK_FORMAT_B8G8R8_SSCALED:
629		case VK_FORMAT_R8G8B8A8_SSCALED:
630		case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
631		case VK_FORMAT_R16G16_SSCALED:
632		case VK_FORMAT_B8G8R8A8_SSCALED:
633		case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
634		case VK_FORMAT_R16G16B16_SSCALED:
635		case VK_FORMAT_R16G16B16A16_SSCALED:
636			return true;
637
638		default:
639			break;
640	}
641
642	return false;
643
644}
645
646bool isVertexFormatUscaled (VkFormat format)
647{
648	switch (format)
649	{
650		case VK_FORMAT_R8_USCALED:
651		case VK_FORMAT_R8G8_USCALED:
652		case VK_FORMAT_R16_USCALED:
653		case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
654		case VK_FORMAT_R8G8B8_USCALED:
655		case VK_FORMAT_B8G8R8_USCALED:
656		case VK_FORMAT_R8G8B8A8_USCALED:
657		case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
658		case VK_FORMAT_R16G16_USCALED:
659		case VK_FORMAT_B8G8R8A8_USCALED:
660		case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
661		case VK_FORMAT_R16G16B16_USCALED:
662		case VK_FORMAT_R16G16B16A16_USCALED:
663			return true;
664
665		default:
666			break;
667	}
668
669	return false;
670
671}
672
673std::vector<Vertex4RGBA> createOverlappingQuads (void)
674{
675	using tcu::Vec2;
676	using tcu::Vec4;
677
678	std::vector<Vertex4RGBA> vertices;
679
680	const Vec2 translations[4] =
681	{
682		Vec2(-0.25f, -0.25f),
683		Vec2(-1.0f, -0.25f),
684		Vec2(-1.0f, -1.0f),
685		Vec2(-0.25f, -1.0f)
686	};
687
688	const Vec4 quadColors[4] =
689	{
690		Vec4(1.0f, 0.0f, 0.0f, 1.0),
691		Vec4(0.0f, 1.0f, 0.0f, 1.0),
692		Vec4(0.0f, 0.0f, 1.0f, 1.0),
693		Vec4(1.0f, 0.0f, 1.0f, 1.0)
694	};
695
696	const float quadSize = 1.25f;
697
698	for (int quadNdx = 0; quadNdx < 4; quadNdx++)
699	{
700		const Vec2&	translation	= translations[quadNdx];
701		const Vec4&	color		= quadColors[quadNdx];
702
703		const Vertex4RGBA lowerLeftVertex =
704		{
705			Vec4(translation.x(), translation.y(), 0.0f, 1.0f),
706			color
707		};
708		const Vertex4RGBA upperLeftVertex =
709		{
710			Vec4(translation.x(), translation.y() + quadSize, 0.0f, 1.0f),
711			color
712		};
713		const Vertex4RGBA lowerRightVertex =
714		{
715			Vec4(translation.x() + quadSize, translation.y(), 0.0f, 1.0f),
716			color
717		};
718		const Vertex4RGBA upperRightVertex =
719		{
720			Vec4(translation.x() + quadSize, translation.y() + quadSize, 0.0f, 1.0f),
721			color
722		};
723
724		// Triangle 1, CCW
725		vertices.push_back(lowerLeftVertex);
726		vertices.push_back(lowerRightVertex);
727		vertices.push_back(upperLeftVertex);
728
729		// Triangle 2, CW
730		vertices.push_back(lowerRightVertex);
731		vertices.push_back(upperLeftVertex);
732		vertices.push_back(upperRightVertex);
733	}
734
735	return vertices;
736}
737
738std::vector<Vertex4Tex4> createFullscreenQuad (void)
739{
740	using tcu::Vec4;
741
742	const Vertex4Tex4 lowerLeftVertex =
743	{
744		Vec4(-1.0f, -1.0f, 0.0f, 1.0f),
745		Vec4(0.0f, 0.0f, 0.0f, 0.0f)
746	};
747	const Vertex4Tex4 upperLeftVertex =
748	{
749		Vec4(-1.0f, 1.0f, 0.0f, 1.0f),
750		Vec4(0.0f, 1.0f, 0.0f, 0.0f)
751	};
752	const Vertex4Tex4 lowerRightVertex =
753	{
754		Vec4(1.0f, -1.0f, 0.0f, 1.0f),
755		Vec4(1.0f, 0.0f, 0.0f, 0.0f)
756	};
757	const Vertex4Tex4 upperRightVertex =
758	{
759		Vec4(1.0f, 1.0f, 0.0f, 1.0f),
760		Vec4(1.0f, 1.0f, 0.0f, 0.0f)
761	};
762
763	const Vertex4Tex4 vertices[6] =
764	{
765		lowerLeftVertex,
766		lowerRightVertex,
767		upperLeftVertex,
768
769		upperLeftVertex,
770		lowerRightVertex,
771		upperRightVertex
772	};
773
774	return std::vector<Vertex4Tex4>(vertices, vertices + DE_LENGTH_OF_ARRAY(vertices));
775}
776
777std::vector<Vertex4Tex4> createQuadMosaic (int rows, int columns)
778{
779	using tcu::Vec4;
780
781	DE_ASSERT(rows >= 1);
782	DE_ASSERT(columns >= 1);
783
784	std::vector<Vertex4Tex4>	vertices;
785	const float					rowSize		= 2.0f / (float)rows;
786	const float					columnSize	= 2.0f / (float)columns;
787	int							arrayIndex	= 0;
788
789	for (int rowNdx = 0; rowNdx < rows; rowNdx++)
790	{
791		for (int columnNdx = 0; columnNdx < columns; columnNdx++)
792		{
793			const Vertex4Tex4 lowerLeftVertex =
794			{
795				Vec4(-1.0f + (float)columnNdx * columnSize, -1.0f + (float)rowNdx * rowSize, 0.0f, 1.0f),
796				Vec4(0.0f, 0.0f, (float)arrayIndex, 0.0f)
797			};
798			const Vertex4Tex4 upperLeftVertex =
799			{
800				Vec4(lowerLeftVertex.position.x(), lowerLeftVertex.position.y() + rowSize, 0.0f, 1.0f),
801				Vec4(0.0f, 1.0f, (float)arrayIndex, 0.0f)
802			};
803			const Vertex4Tex4 lowerRightVertex =
804			{
805				Vec4(lowerLeftVertex.position.x() + columnSize, lowerLeftVertex.position.y(), 0.0f, 1.0f),
806				Vec4(1.0f, 0.0f, (float)arrayIndex, 0.0f)
807			};
808			const Vertex4Tex4 upperRightVertex =
809			{
810				Vec4(lowerLeftVertex.position.x() + columnSize, lowerLeftVertex.position.y() + rowSize, 0.0f, 1.0f),
811				Vec4(1.0f, 1.0f, (float)arrayIndex, 0.0f)
812			};
813
814			vertices.push_back(lowerLeftVertex);
815			vertices.push_back(lowerRightVertex);
816			vertices.push_back(upperLeftVertex);
817			vertices.push_back(upperLeftVertex);
818			vertices.push_back(lowerRightVertex);
819			vertices.push_back(upperRightVertex);
820
821			arrayIndex++;
822		}
823	}
824
825	return vertices;
826}
827
828std::vector<Vertex4Tex4> createQuadMosaicCube (void)
829{
830	using tcu::Vec3;
831
832	static const Vec3 texCoordsCube[8] =
833	{
834		Vec3(-1.0f, -1.0f, -1.0f),	// 0: -X, -Y, -Z
835		Vec3(1.0f, -1.0f, -1.0f),	// 1:  X, -Y, -Z
836		Vec3(1.0f, -1.0f, 1.0f),	// 2:  X, -Y,  Z
837		Vec3(-1.0f, -1.0f, 1.0f),	// 3: -X, -Y,  Z
838
839		Vec3(-1.0f, 1.0f, -1.0f),	// 4: -X,  Y, -Z
840		Vec3(1.0f, 1.0f, -1.0f),	// 5:  X,  Y, -Z
841		Vec3(1.0f, 1.0f, 1.0f),		// 6:  X,  Y,  Z
842		Vec3(-1.0f, 1.0f, 1.0f),	// 7: -X,  Y,  Z
843	};
844
845	static const int texCoordCubeIndices[6][6] =
846	{
847		{ 6, 5, 2, 2, 5, 1 },		// +X face
848		{ 3, 0, 7, 7, 0, 4 },		// -X face
849		{ 4, 5, 7, 7, 5, 6 },		// +Y face
850		{ 3, 2, 0, 0, 2, 1 },		// -Y face
851		{ 2, 3, 6, 6, 3, 7 },		// +Z face
852		{ 0, 1, 4, 4, 1, 5 }		// -Z face
853	};
854
855	// Create 6 quads and set appropriate texture coordinates for cube mapping
856
857	std::vector<Vertex4Tex4>			vertices	= createQuadMosaic(2, 3);
858	std::vector<Vertex4Tex4>::iterator	vertexItr	= vertices.begin();
859
860	for (int quadNdx = 0; quadNdx < 6; quadNdx++)
861	{
862		for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
863		{
864			vertexItr->texCoord.xyz() = texCoordsCube[texCoordCubeIndices[quadNdx][vertexNdx]];
865			vertexItr++;
866		}
867	}
868
869	return vertices;
870}
871
872std::vector<Vertex4Tex4> createQuadMosaicCubeArray (int faceArrayIndices[6])
873{
874	std::vector<Vertex4Tex4>			vertices	= createQuadMosaicCube();
875	std::vector<Vertex4Tex4>::iterator	vertexItr	= vertices.begin();
876
877	for (int quadNdx = 0; quadNdx < 6; quadNdx++)
878	{
879		for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
880		{
881			vertexItr->texCoord.w() = (float)faceArrayIndices[quadNdx];
882			vertexItr++;
883		}
884	}
885
886	return vertices;
887}
888
889std::vector<Vertex4Tex4> createTestQuadMosaic (vk::VkImageViewType viewType)
890{
891	std::vector<Vertex4Tex4> vertices;
892
893	switch (viewType)
894	{
895		case vk::VK_IMAGE_VIEW_TYPE_1D:
896		case vk::VK_IMAGE_VIEW_TYPE_2D:
897			vertices = createFullscreenQuad();
898			break;
899
900		case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY:
901			vertices = createQuadMosaic(2, 3);
902
903			// Set up array indices
904			for (size_t quadNdx = 0; quadNdx < 6; quadNdx++)
905				for (size_t vertexNdx = 0; vertexNdx < 6; vertexNdx++)
906					vertices[quadNdx * 6 + vertexNdx].texCoord.y() = (float)quadNdx;
907
908			break;
909
910		case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY:
911			vertices = createQuadMosaic(2, 3);
912			break;
913
914		case vk::VK_IMAGE_VIEW_TYPE_3D:
915			vertices = createQuadMosaic(2, 3);
916
917			// Use z between 0.0 and 1.0.
918			for (size_t vertexNdx = 0; vertexNdx < vertices.size(); vertexNdx++)
919				vertices[vertexNdx].texCoord.z() /= 5.0f;
920
921			break;
922
923		case vk::VK_IMAGE_VIEW_TYPE_CUBE:
924			vertices = createQuadMosaicCube();
925			break;
926
927		case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
928			{
929				int faceArrayIndices[6] = { 0, 1, 2, 3, 4, 5 };
930				vertices = createQuadMosaicCubeArray(faceArrayIndices);
931			}
932			break;
933
934		default:
935			DE_ASSERT(false);
936			break;
937	}
938
939	return vertices;
940}
941
942} // pipeline
943} // vkt
944