yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
591affaf7
master
1// vk-util.cpp 2#include "vk-util.h" 3 4#include "core/slang-math.h" 5 6#include <stdio.h> 7#include <stdlib.h> 8 9namespace gfx 10{ 11 12/* static */ VkFormat VulkanUtil ::getVkFormat (Format format ) 13{ 14switch (format ) 15 { 16case Format ::R32G32B32A32_TYPELESS : 17return VK_FORMAT_R32G32B32A32_SFLOAT ; 18case Format ::R32G32B32_TYPELESS : 19return VK_FORMAT_R32G32B32_SFLOAT ; 20case Format ::R32G32_TYPELESS : 21return VK_FORMAT_R32G32_SFLOAT ; 22case Format ::R32_TYPELESS : 23return VK_FORMAT_R32_SFLOAT ; 24 25case Format ::R16G16B16A16_TYPELESS : 26return VK_FORMAT_R16G16B16A16_SFLOAT ; 27case Format ::R16G16_TYPELESS : 28return VK_FORMAT_R16G16_SFLOAT ; 29case Format ::R16_TYPELESS : 30return VK_FORMAT_R16_SFLOAT ; 31 32case Format ::R8G8B8A8_TYPELESS : 33return VK_FORMAT_R8G8B8A8_UNORM ; 34case Format ::R8G8_TYPELESS : 35return VK_FORMAT_R8G8_UNORM ; 36case Format ::R8_TYPELESS : 37return VK_FORMAT_R8_UNORM ; 38case Format ::B8G8R8A8_TYPELESS : 39return VK_FORMAT_B8G8R8A8_UNORM ; 40 41case Format ::R64_UINT : 42return VK_FORMAT_R64_UINT ; 43 44case Format ::R32G32B32A32_FLOAT : 45return VK_FORMAT_R32G32B32A32_SFLOAT ; 46case Format ::R32G32B32_FLOAT : 47return VK_FORMAT_R32G32B32_SFLOAT ; 48case Format ::R32G32_FLOAT : 49return VK_FORMAT_R32G32_SFLOAT ; 50case Format ::R32_FLOAT : 51return VK_FORMAT_R32_SFLOAT ; 52 53case Format ::R16G16B16A16_FLOAT : 54return VK_FORMAT_R16G16B16A16_SFLOAT ; 55case Format ::R16G16_FLOAT : 56return VK_FORMAT_R16G16_SFLOAT ; 57case Format ::R16_FLOAT : 58return VK_FORMAT_R16_SFLOAT ; 59 60case Format ::R32G32B32A32_UINT : 61return VK_FORMAT_R32G32B32A32_UINT ; 62case Format ::R32G32B32_UINT : 63return VK_FORMAT_R32G32B32_UINT ; 64case Format ::R32G32_UINT : 65return VK_FORMAT_R32G32_UINT ; 66case Format ::R32_UINT : 67return VK_FORMAT_R32_UINT ; 68 69case Format ::R16G16B16A16_UINT : 70return VK_FORMAT_R16G16B16A16_UINT ; 71case Format ::R16G16_UINT : 72return VK_FORMAT_R16G16_UINT ; 73case Format ::R16_UINT : 74return VK_FORMAT_R16_UINT ; 75 76case Format ::R8G8B8A8_UINT : 77return VK_FORMAT_R8G8B8A8_UINT ; 78case Format ::R8G8_UINT : 79return VK_FORMAT_R8G8_UINT ; 80case Format ::R8_UINT : 81return VK_FORMAT_R8_UINT ; 82 83case Format ::R64_SINT : 84return VK_FORMAT_R64_SINT ; 85 86case Format ::R32G32B32A32_SINT : 87return VK_FORMAT_R32G32B32A32_SINT ; 88case Format ::R32G32B32_SINT : 89return VK_FORMAT_R32G32B32_SINT ; 90case Format ::R32G32_SINT : 91return VK_FORMAT_R32G32_SINT ; 92case Format ::R32_SINT : 93return VK_FORMAT_R32_SINT ; 94 95case Format ::R16G16B16A16_SINT : 96return VK_FORMAT_R16G16B16A16_SINT ; 97case Format ::R16G16_SINT : 98return VK_FORMAT_R16G16_SINT ; 99case Format ::R16_SINT : 100return VK_FORMAT_R16_SINT ; 101 102case Format ::R8G8B8A8_SINT : 103return VK_FORMAT_R8G8B8A8_SINT ; 104case Format ::R8G8_SINT : 105return VK_FORMAT_R8G8_SINT ; 106case Format ::R8_SINT : 107return VK_FORMAT_R8_SINT ; 108 109case Format ::R16G16B16A16_UNORM : 110return VK_FORMAT_R16G16B16A16_UNORM ; 111case Format ::R16G16_UNORM : 112return VK_FORMAT_R16G16_UNORM ; 113case Format ::R16_UNORM : 114return VK_FORMAT_R16_UNORM ; 115 116case Format ::R8G8B8A8_UNORM : 117return VK_FORMAT_R8G8B8A8_UNORM ; 118case Format ::R8G8B8A8_UNORM_SRGB : 119return VK_FORMAT_R8G8B8A8_SRGB ; 120case Format ::R8G8_UNORM : 121return VK_FORMAT_R8G8_UNORM ; 122case Format ::R8_UNORM : 123return VK_FORMAT_R8_UNORM ; 124case Format ::B8G8R8A8_UNORM : 125return VK_FORMAT_B8G8R8A8_UNORM ; 126case Format ::B8G8R8A8_UNORM_SRGB : 127return VK_FORMAT_B8G8R8A8_SRGB ; 128case Format ::B8G8R8X8_UNORM : 129return VK_FORMAT_B8G8R8A8_UNORM ; 130case Format ::B8G8R8X8_UNORM_SRGB : 131return VK_FORMAT_B8G8R8A8_SRGB ; 132 133case Format ::R16G16B16A16_SNORM : 134return VK_FORMAT_R16G16B16A16_SNORM ; 135case Format ::R16G16_SNORM : 136return VK_FORMAT_R16G16_SNORM ; 137case Format ::R16_SNORM : 138return VK_FORMAT_R16_SNORM ; 139 140case Format ::R8G8B8A8_SNORM : 141return VK_FORMAT_R8G8B8A8_SNORM ; 142case Format ::R8G8_SNORM : 143return VK_FORMAT_R8G8_SNORM ; 144case Format ::R8_SNORM : 145return VK_FORMAT_R8_SNORM ; 146 147case Format ::D32_FLOAT : 148return VK_FORMAT_D32_SFLOAT ; 149case Format ::D16_UNORM : 150return VK_FORMAT_D16_UNORM ; 151case Format ::D32_FLOAT_S8_UINT : 152return VK_FORMAT_D32_SFLOAT_S8_UINT ; 153case Format ::R32_FLOAT_X32_TYPELESS : 154return VK_FORMAT_R32_SFLOAT ; 155 156case Format ::B4G4R4A4_UNORM : 157return VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT ; 158case Format ::B5G6R5_UNORM : 159return VK_FORMAT_R5G6B5_UNORM_PACK16 ; 160case Format ::B5G5R5A1_UNORM : 161return VK_FORMAT_A1R5G5B5_UNORM_PACK16 ; 162 163case Format ::R9G9B9E5_SHAREDEXP : 164return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ; 165case Format ::R10G10B10A2_TYPELESS : 166return VK_FORMAT_A2B10G10R10_UINT_PACK32 ; 167case Format ::R10G10B10A2_UINT : 168return VK_FORMAT_A2B10G10R10_UINT_PACK32 ; 169case Format ::R10G10B10A2_UNORM : 170return VK_FORMAT_A2B10G10R10_UNORM_PACK32 ; 171case Format ::R11G11B10_FLOAT : 172return VK_FORMAT_B10G11R11_UFLOAT_PACK32 ; 173 174case Format ::BC1_UNORM : 175return VK_FORMAT_BC1_RGBA_UNORM_BLOCK ; 176case Format ::BC1_UNORM_SRGB : 177return VK_FORMAT_BC1_RGBA_SRGB_BLOCK ; 178case Format ::BC2_UNORM : 179return VK_FORMAT_BC2_UNORM_BLOCK ; 180case Format ::BC2_UNORM_SRGB : 181return VK_FORMAT_BC2_SRGB_BLOCK ; 182case Format ::BC3_UNORM : 183return VK_FORMAT_BC3_UNORM_BLOCK ; 184case Format ::BC3_UNORM_SRGB : 185return VK_FORMAT_BC3_SRGB_BLOCK ; 186case Format ::BC4_UNORM : 187return VK_FORMAT_BC4_UNORM_BLOCK ; 188case Format ::BC4_SNORM : 189return VK_FORMAT_BC4_SNORM_BLOCK ; 190case Format ::BC5_UNORM : 191return VK_FORMAT_BC5_UNORM_BLOCK ; 192case Format ::BC5_SNORM : 193return VK_FORMAT_BC5_SNORM_BLOCK ; 194case Format ::BC6H_UF16 : 195return VK_FORMAT_BC6H_UFLOAT_BLOCK ; 196case Format ::BC6H_SF16 : 197return VK_FORMAT_BC6H_SFLOAT_BLOCK ; 198case Format ::BC7_UNORM : 199return VK_FORMAT_BC7_UNORM_BLOCK ; 200case Format ::BC7_UNORM_SRGB : 201return VK_FORMAT_BC7_SRGB_BLOCK ; 202 203default : 204return VK_FORMAT_UNDEFINED ; 205 } 206} 207 208VkImageAspectFlags VulkanUtil ::getAspectMask (TextureAspect aspect ,VkFormat format ) 209{ 210switch (aspect ) 211 { 212case TextureAspect ::Default : 213switch (format ) 214 { 215case VK_FORMAT_D16_UNORM_S8_UINT : 216case VK_FORMAT_D24_UNORM_S8_UINT : 217case VK_FORMAT_D32_SFLOAT_S8_UINT : 218return VK_IMAGE_ASPECT_DEPTH_BIT |VK_IMAGE_ASPECT_STENCIL_BIT ; 219case VK_FORMAT_D16_UNORM : 220case VK_FORMAT_D32_SFLOAT : 221case VK_FORMAT_X8_D24_UNORM_PACK32 : 222return VK_IMAGE_ASPECT_DEPTH_BIT ; 223case VK_FORMAT_S8_UINT : 224return VK_IMAGE_ASPECT_STENCIL_BIT ; 225default : 226return VK_IMAGE_ASPECT_COLOR_BIT ; 227 } 228case TextureAspect ::Color : 229return VK_IMAGE_ASPECT_COLOR_BIT ; 230case TextureAspect ::Depth : 231return VK_IMAGE_ASPECT_DEPTH_BIT ; 232case TextureAspect ::DepthStencil : 233return VK_IMAGE_ASPECT_DEPTH_BIT |VK_IMAGE_ASPECT_STENCIL_BIT ; 234case TextureAspect ::Stencil : 235return VK_IMAGE_ASPECT_STENCIL_BIT ; 236case TextureAspect ::Plane0 : 237return VK_IMAGE_ASPECT_PLANE_0_BIT ; 238case TextureAspect ::Plane1 : 239return VK_IMAGE_ASPECT_PLANE_1_BIT ; 240 241case TextureAspect ::Plane2 : 242return VK_IMAGE_ASPECT_PLANE_2_BIT ; 243 244case TextureAspect ::MetaData : 245return VK_IMAGE_ASPECT_METADATA_BIT ; 246default : 247SLANG_UNREACHABLE ("getAspectMask" ); 248return 0 ; 249 } 250} 251 252/* static */ SlangResult VulkanUtil ::toSlangResult (VkResult res ) 253{ 254return (res == VK_SUCCESS ) ?SLANG_OK :SLANG_FAIL ; 255} 256 257VkShaderStageFlags VulkanUtil ::getShaderStage (SlangStage stage ) 258{ 259switch (stage ) 260 { 261case SLANG_STAGE_ANY_HIT : 262return VK_SHADER_STAGE_ANY_HIT_BIT_KHR ; 263case SLANG_STAGE_CALLABLE : 264return VK_SHADER_STAGE_CALLABLE_BIT_KHR ; 265case SLANG_STAGE_CLOSEST_HIT : 266return VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR ; 267case SLANG_STAGE_COMPUTE : 268return VK_SHADER_STAGE_COMPUTE_BIT ; 269case SLANG_STAGE_DOMAIN : 270return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ; 271case SLANG_STAGE_FRAGMENT : 272return VK_SHADER_STAGE_FRAGMENT_BIT ; 273case SLANG_STAGE_GEOMETRY : 274return VK_SHADER_STAGE_GEOMETRY_BIT ; 275case SLANG_STAGE_HULL : 276return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT ; 277case SLANG_STAGE_INTERSECTION : 278return VK_SHADER_STAGE_INTERSECTION_BIT_KHR ; 279case SLANG_STAGE_MISS : 280return VK_SHADER_STAGE_MISS_BIT_KHR ; 281case SLANG_STAGE_RAY_GENERATION : 282return VK_SHADER_STAGE_RAYGEN_BIT_KHR ; 283case SLANG_STAGE_VERTEX : 284return VK_SHADER_STAGE_VERTEX_BIT ; 285case SLANG_STAGE_MESH : 286return VK_SHADER_STAGE_MESH_BIT_EXT ; 287case SLANG_STAGE_AMPLIFICATION : 288return VK_SHADER_STAGE_TASK_BIT_EXT ; 289default : 290assert (!"unsupported stage." ); 291return VkShaderStageFlags (-1 ); 292 } 293} 294 295VkImageLayout VulkanUtil ::getImageLayoutFromState (ResourceState state ) 296{ 297switch (state ) 298 { 299case ResourceState ::ShaderResource : 300case ResourceState ::PixelShaderResource : 301case ResourceState ::NonPixelShaderResource : 302return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL ; 303case ResourceState ::UnorderedAccess : 304case ResourceState ::General : 305return VK_IMAGE_LAYOUT_GENERAL ; 306case ResourceState ::Present : 307return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ; 308case ResourceState ::CopySource : 309return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ; 310case ResourceState ::CopyDestination : 311return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ; 312case ResourceState ::RenderTarget : 313return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ; 314case ResourceState ::DepthWrite : 315return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ; 316case ResourceState ::DepthRead : 317return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL ; 318case ResourceState ::ResolveSource : 319return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ; 320case ResourceState ::ResolveDestination : 321return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ; 322default : 323return VK_IMAGE_LAYOUT_UNDEFINED ; 324 } 325return VkImageLayout (); 326} 327 328VkSampleCountFlagBits VulkanUtil ::translateSampleCount (uint32_t sampleCount ) 329{ 330switch (sampleCount ) 331 { 332case 1 : 333return VK_SAMPLE_COUNT_1_BIT ; 334case 2 : 335return VK_SAMPLE_COUNT_2_BIT ; 336case 4 : 337return VK_SAMPLE_COUNT_4_BIT ; 338case 8 : 339return VK_SAMPLE_COUNT_8_BIT ; 340case 16 : 341return VK_SAMPLE_COUNT_16_BIT ; 342case 32 : 343return VK_SAMPLE_COUNT_32_BIT ; 344case 64 : 345return VK_SAMPLE_COUNT_64_BIT ; 346default : 347assert (!"Unsupported sample count" ); 348return VK_SAMPLE_COUNT_1_BIT ; 349 } 350} 351 352VkCullModeFlags VulkanUtil ::translateCullMode (CullMode cullMode ) 353{ 354switch (cullMode ) 355 { 356case CullMode ::None : 357return VK_CULL_MODE_NONE ; 358case CullMode ::Front : 359return VK_CULL_MODE_FRONT_BIT ; 360case CullMode ::Back : 361return VK_CULL_MODE_BACK_BIT ; 362default : 363assert (!"Unsupported cull mode" ); 364return VK_CULL_MODE_NONE ; 365 } 366} 367 368VkFrontFace VulkanUtil ::translateFrontFaceMode (FrontFaceMode frontFaceMode ) 369{ 370switch (frontFaceMode ) 371 { 372case FrontFaceMode ::CounterClockwise : 373return VK_FRONT_FACE_COUNTER_CLOCKWISE ; 374case FrontFaceMode ::Clockwise : 375return VK_FRONT_FACE_CLOCKWISE ; 376default : 377assert (!"Unsupported front face mode" ); 378return VK_FRONT_FACE_CLOCKWISE ; 379 } 380} 381 382VkPolygonMode VulkanUtil ::translateFillMode (FillMode fillMode ) 383{ 384switch (fillMode ) 385 { 386case FillMode ::Solid : 387return VK_POLYGON_MODE_FILL ; 388case FillMode ::Wireframe : 389return VK_POLYGON_MODE_LINE ; 390default : 391assert (!"Unsupported fill mode" ); 392return VK_POLYGON_MODE_FILL ; 393 } 394} 395 396VkBlendFactor VulkanUtil ::translateBlendFactor (BlendFactor blendFactor ) 397{ 398switch (blendFactor ) 399 { 400case BlendFactor ::Zero : 401return VK_BLEND_FACTOR_ZERO ; 402case BlendFactor ::One : 403return VK_BLEND_FACTOR_ONE ; 404case BlendFactor ::SrcColor : 405return VK_BLEND_FACTOR_SRC_COLOR ; 406case BlendFactor ::InvSrcColor : 407return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR ; 408case BlendFactor ::SrcAlpha : 409return VK_BLEND_FACTOR_SRC_ALPHA ; 410case BlendFactor ::InvSrcAlpha : 411return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA ; 412case BlendFactor ::DestAlpha : 413return VK_BLEND_FACTOR_DST_ALPHA ; 414case BlendFactor ::InvDestAlpha : 415return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA ; 416case BlendFactor ::DestColor : 417return VK_BLEND_FACTOR_DST_COLOR ; 418case BlendFactor ::InvDestColor : 419return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA ; 420case BlendFactor ::SrcAlphaSaturate : 421return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE ; 422case BlendFactor ::BlendColor : 423return VK_BLEND_FACTOR_CONSTANT_COLOR ; 424case BlendFactor ::InvBlendColor : 425return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR ; 426case BlendFactor ::SecondarySrcColor : 427return VK_BLEND_FACTOR_SRC1_COLOR ; 428case BlendFactor ::InvSecondarySrcColor : 429return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR ; 430case BlendFactor ::SecondarySrcAlpha : 431return VK_BLEND_FACTOR_SRC1_ALPHA ; 432case BlendFactor ::InvSecondarySrcAlpha : 433return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA ; 434 435default : 436assert (!"Unsupported blend factor" ); 437return VK_BLEND_FACTOR_ONE ; 438 } 439} 440 441VkBlendOp VulkanUtil ::translateBlendOp (BlendOp op ) 442{ 443switch (op ) 444 { 445case BlendOp ::Add : 446return VK_BLEND_OP_ADD ; 447case BlendOp ::Subtract : 448return VK_BLEND_OP_SUBTRACT ; 449case BlendOp ::ReverseSubtract : 450return VK_BLEND_OP_REVERSE_SUBTRACT ; 451case BlendOp ::Min : 452return VK_BLEND_OP_MIN ; 453case BlendOp ::Max : 454return VK_BLEND_OP_MAX ; 455default : 456assert (!"Unsupported blend op" ); 457return VK_BLEND_OP_ADD ; 458 } 459} 460 461VkPrimitiveTopology VulkanUtil ::translatePrimitiveTypeToListTopology (PrimitiveType primitiveType ) 462{ 463switch (primitiveType ) 464 { 465case PrimitiveType ::Point : 466return VK_PRIMITIVE_TOPOLOGY_POINT_LIST ; 467case PrimitiveType ::Line : 468return VK_PRIMITIVE_TOPOLOGY_LINE_LIST ; 469case PrimitiveType ::Triangle : 470return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST ; 471case PrimitiveType ::Patch : 472return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST ; 473default : 474assert (!"unknown topology type." ); 475return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST ; 476 } 477} 478 479VkStencilOp VulkanUtil ::translateStencilOp (StencilOp op ) 480{ 481switch (op ) 482 { 483case StencilOp ::DecrementSaturate : 484return VK_STENCIL_OP_DECREMENT_AND_CLAMP ; 485case StencilOp ::DecrementWrap : 486return VK_STENCIL_OP_DECREMENT_AND_WRAP ; 487case StencilOp ::IncrementSaturate : 488return VK_STENCIL_OP_INCREMENT_AND_CLAMP ; 489case StencilOp ::IncrementWrap : 490return VK_STENCIL_OP_INCREMENT_AND_WRAP ; 491case StencilOp ::Invert : 492return VK_STENCIL_OP_INVERT ; 493case StencilOp ::Keep : 494return VK_STENCIL_OP_KEEP ; 495case StencilOp ::Replace : 496return VK_STENCIL_OP_REPLACE ; 497case StencilOp ::Zero : 498return VK_STENCIL_OP_ZERO ; 499default : 500return VK_STENCIL_OP_KEEP ; 501 } 502} 503 504VkFilter VulkanUtil ::translateFilterMode (TextureFilteringMode mode ) 505{ 506switch (mode ) 507 { 508default : 509return VkFilter (0 ); 510 511#define CASE (SRC ,DST ) \ 512 case TextureFilteringMode::SRC: \ 513 return VK_FILTER_##DST 514 515CASE (Point ,NEAREST ); 516CASE (Linear ,LINEAR ); 517 518#undef CASE 519 } 520} 521 522VkSamplerMipmapMode VulkanUtil ::translateMipFilterMode (TextureFilteringMode mode ) 523{ 524switch (mode ) 525 { 526default : 527return VkSamplerMipmapMode (0 ); 528 529#define CASE (SRC ,DST ) \ 530 case TextureFilteringMode::SRC: \ 531 return VK_SAMPLER_MIPMAP_MODE_##DST 532 533CASE (Point ,NEAREST ); 534CASE (Linear ,LINEAR ); 535 536#undef CASE 537 } 538} 539 540VkSamplerAddressMode VulkanUtil ::translateAddressingMode (TextureAddressingMode mode ) 541{ 542switch (mode ) 543 { 544default : 545return VkSamplerAddressMode (0 ); 546 547#define CASE (SRC ,DST ) \ 548 case TextureAddressingMode::SRC: \ 549 return VK_SAMPLER_ADDRESS_MODE_##DST 550 551CASE (Wrap ,REPEAT ); 552CASE (ClampToEdge ,CLAMP_TO_EDGE ); 553CASE (ClampToBorder ,CLAMP_TO_BORDER ); 554CASE (MirrorRepeat ,MIRRORED_REPEAT ); 555CASE (MirrorOnce ,MIRROR_CLAMP_TO_EDGE ); 556 557#undef CASE 558 } 559} 560 561VkCompareOp VulkanUtil ::translateComparisonFunc (ComparisonFunc func ) 562{ 563switch (func ) 564 { 565default : 566// TODO: need to report failures 567return VK_COMPARE_OP_ALWAYS ; 568 569#define CASE (FROM ,TO ) \ 570 case ComparisonFunc::FROM: \ 571 return VK_COMPARE_OP_##TO 572 573CASE (Never ,NEVER ); 574CASE (Less ,LESS ); 575CASE (Equal ,EQUAL ); 576CASE (LessEqual ,LESS_OR_EQUAL ); 577CASE (Greater ,GREATER ); 578CASE (NotEqual ,NOT_EQUAL ); 579CASE (GreaterEqual ,GREATER_OR_EQUAL ); 580CASE (Always ,ALWAYS ); 581#undef CASE 582 } 583} 584 585VkStencilOpState VulkanUtil ::translateStencilState (DepthStencilOpDesc desc ) 586{ 587VkStencilOpState rs ; 588rs .compareMask = 0xFF ; 589rs .compareOp = translateComparisonFunc (desc .stencilFunc ); 590rs .depthFailOp = translateStencilOp (desc .stencilDepthFailOp ); 591rs .failOp = translateStencilOp (desc .stencilFailOp ); 592rs .passOp = translateStencilOp (desc .stencilPassOp ); 593rs .reference = 0 ; 594rs .writeMask = 0xFF ; 595return rs ; 596} 597 598VkSamplerReductionMode VulkanUtil ::translateReductionOp (TextureReductionOp op ) 599{ 600switch (op ) 601 { 602case gfx::TextureReductionOp ::Minimum : 603return VK_SAMPLER_REDUCTION_MODE_MIN ; 604case gfx::TextureReductionOp ::Maximum : 605return VK_SAMPLER_REDUCTION_MODE_MAX ; 606default : 607return VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE ; 608 } 609} 610 611CooperativeVectorComponentType VulkanUtil ::translateCooperativeVectorComponentType ( 612VkComponentTypeKHR type ) 613{ 614switch (type ) 615 { 616case VK_COMPONENT_TYPE_FLOAT16_KHR : 617return CooperativeVectorComponentType ::Float16 ; 618case VK_COMPONENT_TYPE_FLOAT32_KHR : 619return CooperativeVectorComponentType ::Float32 ; 620case VK_COMPONENT_TYPE_FLOAT64_KHR : 621return CooperativeVectorComponentType ::Float64 ; 622case VK_COMPONENT_TYPE_SINT8_KHR : 623return CooperativeVectorComponentType ::SInt8 ; 624case VK_COMPONENT_TYPE_SINT16_KHR : 625return CooperativeVectorComponentType ::SInt16 ; 626case VK_COMPONENT_TYPE_SINT32_KHR : 627return CooperativeVectorComponentType ::SInt32 ; 628case VK_COMPONENT_TYPE_SINT64_KHR : 629return CooperativeVectorComponentType ::SInt64 ; 630case VK_COMPONENT_TYPE_UINT8_KHR : 631return CooperativeVectorComponentType ::UInt8 ; 632case VK_COMPONENT_TYPE_UINT16_KHR : 633return CooperativeVectorComponentType ::UInt16 ; 634case VK_COMPONENT_TYPE_UINT32_KHR : 635return CooperativeVectorComponentType ::UInt32 ; 636case VK_COMPONENT_TYPE_UINT64_KHR : 637return CooperativeVectorComponentType ::UInt64 ; 638case VK_COMPONENT_TYPE_SINT8_PACKED_NV : 639return CooperativeVectorComponentType ::SInt8Packed ; 640case VK_COMPONENT_TYPE_UINT8_PACKED_NV : 641return CooperativeVectorComponentType ::UInt8Packed ; 642case VK_COMPONENT_TYPE_FLOAT_E4M3_NV : 643return CooperativeVectorComponentType ::FloatE4M3 ; 644case VK_COMPONENT_TYPE_FLOAT_E5M2_NV : 645return CooperativeVectorComponentType ::FloatE5M2 ; 646default : 647return CooperativeVectorComponentType (0 ); 648 } 649} 650 651/* static */ Slang ::Result VulkanUtil ::handleFail (VkResult res ) 652{ 653if (res != VK_SUCCESS ) 654 { 655assert (!"Vulkan returned a failure" ); 656 } 657return toSlangResult (res ); 658} 659 660/* static */ void VulkanUtil ::checkFail (VkResult res ) 661{ 662assert (res != VK_SUCCESS ); 663assert (!"Vulkan check failed" ); 664} 665 666/* static */ VkPrimitiveTopology VulkanUtil ::getVkPrimitiveTopology (PrimitiveTopology topology ) 667{ 668switch (topology ) 669 { 670case PrimitiveTopology ::LineList : 671return VK_PRIMITIVE_TOPOLOGY_LINE_LIST ; 672case PrimitiveTopology ::LineStrip : 673return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP ; 674case PrimitiveTopology ::TriangleList : 675return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST ; 676case PrimitiveTopology ::TriangleStrip : 677return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP ; 678case PrimitiveTopology ::PointList : 679return VK_PRIMITIVE_TOPOLOGY_POINT_LIST ; 680default : 681break ; 682 } 683assert (!"Unknown topology" ); 684return VK_PRIMITIVE_TOPOLOGY_MAX_ENUM ; 685} 686 687VkImageLayout VulkanUtil ::mapResourceStateToLayout (ResourceState state ) 688{ 689switch (state ) 690 { 691case ResourceState ::Undefined : 692return VK_IMAGE_LAYOUT_UNDEFINED ; 693case ResourceState ::ShaderResource : 694case ResourceState ::PixelShaderResource : 695case ResourceState ::NonPixelShaderResource : 696return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL ; 697case ResourceState ::UnorderedAccess : 698return VK_IMAGE_LAYOUT_GENERAL ; 699case ResourceState ::RenderTarget : 700return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ; 701case ResourceState ::DepthRead : 702return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL ; 703case ResourceState ::DepthWrite : 704return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ; 705case ResourceState ::Present : 706return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ; 707case ResourceState ::CopySource : 708return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ; 709case ResourceState ::CopyDestination : 710return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ; 711case ResourceState ::ResolveSource : 712return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ; 713case ResourceState ::ResolveDestination : 714return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ; 715default : 716return VK_IMAGE_LAYOUT_UNDEFINED ; 717 } 718} 719 720Result AccelerationStructureBuildGeometryInfoBuilder ::build ( 721const IAccelerationStructure ::BuildInputs & buildInputs , 722IDebugCallback * debugCallback ) 723{ 724buildInfo .dstAccelerationStructure = VK_NULL_HANDLE ; 725switch (buildInputs .kind ) 726 { 727case IAccelerationStructure ::Kind ::BottomLevel : 728buildInfo .type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR ; 729break ; 730case IAccelerationStructure ::Kind ::TopLevel : 731buildInfo .type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR ; 732break ; 733default : 734debugCallback -> handleMessage ( 735DebugMessageType ::Error , 736DebugMessageSource ::Layer , 737"invalid value of IAccelerationStructure::Kind encountered in buildInputs.kind" ); 738return SLANG_E_INVALID_ARG ; 739 } 740if (buildInputs .flags & IAccelerationStructure ::BuildFlags ::Enum ::PerformUpdate ) 741 { 742buildInfo .mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR ; 743 } 744else 745 { 746buildInfo .mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR ; 747 } 748if (buildInputs .flags & IAccelerationStructure ::BuildFlags ::Enum ::AllowCompaction ) 749 { 750buildInfo .flags |=VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR ; 751 } 752if (buildInputs .flags & IAccelerationStructure ::BuildFlags ::Enum ::AllowUpdate ) 753 { 754buildInfo .flags |=VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR ; 755 } 756if (buildInputs .flags & IAccelerationStructure ::BuildFlags ::Enum ::MinimizeMemory ) 757 { 758buildInfo .flags |=VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR ; 759 } 760if (buildInputs .flags & IAccelerationStructure ::BuildFlags ::Enum ::PreferFastBuild ) 761 { 762buildInfo .flags |=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR ; 763 } 764if (buildInputs .flags & IAccelerationStructure ::BuildFlags ::Enum ::PreferFastTrace ) 765 { 766buildInfo .flags |=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR ; 767 } 768if (buildInputs .kind == IAccelerationStructure ::Kind ::BottomLevel ) 769 { 770m_geometryInfos .setCount (buildInputs .descCount ); 771primitiveCounts .setCount (buildInputs .descCount ); 772memset ( 773m_geometryInfos .getBuffer (), 7740 , 775sizeof (VkAccelerationStructureGeometryKHR )* buildInputs .descCount ); 776for (int i = 0 ;i < buildInputs .descCount ;i ++ ) 777 { 778auto & geomDesc = buildInputs .geometryDescs [i ]; 779m_geometryInfos [i ].sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR ; 780if (geomDesc .flags & IAccelerationStructure ::GeometryFlags ::NoDuplicateAnyHitInvocation ) 781 { 782m_geometryInfos [i ].flags |=VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR ; 783 } 784else if (geomDesc .flags & IAccelerationStructure ::GeometryFlags ::Opaque ) 785 { 786m_geometryInfos [i ].flags |=VK_GEOMETRY_OPAQUE_BIT_KHR ; 787 } 788auto & vkGeomData = m_geometryInfos [i ].geometry ; 789switch (geomDesc .type ) 790 { 791case IAccelerationStructure ::GeometryType ::Triangles : 792m_geometryInfos [i ].geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR ; 793vkGeomData .triangles .sType = 794VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR ; 795vkGeomData .triangles .vertexFormat = 796VulkanUtil ::getVkFormat (geomDesc .content .triangles .vertexFormat ); 797vkGeomData .triangles .vertexData .deviceAddress = 798geomDesc .content .triangles .vertexData ; 799vkGeomData .triangles .vertexStride = geomDesc .content .triangles .vertexStride ; 800vkGeomData .triangles .maxVertex = geomDesc .content .triangles .vertexCount - 1 ; 801switch (geomDesc .content .triangles .indexFormat ) 802 { 803case Format ::R32_UINT : 804vkGeomData .triangles .indexType = VK_INDEX_TYPE_UINT32 ; 805break ; 806case Format ::R16_UINT : 807vkGeomData .triangles .indexType = VK_INDEX_TYPE_UINT16 ; 808break ; 809case Format ::Unknown : 810vkGeomData .triangles .indexType = VK_INDEX_TYPE_NONE_KHR ; 811break ; 812default : 813debugCallback -> handleMessage ( 814DebugMessageType ::Error , 815DebugMessageSource ::Layer , 816"unsupported value of Format encountered in " 817"GeometryDesc::content.triangles.indexFormat" ); 818return SLANG_E_INVALID_ARG ; 819 } 820vkGeomData .triangles .indexData .deviceAddress = geomDesc .content .triangles .indexData ; 821vkGeomData .triangles .transformData .deviceAddress = 822geomDesc .content .triangles .transform3x4 ; 823primitiveCounts [i ]= Slang ::Math ::Max ( 824geomDesc .content .triangles .vertexCount , 825geomDesc .content .triangles .indexCount ) / 8263 ; 827break ; 828case IAccelerationStructure ::GeometryType ::ProcedurePrimitives : 829m_geometryInfos [i ].geometryType = VK_GEOMETRY_TYPE_AABBS_KHR ; 830vkGeomData .aabbs .sType = 831VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR ; 832vkGeomData .aabbs .data .deviceAddress = geomDesc .content .proceduralAABBs .data ; 833vkGeomData .aabbs .stride = geomDesc .content .proceduralAABBs .stride ; 834primitiveCounts [i ]= 835 (uint32_t )buildInputs .geometryDescs [i ].content .proceduralAABBs .count ; 836break ; 837default : 838debugCallback -> handleMessage ( 839DebugMessageType ::Error , 840DebugMessageSource ::Layer , 841"invalid value of IAccelerationStructure::GeometryType encountered in " 842"buildInputs.geometryDescs" ); 843return SLANG_E_INVALID_ARG ; 844 } 845 } 846buildInfo .geometryCount = buildInputs .descCount ; 847buildInfo .pGeometries = m_geometryInfos .getBuffer (); 848 } 849else 850 { 851m_vkInstanceInfo .geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR ; 852m_vkInstanceInfo .geometry .instances .sType = 853VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR ; 854m_vkInstanceInfo .geometry .instances .arrayOfPointers = 0 ; 855m_vkInstanceInfo .geometry .instances .data .deviceAddress = buildInputs .instanceDescs ; 856buildInfo .pGeometries = & m_vkInstanceInfo ; 857buildInfo .geometryCount = 1 ; 858primitiveCounts .setCount (1 ); 859primitiveCounts [0 ]= buildInputs .descCount ; 860 } 861return SLANG_OK ; 862} 863 864}// namespace gfx