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 37 deUint32 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 174 deUint32 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 299 deUint32 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 405 deUint32 getPackedVertexFormatComponentWidth(VkFormat format, deUint32 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 deUint32 componentSizes[3] = { 5, 6, 5 }; 418 419 DE_ASSERT(componentNdx < 3); 420 return componentSizes[componentNdx]; 421 } 422 case VK_FORMAT_R4G4B4A4_UNORM_PACK16: 423 case VK_FORMAT_B4G4R4A4_UNORM_PACK16: 424 { 425 DE_ASSERT(componentNdx < 4); 426 return 4; 427 } 428 case VK_FORMAT_R5G5B5A1_UNORM_PACK16: 429 case VK_FORMAT_B5G5R5A1_UNORM_PACK16: 430 { 431 deUint32 componentSizes[4] = { 5, 5, 5, 1 }; 432 433 DE_ASSERT(componentNdx < 4); 434 return componentSizes[componentNdx]; 435 } 436 case VK_FORMAT_A1R5G5B5_UNORM_PACK16: 437 { 438 deUint32 componentSizes[4] = { 1, 5, 5, 5 }; 439 440 DE_ASSERT(componentNdx < 4); 441 return componentSizes[componentNdx]; 442 } 443 case VK_FORMAT_A8B8G8R8_UNORM_PACK32: 444 case VK_FORMAT_A8B8G8R8_SNORM_PACK32: 445 case VK_FORMAT_A8B8G8R8_USCALED_PACK32: 446 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 447 case VK_FORMAT_A8B8G8R8_UINT_PACK32: 448 case VK_FORMAT_A8B8G8R8_SINT_PACK32: 449 case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 450 { 451 DE_ASSERT(componentNdx < 4); 452 return 8; 453 } 454 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: 455 { 456 deUint32 componentSizes[3] = { 10, 11, 11 }; 457 458 DE_ASSERT(componentNdx < 3); 459 return componentSizes[componentNdx]; 460 } 461 case VK_FORMAT_A2R10G10B10_SNORM_PACK32: 462 case VK_FORMAT_A2R10G10B10_UNORM_PACK32: 463 case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 464 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 465 case VK_FORMAT_A2R10G10B10_USCALED_PACK32: 466 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 467 case VK_FORMAT_A2R10G10B10_UINT_PACK32: 468 case VK_FORMAT_A2R10G10B10_SINT_PACK32: 469 case VK_FORMAT_A2B10G10R10_USCALED_PACK32: 470 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 471 case VK_FORMAT_A2B10G10R10_UINT_PACK32: 472 case VK_FORMAT_A2B10G10R10_SINT_PACK32: 473 { 474 deUint32 componentSizes[4] = {2, 10, 10, 10}; 475 476 DE_ASSERT(componentNdx < 4); 477 return componentSizes[componentNdx]; 478 } 479 case VK_FORMAT_X8_D24_UNORM_PACK32: 480 { 481 deUint32 componentSizes[2] = { 8, 24 }; 482 483 DE_ASSERT(componentNdx < 2); 484 return componentSizes[componentNdx]; 485 } 486 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: 487 { 488 deUint32 componentSizes[4] = { 5, 9, 9, 9 }; 489 490 DE_ASSERT(componentNdx < 4); 491 return componentSizes[componentNdx]; 492 } 493 default: 494 break; 495 } 496 DE_ASSERT(false); 497 return 0; 498 } 499 500 bool isVertexFormatComponentOrderBGR (VkFormat format) 501 { 502 switch (format) 503 { 504 case VK_FORMAT_B8G8R8_UNORM: 505 case VK_FORMAT_B8G8R8_SNORM: 506 case VK_FORMAT_B8G8R8_USCALED: 507 case VK_FORMAT_B8G8R8_SSCALED: 508 case VK_FORMAT_B8G8R8_UINT: 509 case VK_FORMAT_B8G8R8_SINT: 510 case VK_FORMAT_B8G8R8_SRGB: 511 case VK_FORMAT_B8G8R8A8_UNORM: 512 case VK_FORMAT_B8G8R8A8_SNORM: 513 case VK_FORMAT_B8G8R8A8_USCALED: 514 case VK_FORMAT_B8G8R8A8_SSCALED: 515 case VK_FORMAT_B8G8R8A8_UINT: 516 case VK_FORMAT_B8G8R8A8_SINT: 517 case VK_FORMAT_B8G8R8A8_SRGB: 518 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 519 case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 520 case VK_FORMAT_A2B10G10R10_USCALED_PACK32: 521 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 522 case VK_FORMAT_A2B10G10R10_UINT_PACK32: 523 case VK_FORMAT_A2B10G10R10_SINT_PACK32: 524 return true; 525 526 default: 527 break; 528 } 529 return false; 530 } 531 532 bool isVertexFormatComponentOrderABGR(VkFormat format) 533 { 534 switch (format) 535 { 536 case VK_FORMAT_A8B8G8R8_UNORM_PACK32: 537 case VK_FORMAT_A8B8G8R8_SNORM_PACK32: 538 case VK_FORMAT_A8B8G8R8_USCALED_PACK32: 539 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 540 case VK_FORMAT_A8B8G8R8_UINT_PACK32: 541 case VK_FORMAT_A8B8G8R8_SINT_PACK32: 542 case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 543 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 544 case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 545 case VK_FORMAT_A2B10G10R10_USCALED_PACK32: 546 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 547 case VK_FORMAT_A2B10G10R10_UINT_PACK32: 548 case VK_FORMAT_A2B10G10R10_SINT_PACK32: 549 return true; 550 551 default: 552 break; 553 } 554 return false; 555 } 556 557 bool isVertexFormatComponentOrderARGB(VkFormat format) 558 { 559 switch (format) 560 { 561 case VK_FORMAT_A1R5G5B5_UNORM_PACK16: 562 case VK_FORMAT_A2R10G10B10_UNORM_PACK32: 563 case VK_FORMAT_A2R10G10B10_SNORM_PACK32: 564 case VK_FORMAT_A2R10G10B10_USCALED_PACK32: 565 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 566 case VK_FORMAT_A2R10G10B10_UINT_PACK32: 567 case VK_FORMAT_A2R10G10B10_SINT_PACK32: 568 return true; 569 570 default: 571 break; 572 } 573 return false; 574 } 575 576 bool isVertexFormatSint (VkFormat format) 577 { 578 switch (format) 579 { 580 case VK_FORMAT_R8_SINT: 581 case VK_FORMAT_R8G8_SINT: 582 case VK_FORMAT_R16_SINT: 583 case VK_FORMAT_R8G8B8_SINT: 584 case VK_FORMAT_B8G8R8_SINT: 585 case VK_FORMAT_R8G8B8A8_SINT: 586 case VK_FORMAT_A8B8G8R8_SINT_PACK32: 587 case VK_FORMAT_R16G16_SINT: 588 case VK_FORMAT_R32_SINT: 589 case VK_FORMAT_B8G8R8A8_SINT: 590 case VK_FORMAT_A2R10G10B10_SINT_PACK32: 591 case VK_FORMAT_A2B10G10R10_SINT_PACK32: 592 case VK_FORMAT_R16G16B16_SINT: 593 case VK_FORMAT_R16G16B16A16_SINT: 594 case VK_FORMAT_R32G32_SINT: 595 case VK_FORMAT_R32G32B32_SINT: 596 case VK_FORMAT_R32G32B32A32_SINT: 597 return true; 598 599 default: 600 break; 601 } 602 603 return false; 604 } 605 606 bool isVertexFormatUint (VkFormat format) 607 { 608 switch (format) 609 { 610 case VK_FORMAT_R8_UINT: 611 case VK_FORMAT_R8G8_UINT: 612 case VK_FORMAT_R16_UINT: 613 case VK_FORMAT_R8G8B8_UINT: 614 case VK_FORMAT_B8G8R8_UINT: 615 case VK_FORMAT_R8G8B8A8_UINT: 616 case VK_FORMAT_A8B8G8R8_UINT_PACK32: 617 case VK_FORMAT_A2R10G10B10_UINT_PACK32: 618 case VK_FORMAT_A2B10G10R10_UINT_PACK32: 619 case VK_FORMAT_R16G16_UINT: 620 case VK_FORMAT_R32_UINT: 621 case VK_FORMAT_B8G8R8A8_UINT: 622 case VK_FORMAT_R16G16B16_UINT: 623 case VK_FORMAT_R16G16B16A16_UINT: 624 case VK_FORMAT_R32G32_UINT: 625 case VK_FORMAT_R32G32B32_UINT: 626 case VK_FORMAT_R32G32B32A32_UINT: 627 return true; 628 629 default: 630 break; 631 } 632 633 return false; 634 635 } 636 637 bool isVertexFormatSfloat (VkFormat format) 638 { 639 switch (format) 640 { 641 case VK_FORMAT_R16_SFLOAT: 642 case VK_FORMAT_R16G16_SFLOAT: 643 case VK_FORMAT_R32_SFLOAT: 644 case VK_FORMAT_R16G16B16_SFLOAT: 645 case VK_FORMAT_R16G16B16A16_SFLOAT: 646 case VK_FORMAT_R32G32_SFLOAT: 647 case VK_FORMAT_R64_SFLOAT: 648 case VK_FORMAT_R32G32B32_SFLOAT: 649 case VK_FORMAT_R32G32B32A32_SFLOAT: 650 case VK_FORMAT_R64G64_SFLOAT: 651 case VK_FORMAT_R64G64B64_SFLOAT: 652 case VK_FORMAT_R64G64B64A64_SFLOAT: 653 return true; 654 655 default: 656 break; 657 } 658 659 return false; 660 661 } 662 663 bool isVertexFormatUfloat (VkFormat format) 664 { 665 switch (format) 666 { 667 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: 668 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: 669 return true; 670 671 default: 672 break; 673 } 674 675 return false; 676 677 } 678 679 bool isVertexFormatUnorm (VkFormat format) 680 { 681 switch (format) 682 { 683 case VK_FORMAT_R8_UNORM: 684 case VK_FORMAT_R4G4_UNORM_PACK8: 685 case VK_FORMAT_R8G8_UNORM: 686 case VK_FORMAT_R16_UNORM: 687 case VK_FORMAT_R5G6B5_UNORM_PACK16: 688 case VK_FORMAT_B5G6R5_UNORM_PACK16: 689 case VK_FORMAT_R4G4B4A4_UNORM_PACK16: 690 case VK_FORMAT_B4G4R4A4_UNORM_PACK16: 691 case VK_FORMAT_R5G5B5A1_UNORM_PACK16: 692 case VK_FORMAT_B5G5R5A1_UNORM_PACK16: 693 case VK_FORMAT_A1R5G5B5_UNORM_PACK16: 694 case VK_FORMAT_R8G8B8_UNORM: 695 case VK_FORMAT_B8G8R8_UNORM: 696 case VK_FORMAT_R8G8B8A8_UNORM: 697 case VK_FORMAT_A8B8G8R8_UNORM_PACK32: 698 case VK_FORMAT_A2R10G10B10_UNORM_PACK32: 699 case VK_FORMAT_R16G16_UNORM: 700 case VK_FORMAT_B8G8R8A8_UNORM: 701 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 702 case VK_FORMAT_X8_D24_UNORM_PACK32: 703 case VK_FORMAT_R16G16B16_UNORM: 704 case VK_FORMAT_R16G16B16A16_UNORM: 705 return true; 706 707 default: 708 break; 709 } 710 711 return false; 712 713 } 714 715 bool isVertexFormatSnorm (VkFormat format) 716 { 717 switch (format) 718 { 719 case VK_FORMAT_R8_SNORM: 720 case VK_FORMAT_R8G8_SNORM: 721 case VK_FORMAT_R16_SNORM: 722 case VK_FORMAT_R8G8B8_SNORM: 723 case VK_FORMAT_B8G8R8_SNORM: 724 case VK_FORMAT_R8G8B8A8_SNORM: 725 case VK_FORMAT_A8B8G8R8_SNORM_PACK32: 726 case VK_FORMAT_A2R10G10B10_SNORM_PACK32: 727 case VK_FORMAT_R16G16_SNORM: 728 case VK_FORMAT_B8G8R8A8_SNORM: 729 case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 730 case VK_FORMAT_R16G16B16_SNORM: 731 case VK_FORMAT_R16G16B16A16_SNORM: 732 return true; 733 734 default: 735 break; 736 } 737 738 return false; 739 740 } 741 742 bool isVertexFormatSRGB (VkFormat format) 743 { 744 switch (format) 745 { 746 case VK_FORMAT_R8_SRGB: 747 case VK_FORMAT_R8G8_SRGB: 748 case VK_FORMAT_R8G8B8_SRGB: 749 case VK_FORMAT_B8G8R8_SRGB: 750 case VK_FORMAT_R8G8B8A8_SRGB: 751 case VK_FORMAT_B8G8R8A8_SRGB: 752 case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 753 return true; 754 755 default: 756 break; 757 } 758 759 return false; 760 761 } 762 763 bool isVertexFormatSscaled (VkFormat format) 764 { 765 switch (format) 766 { 767 case VK_FORMAT_R8_SSCALED: 768 case VK_FORMAT_R8G8_SSCALED: 769 case VK_FORMAT_R16_SSCALED: 770 case VK_FORMAT_R8G8B8_SSCALED: 771 case VK_FORMAT_B8G8R8_SSCALED: 772 case VK_FORMAT_R8G8B8A8_SSCALED: 773 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 774 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 775 case VK_FORMAT_R16G16_SSCALED: 776 case VK_FORMAT_B8G8R8A8_SSCALED: 777 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 778 case VK_FORMAT_R16G16B16_SSCALED: 779 case VK_FORMAT_R16G16B16A16_SSCALED: 780 return true; 781 782 default: 783 break; 784 } 785 786 return false; 787 788 } 789 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 } 816 817 bool isVertexFormatDouble (VkFormat format) 818 { 819 switch (format) 820 { 821 case VK_FORMAT_R64_UINT: 822 case VK_FORMAT_R64_SINT: 823 case VK_FORMAT_R64_SFLOAT: 824 case VK_FORMAT_R64G64_UINT: 825 case VK_FORMAT_R64G64_SINT: 826 case VK_FORMAT_R64G64_SFLOAT: 827 case VK_FORMAT_R64G64B64_UINT: 828 case VK_FORMAT_R64G64B64_SINT: 829 case VK_FORMAT_R64G64B64_SFLOAT: 830 case VK_FORMAT_R64G64B64A64_UINT: 831 case VK_FORMAT_R64G64B64A64_SINT: 832 case VK_FORMAT_R64G64B64A64_SFLOAT: 833 return true; 834 835 default: 836 break; 837 } 838 return false; 839 } 840 841 bool isVertexFormatPacked(VkFormat format) 842 { 843 switch (format) 844 { 845 case VK_FORMAT_R4G4_UNORM_PACK8: 846 case VK_FORMAT_R4G4B4A4_UNORM_PACK16: 847 case VK_FORMAT_B4G4R4A4_UNORM_PACK16: 848 case VK_FORMAT_R5G6B5_UNORM_PACK16: 849 case VK_FORMAT_B5G6R5_UNORM_PACK16: 850 case VK_FORMAT_R5G5B5A1_UNORM_PACK16: 851 case VK_FORMAT_B5G5R5A1_UNORM_PACK16: 852 case VK_FORMAT_A1R5G5B5_UNORM_PACK16: 853 case VK_FORMAT_A8B8G8R8_UNORM_PACK32: 854 case VK_FORMAT_A8B8G8R8_SNORM_PACK32: 855 case VK_FORMAT_A8B8G8R8_USCALED_PACK32: 856 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 857 case VK_FORMAT_A8B8G8R8_UINT_PACK32: 858 case VK_FORMAT_A8B8G8R8_SINT_PACK32: 859 case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 860 case VK_FORMAT_A2R10G10B10_UNORM_PACK32: 861 case VK_FORMAT_A2R10G10B10_SNORM_PACK32: 862 case VK_FORMAT_A2R10G10B10_USCALED_PACK32: 863 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 864 case VK_FORMAT_A2R10G10B10_UINT_PACK32: 865 case VK_FORMAT_A2R10G10B10_SINT_PACK32: 866 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 867 case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 868 case VK_FORMAT_A2B10G10R10_USCALED_PACK32: 869 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 870 case VK_FORMAT_A2B10G10R10_UINT_PACK32: 871 case VK_FORMAT_A2B10G10R10_SINT_PACK32: 872 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: 873 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: 874 case VK_FORMAT_X8_D24_UNORM_PACK32: 875 return true; 876 877 default: 878 break; 879 } 880 return false; 881 } 882 883 std::vector<Vertex4RGBA> createOverlappingQuads (void) 884 { 885 using tcu::Vec2; 886 using tcu::Vec4; 887 888 std::vector<Vertex4RGBA> vertices; 889 890 const Vec2 translations[4] = 891 { 892 Vec2(-0.25f, -0.25f), 893 Vec2(-1.0f, -0.25f), 894 Vec2(-1.0f, -1.0f), 895 Vec2(-0.25f, -1.0f) 896 }; 897 898 const Vec4 quadColors[4] = 899 { 900 Vec4(1.0f, 0.0f, 0.0f, 1.0), 901 Vec4(0.0f, 1.0f, 0.0f, 1.0), 902 Vec4(0.0f, 0.0f, 1.0f, 1.0), 903 Vec4(1.0f, 0.0f, 1.0f, 1.0) 904 }; 905 906 const float quadSize = 1.25f; 907 908 for (int quadNdx = 0; quadNdx < 4; quadNdx++) 909 { 910 const Vec2& translation = translations[quadNdx]; 911 const Vec4& color = quadColors[quadNdx]; 912 913 const Vertex4RGBA lowerLeftVertex = 914 { 915 Vec4(translation.x(), translation.y(), 0.0f, 1.0f), 916 color 917 }; 918 const Vertex4RGBA upperLeftVertex = 919 { 920 Vec4(translation.x(), translation.y() + quadSize, 0.0f, 1.0f), 921 color 922 }; 923 const Vertex4RGBA lowerRightVertex = 924 { 925 Vec4(translation.x() + quadSize, translation.y(), 0.0f, 1.0f), 926 color 927 }; 928 const Vertex4RGBA upperRightVertex = 929 { 930 Vec4(translation.x() + quadSize, translation.y() + quadSize, 0.0f, 1.0f), 931 color 932 }; 933 934 // Triangle 1, CCW 935 vertices.push_back(lowerLeftVertex); 936 vertices.push_back(lowerRightVertex); 937 vertices.push_back(upperLeftVertex); 938 939 // Triangle 2, CW 940 vertices.push_back(lowerRightVertex); 941 vertices.push_back(upperLeftVertex); 942 vertices.push_back(upperRightVertex); 943 } 944 945 return vertices; 946 } 947 948 std::vector<Vertex4Tex4> createFullscreenQuad (void) 949 { 950 using tcu::Vec4; 951 952 const Vertex4Tex4 lowerLeftVertex = 953 { 954 Vec4(-1.0f, -1.0f, 0.0f, 1.0f), 955 Vec4(0.0f, 0.0f, 0.0f, 0.0f) 956 }; 957 const Vertex4Tex4 upperLeftVertex = 958 { 959 Vec4(-1.0f, 1.0f, 0.0f, 1.0f), 960 Vec4(0.0f, 1.0f, 0.0f, 0.0f) 961 }; 962 const Vertex4Tex4 lowerRightVertex = 963 { 964 Vec4(1.0f, -1.0f, 0.0f, 1.0f), 965 Vec4(1.0f, 0.0f, 0.0f, 0.0f) 966 }; 967 const Vertex4Tex4 upperRightVertex = 968 { 969 Vec4(1.0f, 1.0f, 0.0f, 1.0f), 970 Vec4(1.0f, 1.0f, 0.0f, 0.0f) 971 }; 972 973 const Vertex4Tex4 vertices[6] = 974 { 975 lowerLeftVertex, 976 lowerRightVertex, 977 upperLeftVertex, 978 979 upperLeftVertex, 980 lowerRightVertex, 981 upperRightVertex 982 }; 983 984 return std::vector<Vertex4Tex4>(vertices, vertices + DE_LENGTH_OF_ARRAY(vertices)); 985 } 986 987 std::vector<Vertex4Tex4> createQuadMosaic (int rows, int columns) 988 { 989 using tcu::Vec4; 990 991 DE_ASSERT(rows >= 1); 992 DE_ASSERT(columns >= 1); 993 994 std::vector<Vertex4Tex4> vertices; 995 const float rowSize = 2.0f / (float)rows; 996 const float columnSize = 2.0f / (float)columns; 997 int arrayIndex = 0; 998 999 for (int rowNdx = 0; rowNdx < rows; rowNdx++) 1000 { 1001 for (int columnNdx = 0; columnNdx < columns; columnNdx++) 1002 { 1003 const Vertex4Tex4 lowerLeftVertex = 1004 { 1005 Vec4(-1.0f + (float)columnNdx * columnSize, -1.0f + (float)rowNdx * rowSize, 0.0f, 1.0f), 1006 Vec4(0.0f, 0.0f, (float)arrayIndex, 0.0f) 1007 }; 1008 const Vertex4Tex4 upperLeftVertex = 1009 { 1010 Vec4(lowerLeftVertex.position.x(), lowerLeftVertex.position.y() + rowSize, 0.0f, 1.0f), 1011 Vec4(0.0f, 1.0f, (float)arrayIndex, 0.0f) 1012 }; 1013 const Vertex4Tex4 lowerRightVertex = 1014 { 1015 Vec4(lowerLeftVertex.position.x() + columnSize, lowerLeftVertex.position.y(), 0.0f, 1.0f), 1016 Vec4(1.0f, 0.0f, (float)arrayIndex, 0.0f) 1017 }; 1018 const Vertex4Tex4 upperRightVertex = 1019 { 1020 Vec4(lowerLeftVertex.position.x() + columnSize, lowerLeftVertex.position.y() + rowSize, 0.0f, 1.0f), 1021 Vec4(1.0f, 1.0f, (float)arrayIndex, 0.0f) 1022 }; 1023 1024 vertices.push_back(lowerLeftVertex); 1025 vertices.push_back(lowerRightVertex); 1026 vertices.push_back(upperLeftVertex); 1027 vertices.push_back(upperLeftVertex); 1028 vertices.push_back(lowerRightVertex); 1029 vertices.push_back(upperRightVertex); 1030 1031 arrayIndex++; 1032 } 1033 } 1034 1035 return vertices; 1036 } 1037 1038 std::vector<Vertex4Tex4> createQuadMosaicCube (void) 1039 { 1040 using tcu::Vec3; 1041 1042 static const Vec3 texCoordsCube[8] = 1043 { 1044 Vec3(-1.0f, -1.0f, -1.0f), // 0: -X, -Y, -Z 1045 Vec3(1.0f, -1.0f, -1.0f), // 1: X, -Y, -Z 1046 Vec3(1.0f, -1.0f, 1.0f), // 2: X, -Y, Z 1047 Vec3(-1.0f, -1.0f, 1.0f), // 3: -X, -Y, Z 1048 1049 Vec3(-1.0f, 1.0f, -1.0f), // 4: -X, Y, -Z 1050 Vec3(1.0f, 1.0f, -1.0f), // 5: X, Y, -Z 1051 Vec3(1.0f, 1.0f, 1.0f), // 6: X, Y, Z 1052 Vec3(-1.0f, 1.0f, 1.0f), // 7: -X, Y, Z 1053 }; 1054 1055 static const int texCoordCubeIndices[6][6] = 1056 { 1057 { 6, 5, 2, 2, 5, 1 }, // +X face 1058 { 3, 0, 7, 7, 0, 4 }, // -X face 1059 { 4, 5, 7, 7, 5, 6 }, // +Y face 1060 { 3, 2, 0, 0, 2, 1 }, // -Y face 1061 { 2, 3, 6, 6, 3, 7 }, // +Z face 1062 { 0, 1, 4, 4, 1, 5 } // -Z face 1063 }; 1064 1065 // Create 6 quads and set appropriate texture coordinates for cube mapping 1066 1067 std::vector<Vertex4Tex4> vertices = createQuadMosaic(2, 3); 1068 std::vector<Vertex4Tex4>::iterator vertexItr = vertices.begin(); 1069 1070 for (int quadNdx = 0; quadNdx < 6; quadNdx++) 1071 { 1072 for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++) 1073 { 1074 vertexItr->texCoord.xyz() = texCoordsCube[texCoordCubeIndices[quadNdx][vertexNdx]]; 1075 vertexItr++; 1076 } 1077 } 1078 1079 return vertices; 1080 } 1081 1082 std::vector<Vertex4Tex4> createQuadMosaicCubeArray (int faceArrayIndices[6]) 1083 { 1084 std::vector<Vertex4Tex4> vertices = createQuadMosaicCube(); 1085 std::vector<Vertex4Tex4>::iterator vertexItr = vertices.begin(); 1086 1087 for (int quadNdx = 0; quadNdx < 6; quadNdx++) 1088 { 1089 for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++) 1090 { 1091 vertexItr->texCoord.w() = (float)faceArrayIndices[quadNdx]; 1092 vertexItr++; 1093 } 1094 } 1095 1096 return vertices; 1097 } 1098 1099 std::vector<Vertex4Tex4> createTestQuadMosaic (vk::VkImageViewType viewType) 1100 { 1101 std::vector<Vertex4Tex4> vertices; 1102 1103 switch (viewType) 1104 { 1105 case vk::VK_IMAGE_VIEW_TYPE_1D: 1106 case vk::VK_IMAGE_VIEW_TYPE_2D: 1107 vertices = createFullscreenQuad(); 1108 break; 1109 1110 case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY: 1111 vertices = createQuadMosaic(2, 3); 1112 1113 // Set up array indices 1114 for (size_t quadNdx = 0; quadNdx < 6; quadNdx++) 1115 for (size_t vertexNdx = 0; vertexNdx < 6; vertexNdx++) 1116 vertices[quadNdx * 6 + vertexNdx].texCoord.y() = (float)quadNdx; 1117 1118 break; 1119 1120 case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY: 1121 vertices = createQuadMosaic(2, 3); 1122 break; 1123 1124 case vk::VK_IMAGE_VIEW_TYPE_3D: 1125 vertices = createQuadMosaic(2, 3); 1126 1127 // Use z between 0.0 and 1.0. 1128 for (size_t vertexNdx = 0; vertexNdx < vertices.size(); vertexNdx++) 1129 { 1130 vertices[vertexNdx].texCoord.z() /= 5.0f; 1131 vertices[vertexNdx].texCoord.z() -= 0.001f; // Substract small value to correct floating-point errors at the boundaries between slices 1132 } 1133 1134 break; 1135 1136 case vk::VK_IMAGE_VIEW_TYPE_CUBE: 1137 vertices = createQuadMosaicCube(); 1138 break; 1139 1140 case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 1141 { 1142 int faceArrayIndices[6] = { 0, 1, 2, 3, 4, 5 }; 1143 vertices = createQuadMosaicCubeArray(faceArrayIndices); 1144 } 1145 break; 1146 1147 default: 1148 DE_ASSERT(false); 1149 break; 1150 } 1151 1152 return vertices; 1153 } 1154 1155 } // pipeline 1156 } // vkt 1157