yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
8f20632a0
master
1// vk-helper-functions.cpp 2#include "vk-helper-functions.h" 3 4#include "vk-device.h" 5#include "vk-util.h" 6 7namespace gfx 8{ 9 10using namespace Slang ; 11 12namespace vk 13{ 14 15Size calcRowSize (Format format ,int width ) 16{ 17FormatInfo sizeInfo ; 18gfxGetFormatInfo (format ,& sizeInfo ); 19return Size ( 20 (width + sizeInfo .blockWidth - 1 ) /sizeInfo .blockWidth * sizeInfo .blockSizeInBytes ); 21} 22 23GfxCount calcNumRows (Format format ,int height ) 24{ 25FormatInfo sizeInfo ; 26gfxGetFormatInfo (format ,& sizeInfo ); 27return (GfxCount )(height + sizeInfo .blockHeight - 1 ) /sizeInfo .blockHeight ; 28} 29 30VkAttachmentLoadOp translateLoadOp (IRenderPassLayout ::TargetLoadOp loadOp ) 31{ 32switch (loadOp ) 33 { 34case IRenderPassLayout ::TargetLoadOp ::Clear : 35return VK_ATTACHMENT_LOAD_OP_CLEAR ; 36case IRenderPassLayout ::TargetLoadOp ::Load : 37return VK_ATTACHMENT_LOAD_OP_LOAD ; 38default : 39return VK_ATTACHMENT_LOAD_OP_DONT_CARE ; 40 } 41} 42 43VkAttachmentStoreOp translateStoreOp (IRenderPassLayout ::TargetStoreOp storeOp ) 44{ 45switch (storeOp ) 46 { 47case IRenderPassLayout ::TargetStoreOp ::Store : 48return VK_ATTACHMENT_STORE_OP_STORE ; 49default : 50return VK_ATTACHMENT_STORE_OP_DONT_CARE ; 51 } 52} 53 54VkPipelineCreateFlags translateRayTracingPipelineFlags (RayTracingPipelineFlags ::Enum flags ) 55{ 56VkPipelineCreateFlags vkFlags = 0 ; 57if (flags & RayTracingPipelineFlags ::Enum ::SkipTriangles ) 58vkFlags |=VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR ; 59if (flags & RayTracingPipelineFlags ::Enum ::SkipProcedurals ) 60vkFlags |=VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR ; 61 62return vkFlags ; 63} 64 65uint32_t getMipLevelSize (uint32_t mipLevel ,uint32_t size ) 66{ 67return Math ::Max (1u , (size >>mipLevel )); 68} 69 70VkImageLayout translateImageLayout (ResourceState state ) 71{ 72switch (state ) 73 { 74case ResourceState ::Undefined : 75return VK_IMAGE_LAYOUT_UNDEFINED ; 76case ResourceState ::PreInitialized : 77return VK_IMAGE_LAYOUT_PREINITIALIZED ; 78case ResourceState ::UnorderedAccess : 79return VK_IMAGE_LAYOUT_GENERAL ; 80case ResourceState ::RenderTarget : 81return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ; 82case ResourceState ::DepthRead : 83return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL ; 84case ResourceState ::DepthWrite : 85return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ; 86case ResourceState ::ShaderResource : 87case ResourceState ::NonPixelShaderResource : 88case ResourceState ::PixelShaderResource : 89return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL ; 90case ResourceState ::ResolveDestination : 91case ResourceState ::CopyDestination : 92return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ; 93case ResourceState ::ResolveSource : 94case ResourceState ::CopySource : 95return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ; 96case ResourceState ::Present : 97return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ; 98default : 99assert (!"Unsupported" ); 100return VK_IMAGE_LAYOUT_UNDEFINED ; 101 } 102} 103 104VkAccessFlagBits calcAccessFlags (ResourceState state ) 105{ 106switch (state ) 107 { 108case ResourceState ::Undefined : 109case ResourceState ::Present : 110case ResourceState ::PreInitialized : 111return VkAccessFlagBits (0 ); 112case ResourceState ::VertexBuffer : 113return VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT ; 114case ResourceState ::ConstantBuffer : 115return VK_ACCESS_UNIFORM_READ_BIT ; 116case ResourceState ::IndexBuffer : 117return VK_ACCESS_INDEX_READ_BIT ; 118case ResourceState ::RenderTarget : 119return VkAccessFlagBits ( 120VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |VK_ACCESS_COLOR_ATTACHMENT_READ_BIT ); 121case ResourceState ::ShaderResource : 122case ResourceState ::NonPixelShaderResource : 123case ResourceState ::PixelShaderResource : 124return VK_ACCESS_INPUT_ATTACHMENT_READ_BIT ; 125case ResourceState ::UnorderedAccess : 126return VkAccessFlagBits (VK_ACCESS_SHADER_READ_BIT |VK_ACCESS_SHADER_WRITE_BIT ); 127case ResourceState ::DepthRead : 128return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT ; 129case ResourceState ::DepthWrite : 130return VkAccessFlagBits ( 131VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | 132VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT ); 133case ResourceState ::IndirectArgument : 134return VK_ACCESS_INDIRECT_COMMAND_READ_BIT ; 135case ResourceState ::ResolveDestination : 136case ResourceState ::CopyDestination : 137return VK_ACCESS_TRANSFER_WRITE_BIT ; 138case ResourceState ::ResolveSource : 139case ResourceState ::CopySource : 140return VK_ACCESS_TRANSFER_READ_BIT ; 141case ResourceState ::AccelerationStructure : 142return VkAccessFlagBits ( 143VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | 144VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR ); 145case ResourceState ::AccelerationStructureBuildInput : 146return VkAccessFlagBits (VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR ); 147case ResourceState ::General : 148return VkAccessFlagBits (VK_ACCESS_MEMORY_READ_BIT |VK_ACCESS_MEMORY_WRITE_BIT ); 149default : 150assert (!"Unsupported" ); 151return VkAccessFlagBits (0 ); 152 } 153} 154 155VkPipelineStageFlagBits calcPipelineStageFlags (ResourceState state ,bool src ) 156{ 157switch (state ) 158 { 159case ResourceState ::Undefined : 160case ResourceState ::PreInitialized : 161assert (src ); 162return VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ; 163case ResourceState ::VertexBuffer : 164case ResourceState ::IndexBuffer : 165return VK_PIPELINE_STAGE_VERTEX_INPUT_BIT ; 166case ResourceState ::ConstantBuffer : 167case ResourceState ::UnorderedAccess : 168return VkPipelineStageFlagBits ( 169VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | 170VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | 171VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | 172VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | 173VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR ); 174case ResourceState ::ShaderResource : 175case ResourceState ::NonPixelShaderResource : 176case ResourceState ::PixelShaderResource : 177return VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT ; 178case ResourceState ::RenderTarget : 179return VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT ; 180case ResourceState ::DepthRead : 181case ResourceState ::DepthWrite : 182return VkPipelineStageFlagBits ( 183VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT ); 184case ResourceState ::IndirectArgument : 185return VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT ; 186case ResourceState ::CopySource : 187case ResourceState ::CopyDestination : 188case ResourceState ::ResolveSource : 189case ResourceState ::ResolveDestination : 190return VK_PIPELINE_STAGE_TRANSFER_BIT ; 191case ResourceState ::Present : 192return src ?VkPipelineStageFlagBits ( 193VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT |VK_PIPELINE_STAGE_ALL_COMMANDS_BIT ) 194 :VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ; 195case ResourceState ::General : 196return VkPipelineStageFlagBits (VK_PIPELINE_STAGE_ALL_COMMANDS_BIT ); 197case ResourceState ::AccelerationStructure : 198return VkPipelineStageFlagBits ( 199VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | 200VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | 201VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | 202VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | 203VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR | 204VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR ); 205case ResourceState ::AccelerationStructureBuildInput : 206return VkPipelineStageFlagBits (VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR ); 207default : 208assert (!"Unsupported" ); 209return VkPipelineStageFlagBits (0 ); 210 } 211} 212 213VkAccessFlags translateAccelerationStructureAccessFlag (AccessFlag access ) 214{ 215VkAccessFlags result = 0 ; 216if ((uint32_t )access & (uint32_t )AccessFlag ::Read ) 217result |=VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR |VK_ACCESS_SHADER_READ_BIT ; 218if ((uint32_t )access & (uint32_t )AccessFlag ::Write ) 219result |=VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR ; 220return result ; 221} 222 223VkBufferUsageFlagBits _calcBufferUsageFlags (ResourceState state ) 224{ 225switch (state ) 226 { 227case ResourceState ::VertexBuffer : 228return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT ; 229case ResourceState ::IndexBuffer : 230return VK_BUFFER_USAGE_INDEX_BUFFER_BIT ; 231case ResourceState ::ConstantBuffer : 232return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT ; 233case ResourceState ::StreamOutput : 234return VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT ; 235case ResourceState ::RenderTarget : 236case ResourceState ::DepthRead : 237case ResourceState ::DepthWrite : 238 { 239assert (!"Invalid resource state for buffer resource." ); 240return VkBufferUsageFlagBits (0 ); 241 } 242case ResourceState ::UnorderedAccess : 243return (VkBufferUsageFlagBits )(VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | 244VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ); 245case ResourceState ::ShaderResource : 246case ResourceState ::NonPixelShaderResource : 247case ResourceState ::PixelShaderResource : 248return (VkBufferUsageFlagBits )(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | 249VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ); 250case ResourceState ::CopySource : 251return VK_BUFFER_USAGE_TRANSFER_SRC_BIT ; 252case ResourceState ::CopyDestination : 253return VK_BUFFER_USAGE_TRANSFER_DST_BIT ; 254case ResourceState ::AccelerationStructure : 255return VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ; 256case ResourceState ::IndirectArgument : 257return VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT ; 258case ResourceState ::AccelerationStructureBuildInput : 259return VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR ; 260default : 261return VkBufferUsageFlagBits (0 ); 262 } 263} 264 265VkBufferUsageFlagBits _calcBufferUsageFlags (ResourceStateSet states ) 266{ 267int dstFlags = 0 ; 268for (uint32_t i = 0 ;i < (uint32_t )ResourceState ::_Count ;i ++ ) 269 { 270auto state = (ResourceState )i ; 271if (states .contains (state )) 272dstFlags |=_calcBufferUsageFlags (state ); 273 } 274return VkBufferUsageFlagBits (dstFlags ); 275} 276 277VkImageUsageFlagBits _calcImageUsageFlags (ResourceState state ) 278{ 279switch (state ) 280 { 281case ResourceState ::RenderTarget : 282return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT ; 283case ResourceState ::DepthWrite : 284return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ; 285case ResourceState ::DepthRead : 286return VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT ; 287case ResourceState ::ShaderResource : 288case ResourceState ::NonPixelShaderResource : 289case ResourceState ::PixelShaderResource : 290return VK_IMAGE_USAGE_SAMPLED_BIT ; 291case ResourceState ::UnorderedAccess : 292return VK_IMAGE_USAGE_STORAGE_BIT ; 293case ResourceState ::CopySource : 294return VK_IMAGE_USAGE_TRANSFER_SRC_BIT ; 295case ResourceState ::CopyDestination : 296return VK_IMAGE_USAGE_TRANSFER_DST_BIT ; 297case ResourceState ::ResolveSource : 298return VK_IMAGE_USAGE_TRANSFER_SRC_BIT ; 299case ResourceState ::ResolveDestination : 300return VK_IMAGE_USAGE_TRANSFER_DST_BIT ; 301case ResourceState ::Present : 302return VK_IMAGE_USAGE_TRANSFER_SRC_BIT ; 303case ResourceState ::Undefined : 304case ResourceState ::General : 305return (VkImageUsageFlagBits )0 ; 306default : 307 { 308assert (!"Unsupported" ); 309return VkImageUsageFlagBits (0 ); 310 } 311 } 312} 313 314VkImageViewType _calcImageViewType (ITextureResource ::Type type ,const ITextureResource ::Desc & desc ) 315{ 316switch (type ) 317 { 318case IResource ::Type ::Texture1D : 319return desc .arraySize > 1 ?VK_IMAGE_VIEW_TYPE_1D_ARRAY :VK_IMAGE_VIEW_TYPE_1D ; 320case IResource ::Type ::Texture2D : 321return desc .arraySize > 1 ?VK_IMAGE_VIEW_TYPE_2D_ARRAY :VK_IMAGE_VIEW_TYPE_2D ; 322case IResource ::Type ::TextureCube : 323return desc .arraySize > 1 ?VK_IMAGE_VIEW_TYPE_CUBE_ARRAY :VK_IMAGE_VIEW_TYPE_CUBE ; 324case IResource ::Type ::Texture3D : 325 { 326// Can't have an array and 3d texture 327assert (desc .arraySize <=1 ); 328if (desc .arraySize <=1 ) 329 { 330return VK_IMAGE_VIEW_TYPE_3D ; 331 } 332break ; 333 } 334default : 335break ; 336 } 337 338return VK_IMAGE_VIEW_TYPE_MAX_ENUM ; 339} 340 341VkImageUsageFlagBits _calcImageUsageFlags (ResourceStateSet states ) 342{ 343int dstFlags = 0 ; 344for (uint32_t i = 0 ;i < (uint32_t )ResourceState ::_Count ;i ++ ) 345 { 346auto state = (ResourceState )i ; 347if (states .contains (state )) 348dstFlags |=_calcImageUsageFlags (state ); 349 } 350return VkImageUsageFlagBits (dstFlags ); 351} 352 353VkImageUsageFlags _calcImageUsageFlags ( 354ResourceStateSet states , 355MemoryType memoryType , 356const void * initData ) 357{ 358VkImageUsageFlags usage = _calcImageUsageFlags (states ); 359 360if (memoryType == MemoryType ::Upload || initData ) 361 { 362usage |=VK_IMAGE_USAGE_TRANSFER_DST_BIT ; 363 } 364 365return usage ; 366} 367 368VkAccessFlags calcAccessFlagsFromImageLayout (VkImageLayout layout ) 369{ 370switch (layout ) 371 { 372case VK_IMAGE_LAYOUT_UNDEFINED : 373case VK_IMAGE_LAYOUT_GENERAL : 374case VK_IMAGE_LAYOUT_PREINITIALIZED : 375case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : 376return (VK_ACCESS_MEMORY_READ_BIT |VK_ACCESS_MEMORY_WRITE_BIT ); 377case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : 378return (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT ); 379case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : 380case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL : 381case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL : 382case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL : 383case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL : 384return ( 385VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | 386VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT ); 387case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : 388case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL : 389case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL : 390return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT ; 391case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : 392return VK_ACCESS_SHADER_READ_BIT ; 393case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL : 394return VK_ACCESS_TRANSFER_READ_BIT ; 395case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL : 396return VK_ACCESS_TRANSFER_WRITE_BIT ; 397default : 398assert (!"Unsupported VkImageLayout" ); 399return (VK_ACCESS_MEMORY_READ_BIT |VK_ACCESS_MEMORY_WRITE_BIT ); 400 } 401} 402 403VkPipelineStageFlags calcPipelineStageFlagsFromImageLayout (VkImageLayout layout ) 404{ 405switch (layout ) 406 { 407case VK_IMAGE_LAYOUT_UNDEFINED : 408case VK_IMAGE_LAYOUT_PREINITIALIZED : 409case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : 410case VK_IMAGE_LAYOUT_GENERAL : 411return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT ; 412case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : 413return VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT ; 414case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : 415return (VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT |VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ); 416case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL : 417return VK_PIPELINE_STAGE_TRANSFER_BIT ; 418case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL : 419return VK_PIPELINE_STAGE_TRANSFER_BIT ; 420case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : 421case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : 422case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL : 423case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL : 424case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL : 425case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL : 426case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL : 427case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL : 428return ( 429VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT ); 430default : 431assert (!"Unsupported VkImageLayout" ); 432return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT ; 433 } 434} 435 436VkImageAspectFlags getAspectMaskFromFormat (VkFormat format ) 437{ 438switch (format ) 439 { 440case VK_FORMAT_D16_UNORM_S8_UINT : 441case VK_FORMAT_D24_UNORM_S8_UINT : 442case VK_FORMAT_D32_SFLOAT_S8_UINT : 443return VK_IMAGE_ASPECT_DEPTH_BIT |VK_IMAGE_ASPECT_STENCIL_BIT ; 444case VK_FORMAT_D16_UNORM : 445case VK_FORMAT_D32_SFLOAT : 446case VK_FORMAT_X8_D24_UNORM_PACK32 : 447return VK_IMAGE_ASPECT_DEPTH_BIT ; 448case VK_FORMAT_S8_UINT : 449return VK_IMAGE_ASPECT_STENCIL_BIT ; 450default : 451return VK_IMAGE_ASPECT_COLOR_BIT ; 452 } 453} 454 455AdapterLUID getAdapterLUID (VulkanApi api ,VkPhysicalDevice physicalDevice ) 456{ 457AdapterLUID luid = {}; 458 459VkPhysicalDeviceIDPropertiesKHR idProps = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR }; 460VkPhysicalDeviceProperties2 props = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 }; 461props .pNext = & idProps ; 462SLANG_ASSERT (api .vkGetPhysicalDeviceFeatures2 ); 463api .vkGetPhysicalDeviceProperties2 (physicalDevice ,& props ); 464if (idProps .deviceLUIDValid ) 465 { 466SLANG_ASSERT (sizeof (AdapterLUID ) >=VK_LUID_SIZE ); 467memcpy (& luid ,idProps .deviceLUID ,VK_LUID_SIZE ); 468 } 469else 470 { 471SLANG_ASSERT (sizeof (AdapterLUID ) >=VK_UUID_SIZE ); 472memcpy (& luid ,idProps .deviceUUID ,VK_UUID_SIZE ); 473 } 474 475return luid ; 476} 477 478}// namespace vk 479 480Result SLANG_MCALL getVKAdapters (List < AdapterInfo >& outAdapters ) 481{ 482for (int forceSoftware = 0 ;forceSoftware <=1 ;forceSoftware ++ ) 483 { 484VulkanModule module ; 485if (module .init (forceSoftware != 0 )!= SLANG_OK ) 486continue ; 487VulkanApi api ; 488if (api .initGlobalProcs (module )!= SLANG_OK ) 489continue ; 490 491VkInstanceCreateInfo instanceCreateInfo = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO }; 492const char * instanceExtensions []= { 493VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME , 494#if SLANG_APPLE_FAMILY 495VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME , 496#endif 497 }; 498instanceCreateInfo .enabledExtensionCount = SLANG_COUNT_OF (instanceExtensions ); 499instanceCreateInfo .ppEnabledExtensionNames = & instanceExtensions [0 ]; 500#if SLANG_APPLE_FAMILY 501instanceCreateInfo .flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR ; 502#endif 503VkInstance instance ; 504SLANG_VK_RETURN_ON_FAIL (api .vkCreateInstance (& instanceCreateInfo ,nullptr ,& instance )); 505 506// This will fail due to not loading any extensions. 507api .initInstanceProcs (instance ); 508 509// Make sure required functions for enumerating physical devices were loaded. 510if (api .vkEnumeratePhysicalDevices || api .vkGetPhysicalDeviceProperties ) 511 { 512uint32_t numPhysicalDevices = 0 ; 513SLANG_VK_RETURN_ON_FAIL ( 514api .vkEnumeratePhysicalDevices (instance ,& numPhysicalDevices ,nullptr )); 515 516List < VkPhysicalDevice > physicalDevices ; 517physicalDevices .setCount (numPhysicalDevices ); 518SLANG_VK_RETURN_ON_FAIL (api .vkEnumeratePhysicalDevices ( 519instance , 520& numPhysicalDevices , 521physicalDevices .getBuffer ())); 522 523for (const auto & physicalDevice :physicalDevices ) 524 { 525VkPhysicalDeviceProperties props ; 526api .vkGetPhysicalDeviceProperties (physicalDevice ,& props ); 527AdapterInfo info = {}; 528memcpy ( 529info .name , 530props .deviceName , 531Math ::Min (strlen (props .deviceName ),sizeof (AdapterInfo ::name )- 1 )); 532info .vendorID = props .vendorID ; 533info .deviceID = props .deviceID ; 534info .luid = vk::getAdapterLUID (api ,physicalDevice ); 535outAdapters .add (info ); 536 } 537 } 538 539api .vkDestroyInstance (instance ,nullptr ); 540module .destroy (); 541 } 542 543return SLANG_OK ; 544} 545 546Result SLANG_MCALL createVKDevice (const IDevice ::Desc * desc ,IDevice ** outRenderer ) 547{ 548RefPtr < vk::DeviceImpl > result = new vk::DeviceImpl (); 549SLANG_RETURN_ON_FAIL (result -> initialize (* desc )); 550returnComPtr (outRenderer ,result ); 551return SLANG_OK ; 552} 553 554}// namespace gfx