Blender V4.3
vk_common.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_utildefines.h"
10
11#include "vk_common.hh"
12
13namespace blender::gpu {
15{
16 switch (format) {
17 /* Formats texture & render-buffer */
18 case GPU_RGBA32UI:
19 case GPU_RG32UI:
20 case GPU_R32UI:
21 case GPU_RGBA16UI:
22 case GPU_RG16UI:
23 case GPU_R16UI:
24 case GPU_RGBA8UI:
25 case GPU_RG8UI:
26 case GPU_R8UI:
27 case GPU_RGBA32I:
28 case GPU_RG32I:
29 case GPU_R32I:
30 case GPU_RGBA16I:
31 case GPU_RG16I:
32 case GPU_R16I:
33 case GPU_RGBA8I:
34 case GPU_RG8I:
35 case GPU_R8I:
36 case GPU_RGBA32F:
37 case GPU_RG32F:
38 case GPU_R32F:
39 case GPU_RGBA16F:
40 case GPU_RG16F:
41 case GPU_R16F:
42 case GPU_RGBA16:
43 case GPU_RG16:
44 case GPU_R16:
45 case GPU_RGBA8:
46 case GPU_RG8:
47 case GPU_R8:
48 return VK_IMAGE_ASPECT_COLOR_BIT;
49
50 /* Special formats texture & render-buffer */
51 case GPU_RGB10_A2:
52 case GPU_RGB10_A2UI:
54 case GPU_SRGB8_A8:
55 return VK_IMAGE_ASPECT_COLOR_BIT;
56
57 /* Depth Formats. */
61 return VK_IMAGE_ASPECT_DEPTH_BIT;
62
65 return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
66
67 /* Texture only formats. */
68 case GPU_RGB32UI:
69 case GPU_RGB16UI:
70 case GPU_RGB8UI:
71 case GPU_RGB32I:
72 case GPU_RGB16I:
73 case GPU_RGB8I:
74 case GPU_RGB16:
75 case GPU_RGB8:
77 case GPU_RGB16_SNORM:
78 case GPU_RG16_SNORM:
79 case GPU_R16_SNORM:
80 case GPU_RGBA8_SNORM:
81 case GPU_RGB8_SNORM:
82 case GPU_RG8_SNORM:
83 case GPU_R8_SNORM:
84 case GPU_RGB32F:
85 case GPU_RGB16F:
86 return VK_IMAGE_ASPECT_COLOR_BIT;
87
88 /* Special formats, texture only. */
92 case GPU_RGBA8_DXT1:
93 case GPU_RGBA8_DXT3:
94 case GPU_RGBA8_DXT5:
95 case GPU_SRGB8:
96 case GPU_RGB9_E5:
97 return VK_IMAGE_ASPECT_COLOR_BIT;
98 }
100 return 0;
101}
102
104{
105 VkImageAspectFlags result = 0;
106 if (buffers & GPU_COLOR_BIT) {
107 result |= VK_IMAGE_ASPECT_COLOR_BIT;
108 }
109 if (buffers & GPU_DEPTH_BIT) {
110 result |= VK_IMAGE_ASPECT_DEPTH_BIT;
111 }
112 if (buffers & GPU_STENCIL_BIT) {
113 result |= VK_IMAGE_ASPECT_STENCIL_BIT;
114 }
115 return result;
116}
117
119{
120 switch (format) {
121 case VK_FORMAT_R8G8B8A8_UNORM:
122 case VK_FORMAT_B8G8R8A8_UNORM:
123 return GPU_RGBA8;
124
125 default:
127 }
128 return GPU_RGBA32F;
129}
130
132{
133 switch (format) {
134 /* Formats texture & render-buffer */
135 case GPU_RGBA32UI:
136 return VK_FORMAT_R32G32B32A32_UINT;
137 case GPU_RG32UI:
138 return VK_FORMAT_R32G32_UINT;
139 case GPU_R32UI:
140 return VK_FORMAT_R32_UINT;
141 case GPU_RGBA16UI:
142 return VK_FORMAT_R16G16B16A16_UINT;
143 case GPU_RG16UI:
144 return VK_FORMAT_R16G16_UINT;
145 case GPU_R16UI:
146 return VK_FORMAT_R16_UINT;
147 case GPU_RGBA8UI:
148 return VK_FORMAT_R8G8B8A8_UINT;
149 case GPU_RG8UI:
150 return VK_FORMAT_R8G8_UINT;
151 case GPU_R8UI:
152 return VK_FORMAT_R8_UINT;
153 case GPU_RGBA32I:
154 return VK_FORMAT_R32G32B32A32_SINT;
155 case GPU_RG32I:
156 return VK_FORMAT_R32G32_SINT;
157 case GPU_R32I:
158 return VK_FORMAT_R32_SINT;
159 case GPU_RGBA16I:
160 return VK_FORMAT_R16G16B16A16_SINT;
161 case GPU_RG16I:
162 return VK_FORMAT_R16G16_SINT;
163 case GPU_R16I:
164 return VK_FORMAT_R16_SINT;
165 case GPU_RGBA8I:
166 return VK_FORMAT_R8G8B8A8_SINT;
167 case GPU_RG8I:
168 return VK_FORMAT_R8G8_SINT;
169 case GPU_R8I:
170 return VK_FORMAT_R8_SINT;
171 case GPU_RGBA32F:
172 return VK_FORMAT_R32G32B32A32_SFLOAT;
173 case GPU_RG32F:
174 return VK_FORMAT_R32G32_SFLOAT;
175 case GPU_R32F:
176 return VK_FORMAT_R32_SFLOAT;
177 case GPU_RGBA16F:
178 return VK_FORMAT_R16G16B16A16_SFLOAT;
179 case GPU_RG16F:
180 return VK_FORMAT_R16G16_SFLOAT;
181 case GPU_R16F:
182 return VK_FORMAT_R16_SFLOAT;
183 case GPU_RGBA16:
184 return VK_FORMAT_R16G16B16A16_UNORM;
185 case GPU_RG16:
186 return VK_FORMAT_R16G16_UNORM;
187 case GPU_R16:
188 return VK_FORMAT_R16_UNORM;
189 case GPU_RGBA8:
190 return VK_FORMAT_R8G8B8A8_UNORM;
191 case GPU_RG8:
192 return VK_FORMAT_R8G8_UNORM;
193 case GPU_R8:
194 return VK_FORMAT_R8_UNORM;
195
196 /* Special formats texture & render-buffer */
197 case GPU_RGB10_A2:
198 return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
199 case GPU_RGB10_A2UI:
200 return VK_FORMAT_A2B10G10R10_UINT_PACK32;
202 return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
203 case GPU_SRGB8_A8:
204 return VK_FORMAT_R8G8B8A8_SRGB;
206 return VK_FORMAT_D32_SFLOAT_S8_UINT;
208 return VK_FORMAT_D24_UNORM_S8_UINT;
209
210 /* Depth Formats. */
212 return VK_FORMAT_D32_SFLOAT;
214 return VK_FORMAT_X8_D24_UNORM_PACK32;
216 return VK_FORMAT_D16_UNORM;
217
218 /* Texture only formats. */
219 case GPU_RGB32UI:
220 return VK_FORMAT_R32G32B32_UINT;
221 case GPU_RGB16UI:
222 return VK_FORMAT_R16G16B16_UINT;
223 case GPU_RGB8UI:
224 return VK_FORMAT_R8G8B8_UINT;
225 case GPU_RGB32I:
226 return VK_FORMAT_R32G32B32_SINT;
227 case GPU_RGB16I:
228 return VK_FORMAT_R16G16B16_SINT;
229 case GPU_RGB8I:
230 return VK_FORMAT_R8G8B8_SINT;
231 case GPU_RGB16:
232 return VK_FORMAT_R16G16B16_UNORM;
233 case GPU_RGB8:
234 return VK_FORMAT_R8G8B8_UNORM;
235 case GPU_RGBA16_SNORM:
236 return VK_FORMAT_R16G16B16A16_SNORM;
237 case GPU_RGB16_SNORM:
238 return VK_FORMAT_R16G16B16_SNORM;
239 case GPU_RG16_SNORM:
240 return VK_FORMAT_R16G16_SNORM;
241 case GPU_R16_SNORM:
242 return VK_FORMAT_R16_SNORM;
243 case GPU_RGBA8_SNORM:
244 return VK_FORMAT_R8G8B8A8_SNORM;
245 case GPU_RGB8_SNORM:
246 return VK_FORMAT_R8G8B8_SNORM;
247 case GPU_RG8_SNORM:
248 return VK_FORMAT_R8G8_SNORM;
249 case GPU_R8_SNORM:
250 return VK_FORMAT_R8_SNORM;
251 case GPU_RGB32F:
252 return VK_FORMAT_R32G32B32_SFLOAT;
253 case GPU_RGB16F:
254 return VK_FORMAT_R16G16B16_SFLOAT;
255
256 /* Special formats, texture only. */
258 return VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
260 return VK_FORMAT_BC2_SRGB_BLOCK;
262 return VK_FORMAT_BC3_SRGB_BLOCK;
263 case GPU_RGBA8_DXT1:
264 return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
265 case GPU_RGBA8_DXT3:
266 return VK_FORMAT_BC2_UNORM_BLOCK;
267 case GPU_RGBA8_DXT5:
268 return VK_FORMAT_BC3_UNORM_BLOCK;
269 case GPU_SRGB8:
270 return VK_FORMAT_R8G8B8_SRGB;
271 case GPU_RGB9_E5:
272 return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
273 }
274 return VK_FORMAT_UNDEFINED;
275}
276
277static VkFormat to_vk_format_norm(const GPUVertCompType type, const uint32_t size)
278{
279 switch (type) {
280 case GPU_COMP_I8:
281 switch (size) {
282 case 1:
283 return VK_FORMAT_R8_SNORM;
284 case 2:
285 return VK_FORMAT_R8G8_SNORM;
286 case 3:
287 return VK_FORMAT_R8G8B8_SNORM;
288 case 4:
289 return VK_FORMAT_R8G8B8A8_SNORM;
290 case 16:
291 return VK_FORMAT_R8G8B8A8_SNORM;
292 default:
294 return VK_FORMAT_R8_SNORM;
295 }
296 break;
297
298 case GPU_COMP_U8:
299 switch (size) {
300 case 1:
301 return VK_FORMAT_R8_UNORM;
302 case 2:
303 return VK_FORMAT_R8G8_UNORM;
304 case 3:
305 return VK_FORMAT_R8G8B8_UNORM;
306 case 4:
307 return VK_FORMAT_R8G8B8A8_UNORM;
308 case 16:
309 return VK_FORMAT_R8G8B8A8_UNORM;
310 default:
312 return VK_FORMAT_R8_UNORM;
313 }
314 break;
315
316 case GPU_COMP_I16:
317 switch (size) {
318 case 2:
319 return VK_FORMAT_R16_SNORM;
320 case 4:
321 return VK_FORMAT_R16G16_SNORM;
322 case 6:
323 return VK_FORMAT_R16G16B16_SNORM;
324 case 8:
325 return VK_FORMAT_R16G16B16A16_SNORM;
326 default:
328 return VK_FORMAT_R16_SNORM;
329 }
330 break;
331
332 case GPU_COMP_U16:
333 switch (size) {
334 case 2:
335 return VK_FORMAT_R16_UNORM;
336 case 4:
337 return VK_FORMAT_R16G16_UNORM;
338 case 6:
339 return VK_FORMAT_R16G16B16_UNORM;
340 case 8:
341 return VK_FORMAT_R16G16B16A16_UNORM;
342 default:
344 return VK_FORMAT_R16_UNORM;
345 }
346 break;
347
348 case GPU_COMP_I10:
349 BLI_assert(size == 4);
350 return VK_FORMAT_A2B10G10R10_SNORM_PACK32;
351
352 case GPU_COMP_I32:
353 case GPU_COMP_U32:
354 case GPU_COMP_F32:
355 default:
356 break;
357 }
359 return VK_FORMAT_R32_SFLOAT;
360}
361
362static VkFormat to_vk_format_float(const GPUVertCompType type, const uint32_t size)
363{
364 switch (type) {
365 case GPU_COMP_I8:
366 switch (size) {
367 case 1:
368 return VK_FORMAT_R8_SSCALED;
369 case 2:
370 return VK_FORMAT_R8G8_SSCALED;
371 case 3:
372 return VK_FORMAT_R8G8B8_SSCALED;
373 case 4:
374 return VK_FORMAT_R8G8B8A8_SSCALED;
375 default:
377 return VK_FORMAT_R8_SSCALED;
378 }
379 case GPU_COMP_U8:
380 switch (size) {
381 case 1:
382 return VK_FORMAT_R8_USCALED;
383 case 2:
384 return VK_FORMAT_R8G8_USCALED;
385 case 3:
386 return VK_FORMAT_R8G8B8_USCALED;
387 case 4:
388 return VK_FORMAT_R8G8B8A8_USCALED;
389 default:
391 return VK_FORMAT_R8_USCALED;
392 }
393 case GPU_COMP_I16:
394 switch (size) {
395 case 2:
396 return VK_FORMAT_R16_SSCALED;
397 case 4:
398 return VK_FORMAT_R16G16_SSCALED;
399 case 6:
400 return VK_FORMAT_R16G16B16_SSCALED;
401 case 8:
402 return VK_FORMAT_R16G16B16A16_SSCALED;
403 default:
405 return VK_FORMAT_R16_SSCALED;
406 }
407 case GPU_COMP_U16:
408 switch (size) {
409 case 2:
410 return VK_FORMAT_R16_USCALED;
411 case 4:
412 return VK_FORMAT_R16G16_USCALED;
413 case 6:
414 return VK_FORMAT_R16G16B16_USCALED;
415 case 8:
416 return VK_FORMAT_R16G16B16A16_USCALED;
417 default:
419 return VK_FORMAT_R16_USCALED;
420 }
421
422 case GPU_COMP_I32:
423 case GPU_COMP_U32:
424 /* NOTE: GPU_COMP_I32/U32 using GPU_FETCH_INT_TO_FLOAT isn't natively supported. These
425 * are converted on host-side to signed floats. */
426 switch (size) {
427 case 4:
428 return VK_FORMAT_R32_SFLOAT;
429 case 8:
430 return VK_FORMAT_R32G32_SFLOAT;
431 case 12:
432 return VK_FORMAT_R32G32B32_SFLOAT;
433 case 16:
434 return VK_FORMAT_R32G32B32A32_SFLOAT;
435 default:
437 return VK_FORMAT_R32_SFLOAT;
438 }
439
440 case GPU_COMP_F32:
441 switch (size) {
442 case 4:
443 return VK_FORMAT_R32_SFLOAT;
444 case 8:
445 return VK_FORMAT_R32G32_SFLOAT;
446 case 12:
447 return VK_FORMAT_R32G32B32_SFLOAT;
448 case 16:
449 return VK_FORMAT_R32G32B32A32_SFLOAT;
450 case 64:
451 return VK_FORMAT_R32G32B32A32_SFLOAT;
452 default:
454 return VK_FORMAT_R32_SFLOAT;
455 }
456
457 case GPU_COMP_I10:
458 BLI_assert(size == 4);
459 return VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
460
461 default:
462 break;
463 }
465 return VK_FORMAT_R32_SFLOAT;
466}
467
468static VkFormat to_vk_format_int(const GPUVertCompType type, const uint32_t size)
469{
470 switch (type) {
471 case GPU_COMP_I8:
472 switch (size) {
473 case 1:
474 return VK_FORMAT_R8_SINT;
475 case 2:
476 return VK_FORMAT_R8G8_SINT;
477 case 3:
478 return VK_FORMAT_R8G8B8_SINT;
479 case 4:
480 return VK_FORMAT_R8G8B8A8_SINT;
481 default:
483 return VK_FORMAT_R8_SINT;
484 }
485 break;
486
487 case GPU_COMP_U8:
488 switch (size) {
489 case 1:
490 return VK_FORMAT_R8_UINT;
491 case 2:
492 return VK_FORMAT_R8G8_UINT;
493 case 3:
494 return VK_FORMAT_R8G8B8_UINT;
495 case 4:
496 return VK_FORMAT_R8G8B8A8_UINT;
497 default:
499 return VK_FORMAT_R8_UINT;
500 }
501 break;
502
503 case GPU_COMP_I16:
504 switch (size) {
505 case 2:
506 return VK_FORMAT_R16_SINT;
507 case 4:
508 return VK_FORMAT_R16G16_SINT;
509 case 6:
510 return VK_FORMAT_R16G16B16_SINT;
511 case 8:
512 return VK_FORMAT_R16G16B16A16_SINT;
513 default:
515 return VK_FORMAT_R16_SINT;
516 }
517 break;
518
519 case GPU_COMP_U16:
520 switch (size) {
521 case 2:
522 return VK_FORMAT_R16_UINT;
523 case 4:
524 return VK_FORMAT_R16G16_UINT;
525 case 6:
526 return VK_FORMAT_R16G16B16_UINT;
527 case 8:
528 return VK_FORMAT_R16G16B16A16_UINT;
529 default:
531 return VK_FORMAT_R16_UINT;
532 }
533 break;
534
535 case GPU_COMP_I32:
536 switch (size) {
537 case 4:
538 return VK_FORMAT_R32_SINT;
539 case 8:
540 return VK_FORMAT_R32G32_SINT;
541 case 12:
542 return VK_FORMAT_R32G32B32_SINT;
543 case 16:
544 return VK_FORMAT_R32G32B32A32_SINT;
545 default:
547 return VK_FORMAT_R32_SINT;
548 }
549 break;
550
551 case GPU_COMP_U32:
552 switch (size) {
553 case 4:
554 return VK_FORMAT_R32_UINT;
555 case 8:
556 return VK_FORMAT_R32G32_UINT;
557 case 12:
558 return VK_FORMAT_R32G32B32_UINT;
559 case 16:
560 return VK_FORMAT_R32G32B32A32_UINT;
561 default:
563 return VK_FORMAT_R32_UINT;
564 }
565 break;
566
567 case GPU_COMP_F32:
568 switch (size) {
569 case 4:
570 return VK_FORMAT_R32_SINT;
571 case 8:
572 return VK_FORMAT_R32G32_SINT;
573 case 12:
574 return VK_FORMAT_R32G32B32_SINT;
575 case 16:
576 return VK_FORMAT_R32G32B32A32_SINT;
577 default:
579 return VK_FORMAT_R32_SINT;
580 }
581 break;
582
583 case GPU_COMP_I10:
584 BLI_assert(size == 4);
585 return VK_FORMAT_A2B10G10R10_SINT_PACK32;
586
587 default:
588 break;
589 }
590
592 return VK_FORMAT_R32_SFLOAT;
593}
594
595VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size, GPUVertFetchMode fetch_mode)
596{
597 switch (fetch_mode) {
598 case GPU_FETCH_FLOAT:
600 return to_vk_format_float(type, size);
601 break;
602 case GPU_FETCH_INT:
603 return to_vk_format_int(type, size);
604 break;
606 return to_vk_format_norm(type, size);
607 break;
608 default:
609 break;
610 }
611
613 return VK_FORMAT_R32_SFLOAT;
614}
615
616VkFormat to_vk_format(const shader::Type type)
617{
618 switch (type) {
620 return VK_FORMAT_R32_SFLOAT;
622 return VK_FORMAT_R32G32_SFLOAT;
624 return VK_FORMAT_R32G32B32_SFLOAT;
626 return VK_FORMAT_R32G32B32A32_SFLOAT;
628 return VK_FORMAT_R32_UINT;
630 return VK_FORMAT_R32G32_UINT;
632 return VK_FORMAT_R32G32B32_UINT;
634 return VK_FORMAT_R32G32B32A32_UINT;
636 return VK_FORMAT_R32_SINT;
638 return VK_FORMAT_R32G32_SINT;
640 return VK_FORMAT_R32G32B32_SINT;
642 return VK_FORMAT_R32G32B32A32_SINT;
644 return VK_FORMAT_R32G32B32A32_SFLOAT;
645
665 break;
666 }
667
669 return VK_FORMAT_R32G32B32A32_SFLOAT;
670}
671
672VkQueryType to_vk_query_type(const GPUQueryType query_type)
673{
674 switch (query_type) {
676 return VK_QUERY_TYPE_OCCLUSION;
677 }
679 return VK_QUERY_TYPE_OCCLUSION;
680}
681
682VkImageType to_vk_image_type(const eGPUTextureType type)
683{
684 /* See
685 * https://vulkan.lunarg.com/doc/view/1.3.243.0/linux/1.3-extensions/vkspec.html#resources-image-views-compatibility
686 * for reference */
687 switch (type) {
688 case GPU_TEXTURE_1D:
691 return VK_IMAGE_TYPE_1D;
692
693 case GPU_TEXTURE_2D:
695 case GPU_TEXTURE_CUBE:
697 return VK_IMAGE_TYPE_2D;
698
699 case GPU_TEXTURE_3D:
700 return VK_IMAGE_TYPE_3D;
701
703 /* GPU_TEXTURE_ARRAY should always be used together with 1D, 2D, or CUBE. */
704 break;
705 }
706
708 return VK_IMAGE_TYPE_1D;
709}
710
711VkImageViewType to_vk_image_view_type(const eGPUTextureType type,
712 const eImageViewUsage view_type,
713 VKImageViewArrayed arrayed)
714{
715 VkImageViewType result = VK_IMAGE_VIEW_TYPE_1D;
716
717 switch (type) {
718 case GPU_TEXTURE_1D:
720 result = VK_IMAGE_VIEW_TYPE_1D;
721 break;
722 case GPU_TEXTURE_2D:
723 result = VK_IMAGE_VIEW_TYPE_2D;
724 break;
725 case GPU_TEXTURE_3D:
726 result = VK_IMAGE_VIEW_TYPE_3D;
727 break;
728 case GPU_TEXTURE_CUBE:
729 result = view_type == eImageViewUsage::Attachment ? VK_IMAGE_VIEW_TYPE_2D_ARRAY :
730 VK_IMAGE_VIEW_TYPE_CUBE;
731 break;
733 result = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
734 break;
736 result = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
737 break;
739 result = view_type == eImageViewUsage::Attachment ? VK_IMAGE_VIEW_TYPE_2D_ARRAY :
740 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
741 break;
742
744 /* GPU_TEXTURE_ARRAY should always be used together with 1D, 2D, or CUBE. */
745 break;
746 }
747
748 if (arrayed == VKImageViewArrayed::NOT_ARRAYED) {
749 if (result == VK_IMAGE_VIEW_TYPE_1D_ARRAY) {
750 result = VK_IMAGE_VIEW_TYPE_1D;
751 }
752 else if (result == VK_IMAGE_VIEW_TYPE_2D_ARRAY) {
753 result = VK_IMAGE_VIEW_TYPE_2D;
754 }
755 else if (result == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
756 result = VK_IMAGE_VIEW_TYPE_CUBE;
757 }
758 }
759 else if (arrayed == VKImageViewArrayed::ARRAYED) {
760 if (result == VK_IMAGE_VIEW_TYPE_1D) {
761 result = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
762 }
763 else if (result == VK_IMAGE_VIEW_TYPE_2D) {
764 result = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
765 }
766 else if (result == VK_IMAGE_VIEW_TYPE_CUBE) {
767 result = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
768 }
769 }
770
771 return result;
772}
773
774VkComponentSwizzle to_vk_component_swizzle(const char swizzle)
775{
776 switch (swizzle) {
777 case '0':
778 return VK_COMPONENT_SWIZZLE_ZERO;
779 case '1':
780 return VK_COMPONENT_SWIZZLE_ONE;
781 case 'r':
782 return VK_COMPONENT_SWIZZLE_R;
783 case 'g':
784 return VK_COMPONENT_SWIZZLE_G;
785 case 'b':
786 return VK_COMPONENT_SWIZZLE_B;
787 case 'a':
788 return VK_COMPONENT_SWIZZLE_A;
789
790 default:
791 break;
792 }
794 return VK_COMPONENT_SWIZZLE_IDENTITY;
795}
796
797template<typename T> void copy_color(T dst[4], const T *src)
798{
799 dst[0] = src[0];
800 dst[1] = src[1];
801 dst[2] = src[2];
802 dst[3] = src[3];
803}
804
805VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data)
806{
807 VkClearColorValue result = {{0.0f}};
808 switch (format) {
809 case GPU_DATA_FLOAT:
811 const float *float_data = static_cast<const float *>(data);
812 copy_color<float>(result.float32, float_data);
813 break;
814 }
815
816 case GPU_DATA_INT: {
817 const int32_t *int_data = static_cast<const int32_t *>(data);
818 copy_color<int32_t>(result.int32, int_data);
819 break;
820 }
821
822 case GPU_DATA_UINT: {
823 const uint32_t *uint_data = static_cast<const uint32_t *>(data);
824 copy_color<uint32_t>(result.uint32, uint_data);
825 break;
826 }
827
829 case GPU_DATA_UBYTE:
833 break;
834 }
835 }
836 return result;
837}
838
839VkIndexType to_vk_index_type(const GPUIndexBufType index_type)
840{
841 switch (index_type) {
842 case GPU_INDEX_U16:
843 return VK_INDEX_TYPE_UINT16;
844 case GPU_INDEX_U32:
845 return VK_INDEX_TYPE_UINT32;
846 default:
847 break;
848 }
850 return VK_INDEX_TYPE_UINT16;
851}
852
853VkPrimitiveTopology to_vk_primitive_topology(const GPUPrimType prim_type)
854{
855 switch (prim_type) {
856 case GPU_PRIM_POINTS:
857 return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
858 case GPU_PRIM_LINES:
859 return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
860 case GPU_PRIM_TRIS:
861 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
863 return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
865 return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
867 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
868 case GPU_PRIM_TRI_FAN:
869 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
871 return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY;
873 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY;
875 return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY;
876
877 case GPU_PRIM_NONE:
878 break;
879 }
880
882 return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
883}
884
885VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test)
886{
887 switch (cull_test) {
888 case GPU_CULL_FRONT:
889 return VK_CULL_MODE_FRONT_BIT;
890 case GPU_CULL_BACK:
891 return VK_CULL_MODE_BACK_BIT;
892 case GPU_CULL_NONE:
893 return VK_CULL_MODE_NONE;
894 }
896 return VK_CULL_MODE_NONE;
897}
898
899VkSamplerAddressMode to_vk_sampler_address_mode(const GPUSamplerExtendMode extend_mode)
900{
901 switch (extend_mode) {
903 return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
905 return VK_SAMPLER_ADDRESS_MODE_REPEAT;
907 return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
909 return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
910 }
911
913 return VK_SAMPLER_ADDRESS_MODE_REPEAT;
914}
915
916static VkDescriptorType to_vk_descriptor_type_image(const shader::ImageType &image_type)
917{
918 switch (image_type) {
946 return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
947
951 return VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
952
953 default:
954 BLI_assert_msg(false, "ImageType not supported.");
955 }
956
957 return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
958}
959
960static VkDescriptorType to_vk_descriptor_type_sampler(const shader::ImageType &image_type)
961{
962 switch (image_type) {
998 return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
999
1003 return VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
1004 }
1005
1006 return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
1007}
1008
1010{
1011 switch (resource.bind_type) {
1013 return to_vk_descriptor_type_image(resource.image.type);
1017 return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
1019 return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1020 }
1022 return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1023}
1024
1025} // namespace blender::gpu
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define BLI_assert(a)
Definition BLI_assert.h:50
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
eGPUFrameBufferBits
@ GPU_DEPTH_BIT
@ GPU_STENCIL_BIT
@ GPU_COLOR_BIT
GPUPrimType
@ GPU_PRIM_TRI_FAN
@ GPU_PRIM_LINE_LOOP
@ GPU_PRIM_LINE_STRIP_ADJ
@ GPU_PRIM_TRIS_ADJ
@ GPU_PRIM_NONE
@ GPU_PRIM_LINES
@ GPU_PRIM_POINTS
@ GPU_PRIM_LINES_ADJ
@ GPU_PRIM_LINE_STRIP
@ GPU_PRIM_TRI_STRIP
@ GPU_PRIM_TRIS
eGPUFaceCullTest
Definition GPU_state.hh:132
@ GPU_CULL_FRONT
Definition GPU_state.hh:134
@ GPU_CULL_NONE
Definition GPU_state.hh:133
@ GPU_CULL_BACK
Definition GPU_state.hh:135
eGPUDataFormat
@ GPU_DATA_HALF_FLOAT
@ GPU_DATA_UINT_24_8
@ GPU_DATA_INT
@ GPU_DATA_10_11_11_REV
@ GPU_DATA_UBYTE
@ GPU_DATA_UINT
@ GPU_DATA_2_10_10_10_REV
@ GPU_DATA_FLOAT
GPUSamplerExtendMode
@ GPU_SAMPLER_EXTEND_MODE_MIRRORED_REPEAT
@ GPU_SAMPLER_EXTEND_MODE_REPEAT
@ GPU_SAMPLER_EXTEND_MODE_EXTEND
@ GPU_SAMPLER_EXTEND_MODE_CLAMP_TO_BORDER
eGPUTextureFormat
@ GPU_RGB16
@ GPU_R16UI
@ GPU_RGB8
@ GPU_DEPTH32F_STENCIL8
@ GPU_SRGB8
@ GPU_R16I
@ GPU_SRGB8_A8
@ GPU_RG8_SNORM
@ GPU_DEPTH24_STENCIL8
@ GPU_RGB10_A2
@ GPU_RGB8I
@ GPU_R32I
@ GPU_RGBA8_SNORM
@ GPU_RGB10_A2UI
@ GPU_RG8UI
@ GPU_RGB16I
@ GPU_RGBA16_SNORM
@ GPU_RGB9_E5
@ GPU_SRGB8_A8_DXT5
@ GPU_RG8I
@ GPU_RG16I
@ GPU_RG32UI
@ GPU_RGB32I
@ GPU_RG8
@ GPU_RG32I
@ GPU_SRGB8_A8_DXT1
@ GPU_RGBA32UI
@ GPU_R8I
@ GPU_R16
@ GPU_RG16UI
@ GPU_RGBA8I
@ GPU_RGBA8_DXT1
@ GPU_RGBA8UI
@ GPU_RGB32F
@ GPU_RGBA16UI
@ GPU_RGBA16I
@ GPU_R8UI
@ GPU_RGBA16
@ GPU_SRGB8_A8_DXT3
@ GPU_RGB8_SNORM
@ GPU_RGBA8_DXT3
@ GPU_RGB32UI
@ GPU_R8_SNORM
@ GPU_RG32F
@ GPU_R8
@ GPU_RGB16_SNORM
@ GPU_DEPTH_COMPONENT24
@ GPU_RG16_SNORM
@ GPU_RGB8UI
@ GPU_RGB16F
@ GPU_RGB16UI
@ GPU_RGBA32I
@ GPU_RGBA8_DXT5
@ GPU_DEPTH_COMPONENT32F
@ GPU_R16_SNORM
@ GPU_DEPTH_COMPONENT16
GPUVertFetchMode
@ GPU_FETCH_FLOAT
@ GPU_FETCH_INT_TO_FLOAT_UNIT
@ GPU_FETCH_INT
@ GPU_FETCH_INT_TO_FLOAT
GPUVertCompType
@ GPU_COMP_U16
@ GPU_COMP_I10
@ GPU_COMP_F32
@ GPU_COMP_I32
@ GPU_COMP_I8
@ GPU_COMP_U32
@ GPU_COMP_I16
@ GPU_COMP_U8
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
DOF_TILES_FLATTEN_GROUP_SIZE coc_tx GPU_R11F_G11F_B10F
out_radiance out_gbuf_normal out_gbuf_closure2 GPU_RG16
SHADOW_TILEMAP_RES tiles_buf[] statistics_buf render_view_buf[SHADOW_VIEW_MAX] GPU_R32UI
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
format
VkQueryType to_vk_query_type(const GPUQueryType query_type)
Definition vk_common.cc:672
static VkFormat to_vk_format_norm(const GPUVertCompType type, const uint32_t size)
Definition vk_common.cc:277
static VkFormat to_vk_format_int(const GPUVertCompType type, const uint32_t size)
Definition vk_common.cc:468
VkIndexType to_vk_index_type(const GPUIndexBufType index_type)
Definition vk_common.cc:839
@ GPU_QUERY_OCCLUSION
Definition gpu_query.hh:18
VkComponentSwizzle to_vk_component_swizzle(const char swizzle)
Definition vk_common.cc:774
static VkDescriptorType to_vk_descriptor_type_image(const shader::ImageType &image_type)
Definition vk_common.cc:916
static VkDescriptorType to_vk_descriptor_type_sampler(const shader::ImageType &image_type)
Definition vk_common.cc:960
VkDescriptorType to_vk_descriptor_type(const shader::ShaderCreateInfo::Resource &resource)
VkSamplerAddressMode to_vk_sampler_address_mode(const GPUSamplerExtendMode extend_mode)
Definition vk_common.cc:899
eGPUTextureFormat to_gpu_format(const VkFormat format)
Definition vk_common.cc:118
VkPrimitiveTopology to_vk_primitive_topology(const GPUPrimType prim_type)
Definition vk_common.cc:853
VkImageType to_vk_image_type(const eGPUTextureType type)
Definition vk_common.cc:682
VkFormat to_vk_format(const eGPUTextureFormat format)
Definition vk_common.cc:131
VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data)
Definition vk_common.cc:805
static VkFormat to_vk_format_float(const GPUVertCompType type, const uint32_t size)
Definition vk_common.cc:362
void copy_color(T dst[4], const T *src)
Definition vk_common.cc:797
VkImageAspectFlags to_vk_image_aspect_flag_bits(const eGPUTextureFormat format)
Definition vk_common.cc:14
VkImageViewType to_vk_image_view_type(const eGPUTextureType type, const eImageViewUsage view_type, VKImageViewArrayed arrayed)
Definition vk_common.cc:711
VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test)
Definition vk_common.cc:885
unsigned int uint32_t
Definition stdint.h:80
signed int int32_t
Definition stdint.h:77
char * buffers[2]