xref: /aosp_15_r20/external/deqp/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2015 The Khronos Group Inc.
6  * Copyright (c) 2015 Imagination Technologies Ltd.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *//*!
21  * \file
22  * \brief Utilities for vertex buffers.
23  *//*--------------------------------------------------------------------*/
24 
25 #include "vktPipelineVertexUtil.hpp"
26 #include "vkStrUtil.hpp"
27 #include "tcuVectorUtil.hpp"
28 #include "deStringUtil.hpp"
29 
30 namespace vkt
31 {
32 namespace pipeline
33 {
34 
35 using namespace vk;
36 
getVertexFormatSize(VkFormat format)37 uint32_t getVertexFormatSize(VkFormat format)
38 {
39     switch (format)
40     {
41     case VK_FORMAT_R8_UNORM:
42     case VK_FORMAT_R8_SNORM:
43     case VK_FORMAT_R8_USCALED:
44     case VK_FORMAT_R8_SSCALED:
45     case VK_FORMAT_R8_UINT:
46     case VK_FORMAT_R8_SINT:
47     case VK_FORMAT_R8_SRGB:
48     case VK_FORMAT_R4G4_UNORM_PACK8:
49         return 1;
50 
51     case VK_FORMAT_R8G8_UNORM:
52     case VK_FORMAT_R8G8_SNORM:
53     case VK_FORMAT_R8G8_USCALED:
54     case VK_FORMAT_R8G8_SSCALED:
55     case VK_FORMAT_R8G8_UINT:
56     case VK_FORMAT_R8G8_SINT:
57     case VK_FORMAT_R8G8_SRGB:
58     case VK_FORMAT_R16_UNORM:
59     case VK_FORMAT_R16_SNORM:
60     case VK_FORMAT_R16_USCALED:
61     case VK_FORMAT_R16_SSCALED:
62     case VK_FORMAT_R16_UINT:
63     case VK_FORMAT_R16_SINT:
64     case VK_FORMAT_R16_SFLOAT:
65     case VK_FORMAT_R5G6B5_UNORM_PACK16:
66     case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
67         return 2;
68 
69     case VK_FORMAT_R8G8B8_UNORM:
70     case VK_FORMAT_R8G8B8_SNORM:
71     case VK_FORMAT_R8G8B8_USCALED:
72     case VK_FORMAT_R8G8B8_SSCALED:
73     case VK_FORMAT_R8G8B8_UINT:
74     case VK_FORMAT_R8G8B8_SINT:
75     case VK_FORMAT_R8G8B8_SRGB:
76     case VK_FORMAT_B8G8R8_UNORM:
77     case VK_FORMAT_B8G8R8_SNORM:
78     case VK_FORMAT_B8G8R8_USCALED:
79     case VK_FORMAT_B8G8R8_SSCALED:
80     case VK_FORMAT_B8G8R8_UINT:
81     case VK_FORMAT_B8G8R8_SINT:
82     case VK_FORMAT_B8G8R8_SRGB:
83         return 3;
84 
85     case VK_FORMAT_R8G8B8A8_UNORM:
86     case VK_FORMAT_R8G8B8A8_SNORM:
87     case VK_FORMAT_R8G8B8A8_USCALED:
88     case VK_FORMAT_R8G8B8A8_SSCALED:
89     case VK_FORMAT_R8G8B8A8_UINT:
90     case VK_FORMAT_R8G8B8A8_SINT:
91     case VK_FORMAT_R8G8B8A8_SRGB:
92     case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
93     case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
94     case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
95     case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
96     case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
97     case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
98     case VK_FORMAT_A2R10G10B10_UINT_PACK32:
99     case VK_FORMAT_A2R10G10B10_SINT_PACK32:
100     case VK_FORMAT_R16G16_UNORM:
101     case VK_FORMAT_R16G16_SNORM:
102     case VK_FORMAT_R16G16_USCALED:
103     case VK_FORMAT_R16G16_SSCALED:
104     case VK_FORMAT_R16G16_UINT:
105     case VK_FORMAT_R16G16_SINT:
106     case VK_FORMAT_R16G16_SFLOAT:
107     case VK_FORMAT_R32_UINT:
108     case VK_FORMAT_R32_SINT:
109     case VK_FORMAT_R32_SFLOAT:
110     case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
111     case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
112     case VK_FORMAT_B8G8R8A8_UNORM:
113     case VK_FORMAT_B8G8R8A8_SNORM:
114     case VK_FORMAT_B8G8R8A8_USCALED:
115     case VK_FORMAT_B8G8R8A8_SSCALED:
116     case VK_FORMAT_B8G8R8A8_UINT:
117     case VK_FORMAT_B8G8R8A8_SINT:
118     case VK_FORMAT_B8G8R8A8_SRGB:
119     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
120     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
121     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
122     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
123     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
124     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
125         return 4;
126 
127     case VK_FORMAT_R16G16B16_UNORM:
128     case VK_FORMAT_R16G16B16_SNORM:
129     case VK_FORMAT_R16G16B16_USCALED:
130     case VK_FORMAT_R16G16B16_SSCALED:
131     case VK_FORMAT_R16G16B16_UINT:
132     case VK_FORMAT_R16G16B16_SINT:
133     case VK_FORMAT_R16G16B16_SFLOAT:
134         return 6;
135 
136     case VK_FORMAT_R16G16B16A16_UNORM:
137     case VK_FORMAT_R16G16B16A16_SNORM:
138     case VK_FORMAT_R16G16B16A16_USCALED:
139     case VK_FORMAT_R16G16B16A16_SSCALED:
140     case VK_FORMAT_R16G16B16A16_UINT:
141     case VK_FORMAT_R16G16B16A16_SINT:
142     case VK_FORMAT_R16G16B16A16_SFLOAT:
143     case VK_FORMAT_R32G32_UINT:
144     case VK_FORMAT_R32G32_SINT:
145     case VK_FORMAT_R32G32_SFLOAT:
146     case VK_FORMAT_R64_SFLOAT:
147         return 8;
148 
149     case VK_FORMAT_R32G32B32_UINT:
150     case VK_FORMAT_R32G32B32_SINT:
151     case VK_FORMAT_R32G32B32_SFLOAT:
152         return 12;
153 
154     case VK_FORMAT_R32G32B32A32_UINT:
155     case VK_FORMAT_R32G32B32A32_SINT:
156     case VK_FORMAT_R32G32B32A32_SFLOAT:
157     case VK_FORMAT_R64G64_SFLOAT:
158         return 16;
159 
160     case VK_FORMAT_R64G64B64_SFLOAT:
161         return 24;
162 
163     case VK_FORMAT_R64G64B64A64_SFLOAT:
164         return 32;
165 
166     default:
167         break;
168     }
169 
170     DE_ASSERT(false);
171     return 0;
172 }
173 
getVertexFormatComponentCount(VkFormat format)174 uint32_t getVertexFormatComponentCount(VkFormat format)
175 {
176     switch (format)
177     {
178     case VK_FORMAT_R8_USCALED:
179     case VK_FORMAT_R8_UNORM:
180     case VK_FORMAT_R8_UINT:
181     case VK_FORMAT_R8_SSCALED:
182     case VK_FORMAT_R8_SRGB:
183     case VK_FORMAT_R8_SNORM:
184     case VK_FORMAT_R8_SINT:
185     case VK_FORMAT_R16_USCALED:
186     case VK_FORMAT_R16_UNORM:
187     case VK_FORMAT_R16_UINT:
188     case VK_FORMAT_R16_SSCALED:
189     case VK_FORMAT_R16_SNORM:
190     case VK_FORMAT_R16_SINT:
191     case VK_FORMAT_R16_SFLOAT:
192     case VK_FORMAT_R32_UINT:
193     case VK_FORMAT_R32_SINT:
194     case VK_FORMAT_R32_SFLOAT:
195     case VK_FORMAT_R64_SFLOAT:
196         return 1;
197 
198     case VK_FORMAT_R4G4_UNORM_PACK8:
199     case VK_FORMAT_R8G8_UNORM:
200     case VK_FORMAT_R8G8_SNORM:
201     case VK_FORMAT_R8G8_USCALED:
202     case VK_FORMAT_R8G8_SSCALED:
203     case VK_FORMAT_R8G8_UINT:
204     case VK_FORMAT_R8G8_SINT:
205     case VK_FORMAT_R8G8_SRGB:
206     case VK_FORMAT_R16G16_UNORM:
207     case VK_FORMAT_R16G16_SNORM:
208     case VK_FORMAT_R16G16_USCALED:
209     case VK_FORMAT_R16G16_SSCALED:
210     case VK_FORMAT_R16G16_UINT:
211     case VK_FORMAT_R16G16_SINT:
212     case VK_FORMAT_R16G16_SFLOAT:
213     case VK_FORMAT_R32G32_UINT:
214     case VK_FORMAT_R32G32_SINT:
215     case VK_FORMAT_R32G32_SFLOAT:
216     case VK_FORMAT_R64G64_SFLOAT:
217         return 2;
218 
219     case VK_FORMAT_R8G8B8_UNORM:
220     case VK_FORMAT_R8G8B8_SNORM:
221     case VK_FORMAT_R8G8B8_USCALED:
222     case VK_FORMAT_R8G8B8_SSCALED:
223     case VK_FORMAT_R8G8B8_UINT:
224     case VK_FORMAT_R8G8B8_SINT:
225     case VK_FORMAT_R8G8B8_SRGB:
226     case VK_FORMAT_B8G8R8_UNORM:
227     case VK_FORMAT_B8G8R8_SNORM:
228     case VK_FORMAT_B8G8R8_USCALED:
229     case VK_FORMAT_B8G8R8_SSCALED:
230     case VK_FORMAT_B8G8R8_UINT:
231     case VK_FORMAT_B8G8R8_SINT:
232     case VK_FORMAT_B8G8R8_SRGB:
233     case VK_FORMAT_R16G16B16_UNORM:
234     case VK_FORMAT_R16G16B16_SNORM:
235     case VK_FORMAT_R16G16B16_USCALED:
236     case VK_FORMAT_R16G16B16_SSCALED:
237     case VK_FORMAT_R16G16B16_UINT:
238     case VK_FORMAT_R16G16B16_SINT:
239     case VK_FORMAT_R16G16B16_SFLOAT:
240     case VK_FORMAT_R32G32B32_UINT:
241     case VK_FORMAT_R32G32B32_SINT:
242     case VK_FORMAT_R32G32B32_SFLOAT:
243     case VK_FORMAT_R64G64B64_SFLOAT:
244     case VK_FORMAT_R5G6B5_UNORM_PACK16:
245     case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
246     case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
247         return 3;
248 
249     case VK_FORMAT_R8G8B8A8_UNORM:
250     case VK_FORMAT_R8G8B8A8_SNORM:
251     case VK_FORMAT_R8G8B8A8_USCALED:
252     case VK_FORMAT_R8G8B8A8_SSCALED:
253     case VK_FORMAT_R8G8B8A8_UINT:
254     case VK_FORMAT_R8G8B8A8_SINT:
255     case VK_FORMAT_R8G8B8A8_SRGB:
256     case VK_FORMAT_B8G8R8A8_UNORM:
257     case VK_FORMAT_B8G8R8A8_SNORM:
258     case VK_FORMAT_B8G8R8A8_USCALED:
259     case VK_FORMAT_B8G8R8A8_SSCALED:
260     case VK_FORMAT_B8G8R8A8_UINT:
261     case VK_FORMAT_B8G8R8A8_SINT:
262     case VK_FORMAT_B8G8R8A8_SRGB:
263     case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
264     case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
265     case VK_FORMAT_R16G16B16A16_UNORM:
266     case VK_FORMAT_R16G16B16A16_SNORM:
267     case VK_FORMAT_R16G16B16A16_USCALED:
268     case VK_FORMAT_R16G16B16A16_SSCALED:
269     case VK_FORMAT_R16G16B16A16_UINT:
270     case VK_FORMAT_R16G16B16A16_SINT:
271     case VK_FORMAT_R16G16B16A16_SFLOAT:
272     case VK_FORMAT_R32G32B32A32_UINT:
273     case VK_FORMAT_R32G32B32A32_SINT:
274     case VK_FORMAT_R32G32B32A32_SFLOAT:
275     case VK_FORMAT_R64G64B64A64_SFLOAT:
276     case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
277     case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
278     case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
279     case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
280     case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
281     case VK_FORMAT_A2R10G10B10_UINT_PACK32:
282     case VK_FORMAT_A2R10G10B10_SINT_PACK32:
283     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
284     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
285     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
286     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
287     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
288     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
289         return 4;
290 
291     default:
292         break;
293     }
294 
295     DE_ASSERT(false);
296     return 0;
297 }
298 
getVertexFormatComponentSize(VkFormat format)299 uint32_t getVertexFormatComponentSize(VkFormat format)
300 {
301     switch (format)
302     {
303     case VK_FORMAT_R8_UNORM:
304     case VK_FORMAT_R8_SNORM:
305     case VK_FORMAT_R8_USCALED:
306     case VK_FORMAT_R8_SSCALED:
307     case VK_FORMAT_R8_UINT:
308     case VK_FORMAT_R8_SINT:
309     case VK_FORMAT_R8_SRGB:
310     case VK_FORMAT_R8G8_UNORM:
311     case VK_FORMAT_R8G8_SNORM:
312     case VK_FORMAT_R8G8_USCALED:
313     case VK_FORMAT_R8G8_SSCALED:
314     case VK_FORMAT_R8G8_UINT:
315     case VK_FORMAT_R8G8_SINT:
316     case VK_FORMAT_R8G8_SRGB:
317     case VK_FORMAT_R8G8B8_UNORM:
318     case VK_FORMAT_R8G8B8_SNORM:
319     case VK_FORMAT_R8G8B8_USCALED:
320     case VK_FORMAT_R8G8B8_SSCALED:
321     case VK_FORMAT_R8G8B8_UINT:
322     case VK_FORMAT_R8G8B8_SINT:
323     case VK_FORMAT_R8G8B8_SRGB:
324     case VK_FORMAT_B8G8R8_UNORM:
325     case VK_FORMAT_B8G8R8_SNORM:
326     case VK_FORMAT_B8G8R8_USCALED:
327     case VK_FORMAT_B8G8R8_SSCALED:
328     case VK_FORMAT_B8G8R8_UINT:
329     case VK_FORMAT_B8G8R8_SINT:
330     case VK_FORMAT_B8G8R8_SRGB:
331     case VK_FORMAT_R8G8B8A8_UNORM:
332     case VK_FORMAT_R8G8B8A8_SNORM:
333     case VK_FORMAT_R8G8B8A8_USCALED:
334     case VK_FORMAT_R8G8B8A8_SSCALED:
335     case VK_FORMAT_R8G8B8A8_UINT:
336     case VK_FORMAT_R8G8B8A8_SINT:
337     case VK_FORMAT_R8G8B8A8_SRGB:
338     case VK_FORMAT_B8G8R8A8_UNORM:
339     case VK_FORMAT_B8G8R8A8_SNORM:
340     case VK_FORMAT_B8G8R8A8_USCALED:
341     case VK_FORMAT_B8G8R8A8_SSCALED:
342     case VK_FORMAT_B8G8R8A8_UINT:
343     case VK_FORMAT_B8G8R8A8_SINT:
344     case VK_FORMAT_B8G8R8A8_SRGB:
345         return 1;
346 
347     case VK_FORMAT_R16_UNORM:
348     case VK_FORMAT_R16_SNORM:
349     case VK_FORMAT_R16_USCALED:
350     case VK_FORMAT_R16_SSCALED:
351     case VK_FORMAT_R16_UINT:
352     case VK_FORMAT_R16_SINT:
353     case VK_FORMAT_R16_SFLOAT:
354     case VK_FORMAT_R16G16_UNORM:
355     case VK_FORMAT_R16G16_SNORM:
356     case VK_FORMAT_R16G16_USCALED:
357     case VK_FORMAT_R16G16_SSCALED:
358     case VK_FORMAT_R16G16_UINT:
359     case VK_FORMAT_R16G16_SINT:
360     case VK_FORMAT_R16G16_SFLOAT:
361     case VK_FORMAT_R16G16B16_UNORM:
362     case VK_FORMAT_R16G16B16_SNORM:
363     case VK_FORMAT_R16G16B16_USCALED:
364     case VK_FORMAT_R16G16B16_SSCALED:
365     case VK_FORMAT_R16G16B16_UINT:
366     case VK_FORMAT_R16G16B16_SINT:
367     case VK_FORMAT_R16G16B16_SFLOAT:
368     case VK_FORMAT_R16G16B16A16_UNORM:
369     case VK_FORMAT_R16G16B16A16_SNORM:
370     case VK_FORMAT_R16G16B16A16_USCALED:
371     case VK_FORMAT_R16G16B16A16_SSCALED:
372     case VK_FORMAT_R16G16B16A16_UINT:
373     case VK_FORMAT_R16G16B16A16_SINT:
374     case VK_FORMAT_R16G16B16A16_SFLOAT:
375         return 2;
376 
377     case VK_FORMAT_R32_UINT:
378     case VK_FORMAT_R32_SINT:
379     case VK_FORMAT_R32_SFLOAT:
380     case VK_FORMAT_R32G32_UINT:
381     case VK_FORMAT_R32G32_SINT:
382     case VK_FORMAT_R32G32_SFLOAT:
383     case VK_FORMAT_R32G32B32_UINT:
384     case VK_FORMAT_R32G32B32_SINT:
385     case VK_FORMAT_R32G32B32_SFLOAT:
386     case VK_FORMAT_R32G32B32A32_UINT:
387     case VK_FORMAT_R32G32B32A32_SINT:
388     case VK_FORMAT_R32G32B32A32_SFLOAT:
389         return 4;
390 
391     case VK_FORMAT_R64_SFLOAT:
392     case VK_FORMAT_R64G64_SFLOAT:
393     case VK_FORMAT_R64G64B64_SFLOAT:
394     case VK_FORMAT_R64G64B64A64_SFLOAT:
395         return 8;
396 
397     default:
398         break;
399     }
400 
401     DE_ASSERT(false);
402     return 0;
403 }
404 
getPackedVertexFormatComponentWidth(VkFormat format,uint32_t componentNdx)405 uint32_t getPackedVertexFormatComponentWidth(VkFormat format, uint32_t componentNdx)
406 {
407     switch (format)
408     {
409     case VK_FORMAT_R4G4_UNORM_PACK8:
410     {
411         DE_ASSERT(componentNdx < 2);
412         return 4;
413     }
414     case VK_FORMAT_R5G6B5_UNORM_PACK16:
415     case VK_FORMAT_B5G6R5_UNORM_PACK16:
416     {
417         uint32_t componentSizes[3] = {5, 6, 5};
418 
419         DE_ASSERT(componentNdx < 3);
420         return componentSizes[componentNdx];
421     }
422     case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
423     case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
424     case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
425     case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
426     {
427         DE_ASSERT(componentNdx < 4);
428         return 4;
429     }
430     case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
431     case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
432     {
433         uint32_t componentSizes[4] = {5, 5, 5, 1};
434 
435         DE_ASSERT(componentNdx < 4);
436         return componentSizes[componentNdx];
437     }
438     case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
439     {
440         uint32_t componentSizes[4] = {1, 5, 5, 5};
441 
442         DE_ASSERT(componentNdx < 4);
443         return componentSizes[componentNdx];
444     }
445     case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
446     case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
447     case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
448     case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
449     case VK_FORMAT_A8B8G8R8_UINT_PACK32:
450     case VK_FORMAT_A8B8G8R8_SINT_PACK32:
451     case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
452     {
453         DE_ASSERT(componentNdx < 4);
454         return 8;
455     }
456     case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
457     {
458         uint32_t componentSizes[3] = {10, 11, 11};
459 
460         DE_ASSERT(componentNdx < 3);
461         return componentSizes[componentNdx];
462     }
463     case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
464     case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
465     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
466     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
467     case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
468     case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
469     case VK_FORMAT_A2R10G10B10_UINT_PACK32:
470     case VK_FORMAT_A2R10G10B10_SINT_PACK32:
471     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
472     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
473     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
474     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
475     {
476         uint32_t componentSizes[4] = {2, 10, 10, 10};
477 
478         DE_ASSERT(componentNdx < 4);
479         return componentSizes[componentNdx];
480     }
481     case VK_FORMAT_X8_D24_UNORM_PACK32:
482     {
483         uint32_t componentSizes[2] = {8, 24};
484 
485         DE_ASSERT(componentNdx < 2);
486         return componentSizes[componentNdx];
487     }
488     case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
489     {
490         uint32_t componentSizes[4] = {5, 9, 9, 9};
491 
492         DE_ASSERT(componentNdx < 4);
493         return componentSizes[componentNdx];
494     }
495     default:
496         break;
497     }
498     DE_ASSERT(false);
499     return 0;
500 }
501 
isVertexFormatComponentOrderBGR(VkFormat format)502 bool isVertexFormatComponentOrderBGR(VkFormat format)
503 {
504     switch (format)
505     {
506     case VK_FORMAT_B8G8R8_UNORM:
507     case VK_FORMAT_B8G8R8_SNORM:
508     case VK_FORMAT_B8G8R8_USCALED:
509     case VK_FORMAT_B8G8R8_SSCALED:
510     case VK_FORMAT_B8G8R8_UINT:
511     case VK_FORMAT_B8G8R8_SINT:
512     case VK_FORMAT_B8G8R8_SRGB:
513     case VK_FORMAT_B8G8R8A8_UNORM:
514     case VK_FORMAT_B8G8R8A8_SNORM:
515     case VK_FORMAT_B8G8R8A8_USCALED:
516     case VK_FORMAT_B8G8R8A8_SSCALED:
517     case VK_FORMAT_B8G8R8A8_UINT:
518     case VK_FORMAT_B8G8R8A8_SINT:
519     case VK_FORMAT_B8G8R8A8_SRGB:
520     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
521     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
522     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
523     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
524     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
525     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
526     case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
527         return true;
528 
529     default:
530         break;
531     }
532     return false;
533 }
534 
isVertexFormatComponentOrderABGR(VkFormat format)535 bool isVertexFormatComponentOrderABGR(VkFormat format)
536 {
537     switch (format)
538     {
539     case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
540     case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
541     case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
542     case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
543     case VK_FORMAT_A8B8G8R8_UINT_PACK32:
544     case VK_FORMAT_A8B8G8R8_SINT_PACK32:
545     case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
546     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
547     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
548     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
549     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
550     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
551     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
552     case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
553         return true;
554 
555     default:
556         break;
557     }
558     return false;
559 }
560 
isVertexFormatComponentOrderARGB(VkFormat format)561 bool isVertexFormatComponentOrderARGB(VkFormat format)
562 {
563     switch (format)
564     {
565     case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
566     case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
567     case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
568     case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
569     case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
570     case VK_FORMAT_A2R10G10B10_UINT_PACK32:
571     case VK_FORMAT_A2R10G10B10_SINT_PACK32:
572     case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
573         return true;
574 
575     default:
576         break;
577     }
578     return false;
579 }
580 
isVertexFormatSint(VkFormat format)581 bool isVertexFormatSint(VkFormat format)
582 {
583     switch (format)
584     {
585     case VK_FORMAT_R8_SINT:
586     case VK_FORMAT_R8G8_SINT:
587     case VK_FORMAT_R16_SINT:
588     case VK_FORMAT_R8G8B8_SINT:
589     case VK_FORMAT_B8G8R8_SINT:
590     case VK_FORMAT_R8G8B8A8_SINT:
591     case VK_FORMAT_A8B8G8R8_SINT_PACK32:
592     case VK_FORMAT_R16G16_SINT:
593     case VK_FORMAT_R32_SINT:
594     case VK_FORMAT_B8G8R8A8_SINT:
595     case VK_FORMAT_A2R10G10B10_SINT_PACK32:
596     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
597     case VK_FORMAT_R16G16B16_SINT:
598     case VK_FORMAT_R16G16B16A16_SINT:
599     case VK_FORMAT_R32G32_SINT:
600     case VK_FORMAT_R32G32B32_SINT:
601     case VK_FORMAT_R32G32B32A32_SINT:
602         return true;
603 
604     default:
605         break;
606     }
607 
608     return false;
609 }
610 
isVertexFormatUint(VkFormat format)611 bool isVertexFormatUint(VkFormat format)
612 {
613     switch (format)
614     {
615     case VK_FORMAT_R8_UINT:
616     case VK_FORMAT_R8G8_UINT:
617     case VK_FORMAT_R16_UINT:
618     case VK_FORMAT_R8G8B8_UINT:
619     case VK_FORMAT_B8G8R8_UINT:
620     case VK_FORMAT_R8G8B8A8_UINT:
621     case VK_FORMAT_A8B8G8R8_UINT_PACK32:
622     case VK_FORMAT_A2R10G10B10_UINT_PACK32:
623     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
624     case VK_FORMAT_R16G16_UINT:
625     case VK_FORMAT_R32_UINT:
626     case VK_FORMAT_B8G8R8A8_UINT:
627     case VK_FORMAT_R16G16B16_UINT:
628     case VK_FORMAT_R16G16B16A16_UINT:
629     case VK_FORMAT_R32G32_UINT:
630     case VK_FORMAT_R32G32B32_UINT:
631     case VK_FORMAT_R32G32B32A32_UINT:
632         return true;
633 
634     default:
635         break;
636     }
637 
638     return false;
639 }
640 
isVertexFormatSfloat(VkFormat format)641 bool isVertexFormatSfloat(VkFormat format)
642 {
643     switch (format)
644     {
645     case VK_FORMAT_R16_SFLOAT:
646     case VK_FORMAT_R16G16_SFLOAT:
647     case VK_FORMAT_R32_SFLOAT:
648     case VK_FORMAT_R16G16B16_SFLOAT:
649     case VK_FORMAT_R16G16B16A16_SFLOAT:
650     case VK_FORMAT_R32G32_SFLOAT:
651     case VK_FORMAT_R64_SFLOAT:
652     case VK_FORMAT_R32G32B32_SFLOAT:
653     case VK_FORMAT_R32G32B32A32_SFLOAT:
654     case VK_FORMAT_R64G64_SFLOAT:
655     case VK_FORMAT_R64G64B64_SFLOAT:
656     case VK_FORMAT_R64G64B64A64_SFLOAT:
657         return true;
658 
659     default:
660         break;
661     }
662 
663     return false;
664 }
665 
isVertexFormatUfloat(VkFormat format)666 bool isVertexFormatUfloat(VkFormat format)
667 {
668     switch (format)
669     {
670     case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
671     case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
672         return true;
673 
674     default:
675         break;
676     }
677 
678     return false;
679 }
680 
isVertexFormatUnorm(VkFormat format)681 bool isVertexFormatUnorm(VkFormat format)
682 {
683     switch (format)
684     {
685     case VK_FORMAT_R8_UNORM:
686     case VK_FORMAT_R4G4_UNORM_PACK8:
687     case VK_FORMAT_R8G8_UNORM:
688     case VK_FORMAT_R16_UNORM:
689     case VK_FORMAT_R5G6B5_UNORM_PACK16:
690     case VK_FORMAT_B5G6R5_UNORM_PACK16:
691     case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
692     case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
693     case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
694     case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
695     case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
696     case VK_FORMAT_R8G8B8_UNORM:
697     case VK_FORMAT_B8G8R8_UNORM:
698     case VK_FORMAT_R8G8B8A8_UNORM:
699     case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
700     case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
701     case VK_FORMAT_R16G16_UNORM:
702     case VK_FORMAT_B8G8R8A8_UNORM:
703     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
704     case VK_FORMAT_X8_D24_UNORM_PACK32:
705     case VK_FORMAT_R16G16B16_UNORM:
706     case VK_FORMAT_R16G16B16A16_UNORM:
707     case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
708     case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
709         return true;
710 
711     default:
712         break;
713     }
714 
715     return false;
716 }
717 
isVertexFormatSnorm(VkFormat format)718 bool isVertexFormatSnorm(VkFormat format)
719 {
720     switch (format)
721     {
722     case VK_FORMAT_R8_SNORM:
723     case VK_FORMAT_R8G8_SNORM:
724     case VK_FORMAT_R16_SNORM:
725     case VK_FORMAT_R8G8B8_SNORM:
726     case VK_FORMAT_B8G8R8_SNORM:
727     case VK_FORMAT_R8G8B8A8_SNORM:
728     case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
729     case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
730     case VK_FORMAT_R16G16_SNORM:
731     case VK_FORMAT_B8G8R8A8_SNORM:
732     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
733     case VK_FORMAT_R16G16B16_SNORM:
734     case VK_FORMAT_R16G16B16A16_SNORM:
735         return true;
736 
737     default:
738         break;
739     }
740 
741     return false;
742 }
743 
isVertexFormatSRGB(VkFormat format)744 bool isVertexFormatSRGB(VkFormat format)
745 {
746     switch (format)
747     {
748     case VK_FORMAT_R8_SRGB:
749     case VK_FORMAT_R8G8_SRGB:
750     case VK_FORMAT_R8G8B8_SRGB:
751     case VK_FORMAT_B8G8R8_SRGB:
752     case VK_FORMAT_R8G8B8A8_SRGB:
753     case VK_FORMAT_B8G8R8A8_SRGB:
754     case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
755         return true;
756 
757     default:
758         break;
759     }
760 
761     return false;
762 }
763 
isVertexFormatSscaled(VkFormat format)764 bool isVertexFormatSscaled(VkFormat format)
765 {
766     switch (format)
767     {
768     case VK_FORMAT_R8_SSCALED:
769     case VK_FORMAT_R8G8_SSCALED:
770     case VK_FORMAT_R16_SSCALED:
771     case VK_FORMAT_R8G8B8_SSCALED:
772     case VK_FORMAT_B8G8R8_SSCALED:
773     case VK_FORMAT_R8G8B8A8_SSCALED:
774     case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
775     case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
776     case VK_FORMAT_R16G16_SSCALED:
777     case VK_FORMAT_B8G8R8A8_SSCALED:
778     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
779     case VK_FORMAT_R16G16B16_SSCALED:
780     case VK_FORMAT_R16G16B16A16_SSCALED:
781         return true;
782 
783     default:
784         break;
785     }
786 
787     return false;
788 }
789 
isVertexFormatUscaled(VkFormat format)790 bool isVertexFormatUscaled(VkFormat format)
791 {
792     switch (format)
793     {
794     case VK_FORMAT_R8_USCALED:
795     case VK_FORMAT_R8G8_USCALED:
796     case VK_FORMAT_R16_USCALED:
797     case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
798     case VK_FORMAT_R8G8B8_USCALED:
799     case VK_FORMAT_B8G8R8_USCALED:
800     case VK_FORMAT_R8G8B8A8_USCALED:
801     case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
802     case VK_FORMAT_R16G16_USCALED:
803     case VK_FORMAT_B8G8R8A8_USCALED:
804     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
805     case VK_FORMAT_R16G16B16_USCALED:
806     case VK_FORMAT_R16G16B16A16_USCALED:
807         return true;
808 
809     default:
810         break;
811     }
812 
813     return false;
814 }
815 
isVertexFormatDouble(VkFormat format)816 bool isVertexFormatDouble(VkFormat format)
817 {
818     switch (format)
819     {
820     case VK_FORMAT_R64_UINT:
821     case VK_FORMAT_R64_SINT:
822     case VK_FORMAT_R64_SFLOAT:
823     case VK_FORMAT_R64G64_UINT:
824     case VK_FORMAT_R64G64_SINT:
825     case VK_FORMAT_R64G64_SFLOAT:
826     case VK_FORMAT_R64G64B64_UINT:
827     case VK_FORMAT_R64G64B64_SINT:
828     case VK_FORMAT_R64G64B64_SFLOAT:
829     case VK_FORMAT_R64G64B64A64_UINT:
830     case VK_FORMAT_R64G64B64A64_SINT:
831     case VK_FORMAT_R64G64B64A64_SFLOAT:
832         return true;
833 
834     default:
835         break;
836     }
837     return false;
838 }
839 
isVertexFormatPacked(VkFormat format)840 bool isVertexFormatPacked(VkFormat format)
841 {
842     switch (format)
843     {
844     case VK_FORMAT_R4G4_UNORM_PACK8:
845     case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
846     case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
847     case VK_FORMAT_R5G6B5_UNORM_PACK16:
848     case VK_FORMAT_B5G6R5_UNORM_PACK16:
849     case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
850     case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
851     case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
852     case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
853     case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
854     case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
855     case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
856     case VK_FORMAT_A8B8G8R8_UINT_PACK32:
857     case VK_FORMAT_A8B8G8R8_SINT_PACK32:
858     case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
859     case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
860     case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
861     case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
862     case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
863     case VK_FORMAT_A2R10G10B10_UINT_PACK32:
864     case VK_FORMAT_A2R10G10B10_SINT_PACK32:
865     case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
866     case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
867     case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
868     case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
869     case VK_FORMAT_A2B10G10R10_UINT_PACK32:
870     case VK_FORMAT_A2B10G10R10_SINT_PACK32:
871     case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
872     case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
873     case VK_FORMAT_X8_D24_UNORM_PACK32:
874     case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
875     case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
876         return true;
877 
878     default:
879         break;
880     }
881     return false;
882 }
883 
createOverlappingQuads(void)884 std::vector<Vertex4RGBA> createOverlappingQuads(void)
885 {
886     using tcu::Vec2;
887     using tcu::Vec4;
888 
889     std::vector<Vertex4RGBA> vertices;
890 
891     const Vec2 translations[4] = {Vec2(-0.25f, -0.25f), Vec2(-1.0f, -0.25f), Vec2(-1.0f, -1.0f), Vec2(-0.25f, -1.0f)};
892 
893     const Vec4 quadColors[4] = {Vec4(1.0f, 0.0f, 0.0f, 1.0), Vec4(0.0f, 1.0f, 0.0f, 1.0), Vec4(0.0f, 0.0f, 1.0f, 1.0),
894                                 Vec4(1.0f, 0.0f, 1.0f, 1.0)};
895 
896     const float quadSize = 1.25f;
897 
898     for (int quadNdx = 0; quadNdx < 4; quadNdx++)
899     {
900         const Vec2 &translation = translations[quadNdx];
901         const Vec4 &color       = quadColors[quadNdx];
902 
903         const Vertex4RGBA lowerLeftVertex  = {Vec4(translation.x(), translation.y(), 0.0f, 1.0f), color};
904         const Vertex4RGBA upperLeftVertex  = {Vec4(translation.x(), translation.y() + quadSize, 0.0f, 1.0f), color};
905         const Vertex4RGBA lowerRightVertex = {Vec4(translation.x() + quadSize, translation.y(), 0.0f, 1.0f), color};
906         const Vertex4RGBA upperRightVertex = {Vec4(translation.x() + quadSize, translation.y() + quadSize, 0.0f, 1.0f),
907                                               color};
908 
909         // Triangle 1, CCW
910         vertices.push_back(lowerLeftVertex);
911         vertices.push_back(lowerRightVertex);
912         vertices.push_back(upperLeftVertex);
913 
914         // Triangle 2, CW
915         vertices.push_back(lowerRightVertex);
916         vertices.push_back(upperLeftVertex);
917         vertices.push_back(upperRightVertex);
918     }
919 
920     return vertices;
921 }
922 
createOverlappingQuadsDualSource(void)923 std::vector<Vertex4RGBARGBA> createOverlappingQuadsDualSource(void)
924 {
925     using tcu::Vec2;
926     using tcu::Vec4;
927 
928     std::vector<Vertex4RGBARGBA> vertices;
929 
930     const Vec2 translations[4] = {Vec2(-0.25f, -0.25f), Vec2(-1.0f, -0.25f), Vec2(-1.0f, -1.0f), Vec2(-0.25f, -1.0f)};
931 
932     const Vec4 quadColors[4] = {Vec4(1.0f, 0.0f, 0.0f, 1.0), Vec4(0.0f, 1.0f, 0.0f, 1.0), Vec4(0.0f, 0.0f, 1.0f, 1.0),
933                                 Vec4(1.0f, 0.0f, 1.0f, 1.0)};
934 
935     const Vec4 color1 = Vec4(0.0f, 0.5f, 0.5f, 1.0f);
936 
937     const float quadSize = 1.25f;
938 
939     for (int quadNdx = 0; quadNdx < 4; quadNdx++)
940     {
941         const Vec2 &translation = translations[quadNdx];
942         const Vec4 &color0      = quadColors[quadNdx];
943 
944         const Vertex4RGBARGBA lowerLeftVertex  = {Vec4(translation.x(), translation.y(), 0.0f, 1.0f), color0, color1};
945         const Vertex4RGBARGBA upperLeftVertex  = {Vec4(translation.x(), translation.y() + quadSize, 0.0f, 1.0f), color0,
946                                                   color1};
947         const Vertex4RGBARGBA lowerRightVertex = {Vec4(translation.x() + quadSize, translation.y(), 0.0f, 1.0f), color0,
948                                                   color1};
949         const Vertex4RGBARGBA upperRightVertex = {
950             Vec4(translation.x() + quadSize, translation.y() + quadSize, 0.0f, 1.0f), color0, color1};
951 
952         // Triangle 1, CCW
953         vertices.push_back(lowerLeftVertex);
954         vertices.push_back(lowerRightVertex);
955         vertices.push_back(upperLeftVertex);
956 
957         // Triangle 2, CW
958         vertices.push_back(lowerRightVertex);
959         vertices.push_back(upperLeftVertex);
960         vertices.push_back(upperRightVertex);
961     }
962 
963     return vertices;
964 }
965 
createFullscreenQuad(void)966 std::vector<Vertex4Tex4> createFullscreenQuad(void)
967 {
968     using tcu::Vec4;
969 
970     const Vertex4Tex4 lowerLeftVertex  = {Vec4(-1.0f, -1.0f, 0.0f, 1.0f), Vec4(0.0f, 0.0f, 0.0f, 0.0f)};
971     const Vertex4Tex4 upperLeftVertex  = {Vec4(-1.0f, 1.0f, 0.0f, 1.0f), Vec4(0.0f, 1.0f, 0.0f, 0.0f)};
972     const Vertex4Tex4 lowerRightVertex = {Vec4(1.0f, -1.0f, 0.0f, 1.0f), Vec4(1.0f, 0.0f, 0.0f, 0.0f)};
973     const Vertex4Tex4 upperRightVertex = {Vec4(1.0f, 1.0f, 0.0f, 1.0f), Vec4(1.0f, 1.0f, 0.0f, 0.0f)};
974 
975     const Vertex4Tex4 vertices[6] = {lowerLeftVertex, lowerRightVertex, upperLeftVertex,
976 
977                                      upperLeftVertex, lowerRightVertex, upperRightVertex};
978 
979     return std::vector<Vertex4Tex4>(vertices, vertices + DE_LENGTH_OF_ARRAY(vertices));
980 }
981 
createQuadMosaic(int rows,int columns)982 std::vector<Vertex4Tex4> createQuadMosaic(int rows, int columns)
983 {
984     using tcu::Vec4;
985 
986     DE_ASSERT(rows >= 1);
987     DE_ASSERT(columns >= 1);
988 
989     std::vector<Vertex4Tex4> vertices;
990     const float rowSize    = 2.0f / (float)rows;
991     const float columnSize = 2.0f / (float)columns;
992     int arrayIndex         = 0;
993 
994     for (int rowNdx = 0; rowNdx < rows; rowNdx++)
995     {
996         for (int columnNdx = 0; columnNdx < columns; columnNdx++)
997         {
998             const Vertex4Tex4 lowerLeftVertex = {
999                 Vec4(-1.0f + (float)columnNdx * columnSize, -1.0f + (float)rowNdx * rowSize, 0.0f, 1.0f),
1000                 Vec4(0.0f, 0.0f, (float)arrayIndex, 0.0f)};
1001             const Vertex4Tex4 upperLeftVertex = {
1002                 Vec4(lowerLeftVertex.position.x(), lowerLeftVertex.position.y() + rowSize, 0.0f, 1.0f),
1003                 Vec4(0.0f, 1.0f, (float)arrayIndex, 0.0f)};
1004             const Vertex4Tex4 lowerRightVertex = {
1005                 Vec4(lowerLeftVertex.position.x() + columnSize, lowerLeftVertex.position.y(), 0.0f, 1.0f),
1006                 Vec4(1.0f, 0.0f, (float)arrayIndex, 0.0f)};
1007             const Vertex4Tex4 upperRightVertex = {
1008                 Vec4(lowerLeftVertex.position.x() + columnSize, lowerLeftVertex.position.y() + rowSize, 0.0f, 1.0f),
1009                 Vec4(1.0f, 1.0f, (float)arrayIndex, 0.0f)};
1010 
1011             vertices.push_back(lowerLeftVertex);
1012             vertices.push_back(lowerRightVertex);
1013             vertices.push_back(upperLeftVertex);
1014             vertices.push_back(upperLeftVertex);
1015             vertices.push_back(lowerRightVertex);
1016             vertices.push_back(upperRightVertex);
1017 
1018             arrayIndex++;
1019         }
1020     }
1021 
1022     return vertices;
1023 }
1024 
createQuadMosaicCube(void)1025 std::vector<Vertex4Tex4> createQuadMosaicCube(void)
1026 {
1027     using tcu::Vec3;
1028 
1029     static const Vec3 texCoordsCube[8] = {
1030         Vec3(-1.0f, -1.0f, -1.0f), // 0: -X, -Y, -Z
1031         Vec3(1.0f, -1.0f, -1.0f),  // 1:  X, -Y, -Z
1032         Vec3(1.0f, -1.0f, 1.0f),   // 2:  X, -Y,  Z
1033         Vec3(-1.0f, -1.0f, 1.0f),  // 3: -X, -Y,  Z
1034 
1035         Vec3(-1.0f, 1.0f, -1.0f), // 4: -X,  Y, -Z
1036         Vec3(1.0f, 1.0f, -1.0f),  // 5:  X,  Y, -Z
1037         Vec3(1.0f, 1.0f, 1.0f),   // 6:  X,  Y,  Z
1038         Vec3(-1.0f, 1.0f, 1.0f),  // 7: -X,  Y,  Z
1039     };
1040 
1041     static const int texCoordCubeIndices[6][6] = {
1042         {6, 5, 2, 2, 5, 1}, // +X face
1043         {3, 0, 7, 7, 0, 4}, // -X face
1044         {4, 5, 7, 7, 5, 6}, // +Y face
1045         {3, 2, 0, 0, 2, 1}, // -Y face
1046         {2, 3, 6, 6, 3, 7}, // +Z face
1047         {0, 1, 4, 4, 1, 5}  // -Z face
1048     };
1049 
1050     // Create 6 quads and set appropriate texture coordinates for cube mapping
1051 
1052     std::vector<Vertex4Tex4> vertices            = createQuadMosaic(2, 3);
1053     std::vector<Vertex4Tex4>::iterator vertexItr = vertices.begin();
1054 
1055     for (int quadNdx = 0; quadNdx < 6; quadNdx++)
1056     {
1057         for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
1058         {
1059             vertexItr->texCoord.xyz() = texCoordsCube[texCoordCubeIndices[quadNdx][vertexNdx]];
1060             vertexItr++;
1061         }
1062     }
1063 
1064     return vertices;
1065 }
1066 
createQuadMosaicCubeArray(int faceArrayIndices[6])1067 std::vector<Vertex4Tex4> createQuadMosaicCubeArray(int faceArrayIndices[6])
1068 {
1069     std::vector<Vertex4Tex4> vertices            = createQuadMosaicCube();
1070     std::vector<Vertex4Tex4>::iterator vertexItr = vertices.begin();
1071 
1072     for (int quadNdx = 0; quadNdx < 6; quadNdx++)
1073     {
1074         for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
1075         {
1076             vertexItr->texCoord.w() = (float)faceArrayIndices[quadNdx];
1077             vertexItr++;
1078         }
1079     }
1080 
1081     return vertices;
1082 }
1083 
createTestQuadMosaic(vk::VkImageViewType viewType)1084 std::vector<Vertex4Tex4> createTestQuadMosaic(vk::VkImageViewType viewType)
1085 {
1086     std::vector<Vertex4Tex4> vertices;
1087 
1088     switch (viewType)
1089     {
1090     case vk::VK_IMAGE_VIEW_TYPE_1D:
1091     case vk::VK_IMAGE_VIEW_TYPE_2D:
1092         vertices = createFullscreenQuad();
1093         break;
1094 
1095     case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY:
1096         vertices = createQuadMosaic(2, 3);
1097 
1098         // Set up array indices
1099         for (size_t quadNdx = 0; quadNdx < 6; quadNdx++)
1100             for (size_t vertexNdx = 0; vertexNdx < 6; vertexNdx++)
1101                 vertices[quadNdx * 6 + vertexNdx].texCoord.y() = (float)quadNdx;
1102 
1103         break;
1104 
1105     case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY:
1106         vertices = createQuadMosaic(2, 3);
1107         break;
1108 
1109     case vk::VK_IMAGE_VIEW_TYPE_3D:
1110         vertices = createQuadMosaic(2, 3);
1111 
1112         // Use z between 0.0 and 1.0.
1113         for (size_t vertexNdx = 0; vertexNdx < vertices.size(); vertexNdx++)
1114         {
1115             vertices[vertexNdx].texCoord.z() /= 5.0f;
1116             vertices[vertexNdx].texCoord.z() -=
1117                 0.001f; // Substract small value to correct floating-point errors at the boundaries between slices
1118         }
1119 
1120         break;
1121 
1122     case vk::VK_IMAGE_VIEW_TYPE_CUBE:
1123         vertices = createQuadMosaicCube();
1124         break;
1125 
1126     case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
1127     {
1128         int faceArrayIndices[6] = {0, 1, 2, 3, 4, 5};
1129         vertices                = createQuadMosaicCubeArray(faceArrayIndices);
1130     }
1131     break;
1132 
1133     default:
1134         DE_ASSERT(false);
1135         break;
1136     }
1137 
1138     return vertices;
1139 }
1140 
1141 } // namespace pipeline
1142 } // namespace vkt
1143