Blender V4.5
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
8
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_F32:
366 switch (size) {
367 case 4:
368 return VK_FORMAT_R32_SFLOAT;
369 case 8:
370 return VK_FORMAT_R32G32_SFLOAT;
371 case 12:
372 return VK_FORMAT_R32G32B32_SFLOAT;
373 case 16:
374 return VK_FORMAT_R32G32B32A32_SFLOAT;
375 case 64:
376 return VK_FORMAT_R32G32B32A32_SFLOAT;
377 default:
379 return VK_FORMAT_R32_SFLOAT;
380 }
381
382 default:
383 break;
384 }
386 return VK_FORMAT_R32_SFLOAT;
387}
388
389static VkFormat to_vk_format_int(const GPUVertCompType type, const uint32_t size)
390{
391 switch (type) {
392 case GPU_COMP_I8:
393 switch (size) {
394 case 1:
395 return VK_FORMAT_R8_SINT;
396 case 2:
397 return VK_FORMAT_R8G8_SINT;
398 case 3:
399 return VK_FORMAT_R8G8B8_SINT;
400 case 4:
401 return VK_FORMAT_R8G8B8A8_SINT;
402 default:
404 return VK_FORMAT_R8_SINT;
405 }
406 break;
407
408 case GPU_COMP_U8:
409 switch (size) {
410 case 1:
411 return VK_FORMAT_R8_UINT;
412 case 2:
413 return VK_FORMAT_R8G8_UINT;
414 case 3:
415 return VK_FORMAT_R8G8B8_UINT;
416 case 4:
417 return VK_FORMAT_R8G8B8A8_UINT;
418 default:
420 return VK_FORMAT_R8_UINT;
421 }
422 break;
423
424 case GPU_COMP_I16:
425 switch (size) {
426 case 2:
427 return VK_FORMAT_R16_SINT;
428 case 4:
429 return VK_FORMAT_R16G16_SINT;
430 case 6:
431 return VK_FORMAT_R16G16B16_SINT;
432 case 8:
433 return VK_FORMAT_R16G16B16A16_SINT;
434 default:
436 return VK_FORMAT_R16_SINT;
437 }
438 break;
439
440 case GPU_COMP_U16:
441 switch (size) {
442 case 2:
443 return VK_FORMAT_R16_UINT;
444 case 4:
445 return VK_FORMAT_R16G16_UINT;
446 case 6:
447 return VK_FORMAT_R16G16B16_UINT;
448 case 8:
449 return VK_FORMAT_R16G16B16A16_UINT;
450 default:
452 return VK_FORMAT_R16_UINT;
453 }
454 break;
455
456 case GPU_COMP_I32:
457 switch (size) {
458 case 4:
459 return VK_FORMAT_R32_SINT;
460 case 8:
461 return VK_FORMAT_R32G32_SINT;
462 case 12:
463 return VK_FORMAT_R32G32B32_SINT;
464 case 16:
465 return VK_FORMAT_R32G32B32A32_SINT;
466 default:
468 return VK_FORMAT_R32_SINT;
469 }
470 break;
471
472 case GPU_COMP_U32:
473 switch (size) {
474 case 4:
475 return VK_FORMAT_R32_UINT;
476 case 8:
477 return VK_FORMAT_R32G32_UINT;
478 case 12:
479 return VK_FORMAT_R32G32B32_UINT;
480 case 16:
481 return VK_FORMAT_R32G32B32A32_UINT;
482 default:
484 return VK_FORMAT_R32_UINT;
485 }
486 break;
487
488 case GPU_COMP_F32:
489 switch (size) {
490 case 4:
491 return VK_FORMAT_R32_SINT;
492 case 8:
493 return VK_FORMAT_R32G32_SINT;
494 case 12:
495 return VK_FORMAT_R32G32B32_SINT;
496 case 16:
497 return VK_FORMAT_R32G32B32A32_SINT;
498 default:
500 return VK_FORMAT_R32_SINT;
501 }
502 break;
503
504 case GPU_COMP_I10:
505 BLI_assert(size == 4);
506 return VK_FORMAT_A2B10G10R10_SINT_PACK32;
507
508 default:
509 break;
510 }
511
513 return VK_FORMAT_R32_SFLOAT;
514}
515
516VkFormat to_vk_format(const GPUVertCompType type, const uint32_t size, GPUVertFetchMode fetch_mode)
517{
518 switch (fetch_mode) {
519 case GPU_FETCH_FLOAT:
520 return to_vk_format_float(type, size);
521 case GPU_FETCH_INT:
522 return to_vk_format_int(type, size);
523 break;
525 return to_vk_format_norm(type, size);
526 break;
527 default:
528 break;
529 }
530
532 return VK_FORMAT_R32_SFLOAT;
533}
534
535VkFormat to_vk_format(const shader::Type type)
536{
537 switch (type) {
539 return VK_FORMAT_R32_SFLOAT;
541 return VK_FORMAT_R32G32_SFLOAT;
543 return VK_FORMAT_R32G32B32_SFLOAT;
545 return VK_FORMAT_R32G32B32A32_SFLOAT;
547 return VK_FORMAT_R32_UINT;
549 return VK_FORMAT_R32G32_UINT;
551 return VK_FORMAT_R32G32B32_UINT;
553 return VK_FORMAT_R32G32B32A32_UINT;
555 return VK_FORMAT_R32_SINT;
557 return VK_FORMAT_R32G32_SINT;
559 return VK_FORMAT_R32G32B32_SINT;
561 return VK_FORMAT_R32G32B32A32_SINT;
563 return VK_FORMAT_R32G32B32A32_SFLOAT;
564
584 break;
585 }
586
588 return VK_FORMAT_R32G32B32A32_SFLOAT;
589}
590
591VkQueryType to_vk_query_type(const GPUQueryType query_type)
592{
593 switch (query_type) {
595 return VK_QUERY_TYPE_OCCLUSION;
596 }
598 return VK_QUERY_TYPE_OCCLUSION;
599}
600
601VkImageType to_vk_image_type(const eGPUTextureType type)
602{
603 /* See
604 * https://vulkan.lunarg.com/doc/view/1.3.243.0/linux/1.3-extensions/vkspec.html#resources-image-views-compatibility
605 * for reference */
606 switch (type) {
607 case GPU_TEXTURE_1D:
610 return VK_IMAGE_TYPE_1D;
611
612 case GPU_TEXTURE_2D:
614 case GPU_TEXTURE_CUBE:
616 return VK_IMAGE_TYPE_2D;
617
618 case GPU_TEXTURE_3D:
619 return VK_IMAGE_TYPE_3D;
620
622 /* GPU_TEXTURE_ARRAY should always be used together with 1D, 2D, or CUBE. */
623 break;
624 }
625
627 return VK_IMAGE_TYPE_1D;
628}
629
630VkImageViewType to_vk_image_view_type(const eGPUTextureType type,
631 const eImageViewUsage view_type,
632 VKImageViewArrayed arrayed)
633{
634 VkImageViewType result = VK_IMAGE_VIEW_TYPE_1D;
635
636 switch (type) {
637 case GPU_TEXTURE_1D:
639 result = VK_IMAGE_VIEW_TYPE_1D;
640 break;
641 case GPU_TEXTURE_2D:
642 result = VK_IMAGE_VIEW_TYPE_2D;
643 break;
644 case GPU_TEXTURE_3D:
645 result = VK_IMAGE_VIEW_TYPE_3D;
646 break;
647 case GPU_TEXTURE_CUBE:
648 result = view_type == eImageViewUsage::Attachment ? VK_IMAGE_VIEW_TYPE_2D_ARRAY :
649 VK_IMAGE_VIEW_TYPE_CUBE;
650 break;
652 result = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
653 break;
655 result = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
656 break;
658 result = view_type == eImageViewUsage::Attachment ? VK_IMAGE_VIEW_TYPE_2D_ARRAY :
659 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
660 break;
661
663 /* GPU_TEXTURE_ARRAY should always be used together with 1D, 2D, or CUBE. */
664 break;
665 }
666
667 if (arrayed == VKImageViewArrayed::NOT_ARRAYED) {
668 if (result == VK_IMAGE_VIEW_TYPE_1D_ARRAY) {
669 result = VK_IMAGE_VIEW_TYPE_1D;
670 }
671 else if (result == VK_IMAGE_VIEW_TYPE_2D_ARRAY) {
672 result = VK_IMAGE_VIEW_TYPE_2D;
673 }
674 else if (result == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) {
675 result = VK_IMAGE_VIEW_TYPE_CUBE;
676 }
677 }
678 else if (arrayed == VKImageViewArrayed::ARRAYED) {
679 if (result == VK_IMAGE_VIEW_TYPE_1D) {
680 result = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
681 }
682 else if (result == VK_IMAGE_VIEW_TYPE_2D) {
683 result = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
684 }
685 else if (result == VK_IMAGE_VIEW_TYPE_CUBE) {
686 result = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
687 }
688 }
689
690 return result;
691}
692
693VkComponentSwizzle to_vk_component_swizzle(const char swizzle)
694{
695 switch (swizzle) {
696 case '0':
697 return VK_COMPONENT_SWIZZLE_ZERO;
698 case '1':
699 return VK_COMPONENT_SWIZZLE_ONE;
700 case 'r':
701 return VK_COMPONENT_SWIZZLE_R;
702 case 'g':
703 return VK_COMPONENT_SWIZZLE_G;
704 case 'b':
705 return VK_COMPONENT_SWIZZLE_B;
706 case 'a':
707 return VK_COMPONENT_SWIZZLE_A;
708
709 default:
710 break;
711 }
713 return VK_COMPONENT_SWIZZLE_IDENTITY;
714}
715
716template<typename T> void copy_color(T dst[4], const T *src)
717{
718 dst[0] = src[0];
719 dst[1] = src[1];
720 dst[2] = src[2];
721 dst[3] = src[3];
722}
723
724VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data)
725{
726 VkClearColorValue result = {{0.0f}};
727 switch (format) {
728 /* All float-like formats (i.e. everything except literal int/uint go
729 * into VkClearColorValue float color fields. */
730 case GPU_DATA_FLOAT:
732 case GPU_DATA_UBYTE:
735 const float *float_data = static_cast<const float *>(data);
736 copy_color<float>(result.float32, float_data);
737 break;
738 }
739
740 case GPU_DATA_INT: {
741 const int32_t *int_data = static_cast<const int32_t *>(data);
742 copy_color<int32_t>(result.int32, int_data);
743 break;
744 }
745
746 case GPU_DATA_UINT: {
747 const uint32_t *uint_data = static_cast<const uint32_t *>(data);
748 copy_color<uint32_t>(result.uint32, uint_data);
749 break;
750 }
751 case GPU_DATA_UINT_24_8: {
753 break;
754 }
755 }
756 return result;
757}
758
759VkIndexType to_vk_index_type(const GPUIndexBufType index_type)
760{
761 switch (index_type) {
762 case GPU_INDEX_U16:
763 return VK_INDEX_TYPE_UINT16;
764 case GPU_INDEX_U32:
765 return VK_INDEX_TYPE_UINT32;
766 default:
767 break;
768 }
770 return VK_INDEX_TYPE_UINT16;
771}
772
773VkPrimitiveTopology to_vk_primitive_topology(const GPUPrimType prim_type)
774{
775 switch (prim_type) {
776 case GPU_PRIM_POINTS:
777 return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
778 case GPU_PRIM_LINES:
779 return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
780 case GPU_PRIM_TRIS:
781 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
783 return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
785 return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
787 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
788 case GPU_PRIM_TRI_FAN:
789 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
791 return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY;
793 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY;
795 return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY;
796
797 case GPU_PRIM_NONE:
798 break;
799 }
800
802 return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
803}
804
805VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test)
806{
807 switch (cull_test) {
808 case GPU_CULL_FRONT:
809 return VK_CULL_MODE_FRONT_BIT;
810 case GPU_CULL_BACK:
811 return VK_CULL_MODE_BACK_BIT;
812 case GPU_CULL_NONE:
813 return VK_CULL_MODE_NONE;
814 }
816 return VK_CULL_MODE_NONE;
817}
818
819VkSamplerAddressMode to_vk_sampler_address_mode(const GPUSamplerExtendMode extend_mode)
820{
821 switch (extend_mode) {
823 return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
825 return VK_SAMPLER_ADDRESS_MODE_REPEAT;
827 return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
829 return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
830 }
831
833 return VK_SAMPLER_ADDRESS_MODE_REPEAT;
834}
835
836static VkDescriptorType to_vk_descriptor_type_image(const shader::ImageType &image_type)
837{
838 switch (image_type) {
839 case shader::ImageType::Float1D:
840 case shader::ImageType::Float1DArray:
841 case shader::ImageType::Float2D:
842 case shader::ImageType::Float2DArray:
843 case shader::ImageType::Float3D:
844 case shader::ImageType::FloatCube:
845 case shader::ImageType::FloatCubeArray:
846 case shader::ImageType::Int1D:
847 case shader::ImageType::Int1DArray:
848 case shader::ImageType::Int2D:
849 case shader::ImageType::Int2DArray:
850 case shader::ImageType::Int3D:
851 case shader::ImageType::IntCube:
852 case shader::ImageType::IntCubeArray:
853 case shader::ImageType::AtomicInt2D:
854 case shader::ImageType::AtomicInt2DArray:
855 case shader::ImageType::AtomicInt3D:
856 case shader::ImageType::Uint1D:
857 case shader::ImageType::Uint1DArray:
858 case shader::ImageType::Uint2D:
859 case shader::ImageType::Uint2DArray:
860 case shader::ImageType::Uint3D:
861 case shader::ImageType::UintCube:
862 case shader::ImageType::UintCubeArray:
863 case shader::ImageType::AtomicUint2D:
864 case shader::ImageType::AtomicUint2DArray:
865 case shader::ImageType::AtomicUint3D:
866 return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
867
868 case shader::ImageType::FloatBuffer:
869 case shader::ImageType::IntBuffer:
870 case shader::ImageType::UintBuffer:
871 return VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
872
873 default:
874 BLI_assert_msg(false, "ImageType not supported.");
875 }
876
877 return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
878}
879
880static VkDescriptorType to_vk_descriptor_type_sampler(const shader::ImageType &image_type)
881{
882 switch (image_type) {
884 case shader::ImageType::Float1D:
885 case shader::ImageType::Float1DArray:
886 case shader::ImageType::Float2D:
887 case shader::ImageType::Float2DArray:
888 case shader::ImageType::Float3D:
889 case shader::ImageType::FloatCube:
890 case shader::ImageType::FloatCubeArray:
891 case shader::ImageType::Int1D:
892 case shader::ImageType::Int1DArray:
893 case shader::ImageType::Int2D:
894 case shader::ImageType::Int2DArray:
895 case shader::ImageType::Int3D:
896 case shader::ImageType::IntCube:
897 case shader::ImageType::IntCubeArray:
898 case shader::ImageType::AtomicInt2D:
899 case shader::ImageType::AtomicInt2DArray:
900 case shader::ImageType::AtomicInt3D:
901 case shader::ImageType::Uint1D:
902 case shader::ImageType::Uint1DArray:
903 case shader::ImageType::Uint2D:
904 case shader::ImageType::Uint2DArray:
905 case shader::ImageType::Uint3D:
906 case shader::ImageType::UintCube:
907 case shader::ImageType::UintCubeArray:
908 case shader::ImageType::AtomicUint2D:
909 case shader::ImageType::AtomicUint2DArray:
910 case shader::ImageType::AtomicUint3D:
911 case shader::ImageType::Shadow2D:
912 case shader::ImageType::Shadow2DArray:
913 case shader::ImageType::ShadowCube:
914 case shader::ImageType::ShadowCubeArray:
915 case shader::ImageType::Depth2D:
916 case shader::ImageType::Depth2DArray:
917 case shader::ImageType::DepthCube:
918 case shader::ImageType::DepthCubeArray:
919 return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
920
921 case shader::ImageType::FloatBuffer:
922 case shader::ImageType::IntBuffer:
923 case shader::ImageType::UintBuffer:
924 return VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
925 }
926
927 return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
928}
929
931{
932 switch (resource.bind_type) {
934 return to_vk_descriptor_type_image(resource.image.type);
936 return to_vk_descriptor_type_sampler(resource.sampler.type);
938 return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
940 return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
941 }
943 return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
944}
945
946} // namespace blender::gpu
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
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:135
@ GPU_CULL_FRONT
Definition GPU_state.hh:137
@ GPU_CULL_NONE
Definition GPU_state.hh:136
@ GPU_CULL_BACK
Definition GPU_state.hh:138
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_RG16F
@ GPU_DEPTH32F_STENCIL8
@ GPU_R32F
@ 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_R16F
@ GPU_RGB16I
@ GPU_RGBA16_SNORM
@ GPU_RGB9_E5
@ GPU_SRGB8_A8_DXT5
@ GPU_RG8I
@ GPU_RG16I
@ GPU_RG32UI
@ GPU_RGB32I
@ GPU_RGBA32F
@ GPU_RGBA16F
@ GPU_RG8
@ GPU_RG32I
@ GPU_SRGB8_A8_DXT1
@ GPU_RG16
@ 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_R32UI
@ GPU_RGBA32I
@ GPU_RGBA8_DXT5
@ GPU_DEPTH_COMPONENT32F
@ GPU_R16_SNORM
@ GPU_DEPTH_COMPONENT16
@ GPU_R11F_G11F_B10F
@ GPU_RGBA8
GPUVertFetchMode
@ GPU_FETCH_FLOAT
@ GPU_FETCH_INT_TO_FLOAT_UNIT
@ GPU_FETCH_INT
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
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define resource
format
#define T
VkQueryType to_vk_query_type(const GPUQueryType query_type)
Definition vk_common.cc:591
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:389
VkIndexType to_vk_index_type(const GPUIndexBufType index_type)
Definition vk_common.cc:759
@ GPU_QUERY_OCCLUSION
Definition gpu_query.hh:18
VkComponentSwizzle to_vk_component_swizzle(const char swizzle)
Definition vk_common.cc:693
static VkDescriptorType to_vk_descriptor_type_image(const shader::ImageType &image_type)
Definition vk_common.cc:836
static VkDescriptorType to_vk_descriptor_type_sampler(const shader::ImageType &image_type)
Definition vk_common.cc:880
VkDescriptorType to_vk_descriptor_type(const shader::ShaderCreateInfo::Resource &resource)
Definition vk_common.cc:930
VkSamplerAddressMode to_vk_sampler_address_mode(const GPUSamplerExtendMode extend_mode)
Definition vk_common.cc:819
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:773
VkImageType to_vk_image_type(const eGPUTextureType type)
Definition vk_common.cc:601
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:724
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:716
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:630
VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test)
Definition vk_common.cc:805
char * buffers[2]