yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
8f20632a0
master
1// d3d12-helper-functions.cpp 2#include "d3d12-helper-functions.h" 3 4#ifdef GFX_NVAPI 5#include "../nvapi/nvapi-include.h" 6#endif 7 8#include "../nvapi/nvapi-util.h" 9#include "d3d12-buffer.h" 10#include "d3d12-query.h" 11#include "d3d12-transient-heap.h" 12 13namespace gfx 14{ 15using namespace Slang ; 16 17namespace d3d12 18{ 19 20bool isSupportedNVAPIOp (ID3D12Device * dev ,uint32_t op ) 21{ 22#ifdef GFX_NVAPI 23 { 24bool isSupported ; 25NvAPI_Status status = 26NvAPI_D3D12_IsNvShaderExtnOpCodeSupported (dev ,NvU32 (op ),& isSupported ); 27return status == NVAPI_OK && isSupported ; 28 } 29#else 30return false; 31#endif 32} 33 34D3D12_RESOURCE_FLAGS calcResourceFlag (ResourceState state ) 35{ 36switch (state ) 37 { 38case ResourceState ::RenderTarget : 39return D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET ; 40case ResourceState ::DepthRead : 41case ResourceState ::DepthWrite : 42return D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ; 43case ResourceState ::UnorderedAccess : 44case ResourceState ::AccelerationStructure : 45return D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS ; 46default : 47return D3D12_RESOURCE_FLAG_NONE ; 48 } 49} 50 51D3D12_RESOURCE_FLAGS calcResourceFlags (ResourceStateSet states ) 52{ 53int dstFlags = 0 ; 54for (uint32_t i = 0 ;i < (uint32_t )ResourceState ::_Count ;i ++ ) 55 { 56auto state = (ResourceState )i ; 57if (states .contains (state )) 58dstFlags |=calcResourceFlag (state ); 59 } 60return (D3D12_RESOURCE_FLAGS )dstFlags ; 61} 62 63D3D12_RESOURCE_DIMENSION calcResourceDimension (IResource ::Type type ) 64{ 65switch (type ) 66 { 67case IResource ::Type ::Buffer : 68return D3D12_RESOURCE_DIMENSION_BUFFER ; 69case IResource ::Type ::Texture1D : 70return D3D12_RESOURCE_DIMENSION_TEXTURE1D ; 71case IResource ::Type ::TextureCube : 72case IResource ::Type ::Texture2D : 73 { 74return D3D12_RESOURCE_DIMENSION_TEXTURE2D ; 75 } 76case IResource ::Type ::Texture3D : 77return D3D12_RESOURCE_DIMENSION_TEXTURE3D ; 78default : 79return D3D12_RESOURCE_DIMENSION_UNKNOWN ; 80 } 81} 82 83DXGI_FORMAT getTypelessFormatFromDepthFormat (Format format ) 84{ 85switch (format ) 86 { 87case Format ::D16_UNORM : 88return DXGI_FORMAT_R16_TYPELESS ; 89case Format ::D32_FLOAT : 90return DXGI_FORMAT_R32_TYPELESS ; 91case Format ::D32_FLOAT_S8_UINT : 92return DXGI_FORMAT_R32G8X24_TYPELESS ; 93// case Format::D24_UNORM_S8_UINT: 94// return DXGI_FORMAT_R24G8_TYPELESS; 95default : 96return D3DUtil ::getMapFormat (format ); 97 } 98} 99 100bool isTypelessDepthFormat (DXGI_FORMAT format ) 101{ 102switch (format ) 103 { 104case DXGI_FORMAT_R16_TYPELESS : 105case DXGI_FORMAT_R32_TYPELESS : 106case DXGI_FORMAT_R32G8X24_TYPELESS : 107case DXGI_FORMAT_R24G8_TYPELESS : 108return true; 109default : 110return false; 111 } 112} 113 114D3D12_FILTER_TYPE translateFilterMode (TextureFilteringMode mode ) 115{ 116switch (mode ) 117 { 118default : 119return D3D12_FILTER_TYPE (0 ); 120 121#define CASE (SRC ,DST ) \ 122 case TextureFilteringMode::SRC: \ 123 return D3D12_FILTER_TYPE_##DST 124 125CASE (Point ,POINT ); 126CASE (Linear ,LINEAR ); 127 128#undef CASE 129 } 130} 131 132D3D12_FILTER_REDUCTION_TYPE translateFilterReduction (TextureReductionOp op ) 133{ 134switch (op ) 135 { 136default : 137return D3D12_FILTER_REDUCTION_TYPE (0 ); 138 139#define CASE (SRC ,DST ) \ 140 case TextureReductionOp::SRC: \ 141 return D3D12_FILTER_REDUCTION_TYPE_##DST 142 143CASE (Average ,STANDARD ); 144CASE (Comparison ,COMPARISON ); 145CASE (Minimum ,MINIMUM ); 146CASE (Maximum ,MAXIMUM ); 147 148#undef CASE 149 } 150} 151 152D3D12_TEXTURE_ADDRESS_MODE translateAddressingMode (TextureAddressingMode mode ) 153{ 154switch (mode ) 155 { 156default : 157return D3D12_TEXTURE_ADDRESS_MODE (0 ); 158 159#define CASE (SRC ,DST ) \ 160 case TextureAddressingMode::SRC: \ 161 return D3D12_TEXTURE_ADDRESS_MODE_##DST 162 163CASE (Wrap ,WRAP ); 164CASE (ClampToEdge ,CLAMP ); 165CASE (ClampToBorder ,BORDER ); 166CASE (MirrorRepeat ,MIRROR ); 167CASE (MirrorOnce ,MIRROR_ONCE ); 168 169#undef CASE 170 } 171} 172 173D3D12_COMPARISON_FUNC translateComparisonFunc (ComparisonFunc func ) 174{ 175switch (func ) 176 { 177default : 178// TODO: need to report failures 179return D3D12_COMPARISON_FUNC_ALWAYS ; 180 181#define CASE (FROM ,TO ) \ 182 case ComparisonFunc::FROM: \ 183 return D3D12_COMPARISON_FUNC_##TO 184 185CASE (Never ,NEVER ); 186CASE (Less ,LESS ); 187CASE (Equal ,EQUAL ); 188CASE (LessEqual ,LESS_EQUAL ); 189CASE (Greater ,GREATER ); 190CASE (NotEqual ,NOT_EQUAL ); 191CASE (GreaterEqual ,GREATER_EQUAL ); 192CASE (Always ,ALWAYS ); 193#undef CASE 194 } 195} 196 197uint32_t getViewDescriptorCount (const ITransientResourceHeap ::Desc & desc ) 198{ 199return Math ::Max ( 200Math ::Max ( 201desc .srvDescriptorCount , 202desc .uavDescriptorCount , 203desc .accelerationStructureDescriptorCount ), 204desc .constantBufferDescriptorCount , 2052048 ); 206} 207 208void initSrvDesc ( 209IResource ::Type resourceType , 210const ITextureResource ::Desc & textureDesc , 211const D3D12_RESOURCE_DESC & desc , 212DXGI_FORMAT pixelFormat , 213SubresourceRange subresourceRange , 214D3D12_SHADER_RESOURCE_VIEW_DESC & descOut ) 215{ 216// create SRV 217descOut = D3D12_SHADER_RESOURCE_VIEW_DESC (); 218 219descOut .Format = (pixelFormat == DXGI_FORMAT_UNKNOWN ) 220 ?D3DUtil ::calcFormat (D3DUtil ::USAGE_SRV ,desc .Format ) 221 :pixelFormat ; 222descOut .Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING ; 223if (desc .DepthOrArraySize == 1 ) 224 { 225switch (desc .Dimension ) 226 { 227case D3D12_RESOURCE_DIMENSION_TEXTURE1D : 228descOut .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D ; 229descOut .Texture1D .MipLevels = subresourceRange .mipLevelCount == 0 230 ?desc .MipLevels - subresourceRange .mipLevel 231 :subresourceRange .mipLevelCount ; 232descOut .Texture1D .MostDetailedMip = subresourceRange .mipLevel ; 233break ; 234case D3D12_RESOURCE_DIMENSION_TEXTURE2D : 235descOut .ViewDimension = textureDesc .sampleDesc .numSamples > 1 236 ?D3D12_SRV_DIMENSION_TEXTURE2DMS 237 :D3D12_SRV_DIMENSION_TEXTURE2D ; 238descOut .Texture2D .PlaneSlice = 239D3DUtil ::getPlaneSlice (descOut .Format ,subresourceRange .aspectMask ); 240descOut .Texture2D .ResourceMinLODClamp = 0.0f ; 241descOut .Texture2D .MipLevels = subresourceRange .mipLevelCount == 0 242 ?desc .MipLevels - subresourceRange .mipLevel 243 :subresourceRange .mipLevelCount ; 244descOut .Texture2D .MostDetailedMip = subresourceRange .mipLevel ; 245break ; 246case D3D12_RESOURCE_DIMENSION_TEXTURE3D : 247descOut .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D ; 248descOut .Texture3D .MipLevels = subresourceRange .mipLevelCount == 0 249 ?desc .MipLevels - subresourceRange .mipLevel 250 :subresourceRange .mipLevelCount ; 251descOut .Texture3D .MostDetailedMip = subresourceRange .mipLevel ; 252break ; 253default : 254assert (!"Unknown dimension" ); 255 } 256 } 257else if (resourceType == IResource ::Type ::TextureCube ) 258 { 259if (textureDesc .arraySize > 1 ) 260 { 261descOut .ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY ; 262 263descOut .TextureCubeArray .NumCubes = subresourceRange .layerCount == 0 264 ?textureDesc .arraySize 265 :subresourceRange .layerCount /6 ; 266descOut .TextureCubeArray .First2DArrayFace = subresourceRange .baseArrayLayer ; 267descOut .TextureCubeArray .MipLevels = subresourceRange .mipLevelCount == 0 268 ?desc .MipLevels - subresourceRange .mipLevel 269 :subresourceRange .mipLevelCount ; 270descOut .TextureCubeArray .MostDetailedMip = subresourceRange .mipLevel ; 271descOut .TextureCubeArray .ResourceMinLODClamp = 0 ; 272 } 273else 274 { 275descOut .ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE ; 276 277descOut .TextureCube .MipLevels = subresourceRange .mipLevelCount == 0 278 ?desc .MipLevels - subresourceRange .mipLevel 279 :subresourceRange .mipLevelCount ; 280descOut .TextureCube .MostDetailedMip = subresourceRange .mipLevel ; 281descOut .TextureCube .ResourceMinLODClamp = 0 ; 282 } 283 } 284else 285 { 286assert (desc .DepthOrArraySize > 1 ); 287 288switch (desc .Dimension ) 289 { 290case D3D12_RESOURCE_DIMENSION_TEXTURE1D : 291descOut .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY ; 292descOut .Texture1D .MostDetailedMip = subresourceRange .mipLevel ; 293descOut .Texture1D .MipLevels = subresourceRange .mipLevelCount == 0 294 ?desc .MipLevels 295 :subresourceRange .mipLevelCount ; 296descOut .Texture1DArray .ArraySize = subresourceRange .layerCount == 0 297 ?desc .DepthOrArraySize 298 :subresourceRange .layerCount ; 299descOut .Texture1DArray .FirstArraySlice = subresourceRange .baseArrayLayer ; 300descOut .Texture1DArray .ResourceMinLODClamp = 0 ; 301descOut .Texture1DArray .MostDetailedMip = subresourceRange .mipLevel ; 302descOut .Texture1DArray .MipLevels = subresourceRange .mipLevelCount == 0 303 ?desc .MipLevels - subresourceRange .mipLevel 304 :subresourceRange .mipLevelCount ; 305break ; 306case D3D12_RESOURCE_DIMENSION_TEXTURE2D : 307descOut .ViewDimension = textureDesc .sampleDesc .numSamples > 1 308 ?D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY 309 :D3D12_SRV_DIMENSION_TEXTURE2DARRAY ; 310if (descOut .ViewDimension == D3D12_SRV_DIMENSION_TEXTURE2DARRAY ) 311 { 312descOut .Texture2DArray .ArraySize = subresourceRange .layerCount == 0 313 ?desc .DepthOrArraySize 314 :subresourceRange .layerCount ; 315descOut .Texture2DArray .FirstArraySlice = subresourceRange .baseArrayLayer ; 316descOut .Texture2DArray .PlaneSlice = 317D3DUtil ::getPlaneSlice (descOut .Format ,subresourceRange .aspectMask ); 318descOut .Texture2DArray .ResourceMinLODClamp = 0 ; 319descOut .Texture2DArray .MostDetailedMip = subresourceRange .mipLevel ; 320descOut .Texture2DArray .MipLevels = subresourceRange .mipLevelCount == 0 321 ?desc .MipLevels - subresourceRange .mipLevel 322 :subresourceRange .mipLevelCount ; 323 } 324else 325 { 326assert (descOut .ViewDimension == D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY ); 327descOut .Texture2DMSArray .FirstArraySlice = subresourceRange .baseArrayLayer ; 328descOut .Texture2DMSArray .ArraySize = subresourceRange .layerCount == 0 329 ?desc .DepthOrArraySize 330 :subresourceRange .layerCount ; 331 } 332 333break ; 334case D3D12_RESOURCE_DIMENSION_TEXTURE3D : 335descOut .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D ; 336descOut .Texture3D .MostDetailedMip = subresourceRange .mipLevel ; 337descOut .Texture3D .MipLevels = subresourceRange .mipLevelCount == 0 338 ?desc .MipLevels 339 :subresourceRange .mipLevelCount ; 340break ; 341 342default : 343assert (!"Unknown dimension" ); 344 } 345 } 346} 347 348Result initTextureResourceDesc ( 349D3D12_RESOURCE_DESC & resourceDesc , 350const ITextureResource ::Desc & srcDesc ) 351{ 352const DXGI_FORMAT pixelFormat = D3DUtil ::getMapFormat (srcDesc .format ); 353if (pixelFormat == DXGI_FORMAT_UNKNOWN ) 354 { 355return SLANG_FAIL ; 356 } 357 358const int arraySize = calcEffectiveArraySize (srcDesc ); 359 360const D3D12_RESOURCE_DIMENSION dimension = calcResourceDimension (srcDesc .type ); 361if (dimension == D3D12_RESOURCE_DIMENSION_UNKNOWN ) 362 { 363return SLANG_FAIL ; 364 } 365 366const int numMipMaps = srcDesc .numMipLevels ; 367resourceDesc .Dimension = dimension ; 368resourceDesc .Format = pixelFormat ; 369resourceDesc .Width = srcDesc .size .width ; 370resourceDesc .Height = srcDesc .size .height ; 371resourceDesc .DepthOrArraySize = (srcDesc .size .depth > 1 ) ?srcDesc .size .depth :arraySize ; 372 373resourceDesc .MipLevels = numMipMaps ; 374resourceDesc .SampleDesc .Count = srcDesc .sampleDesc .numSamples ; 375resourceDesc .SampleDesc .Quality = srcDesc .sampleDesc .quality ; 376 377resourceDesc .Flags = D3D12_RESOURCE_FLAG_NONE ; 378resourceDesc .Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN ; 379 380resourceDesc .Flags |=calcResourceFlags (srcDesc .allowedStates ); 381 382resourceDesc .Alignment = 0 ; 383 384if (isDepthFormat (srcDesc .format )&& 385 (srcDesc .allowedStates .contains (ResourceState ::ShaderResource )|| 386srcDesc .allowedStates .contains (ResourceState ::UnorderedAccess ))) 387 { 388resourceDesc .Format = getTypelessFormatFromDepthFormat (srcDesc .format ); 389 } 390 391return SLANG_OK ; 392} 393 394void initBufferResourceDesc (Size bufferSize ,D3D12_RESOURCE_DESC & out ) 395{ 396out = {}; 397 398out .Dimension = D3D12_RESOURCE_DIMENSION_BUFFER ; 399out .Alignment = 0 ; 400out .Width = bufferSize ; 401out .Height = 1 ; 402out .DepthOrArraySize = 1 ; 403out .MipLevels = 1 ; 404out .Format = DXGI_FORMAT_UNKNOWN ; 405out .SampleDesc .Count = 1 ; 406out .SampleDesc .Quality = 0 ; 407out .Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR ; 408out .Flags = D3D12_RESOURCE_FLAG_NONE ; 409} 410 411Result uploadBufferDataImpl ( 412ID3D12Device * device , 413ID3D12GraphicsCommandList * cmdList , 414TransientResourceHeapImpl * transientHeap , 415BufferResourceImpl * buffer , 416Offset offset , 417Size size , 418void * data ) 419{ 420IBufferResource * uploadResource ; 421Offset uploadResourceOffset = 0 ; 422if (buffer -> getDesc ()-> memoryType != MemoryType ::Upload ) 423 { 424SLANG_RETURN_ON_FAIL (transientHeap -> allocateStagingBuffer ( 425size , 426uploadResource , 427uploadResourceOffset , 428MemoryType ::Upload )); 429 } 430else 431 { 432uploadResourceOffset = offset ; 433 } 434D3D12Resource & uploadResourceRef = 435 (buffer -> getDesc ()-> memoryType == MemoryType ::Upload ) 436 ?buffer -> m_resource 437 :static_cast < BufferResourceImpl *> (uploadResource )-> m_resource ; 438 439D3D12_RANGE readRange = {}; 440readRange .Begin = 0 ; 441readRange .End = 0 ; 442void * uploadData ; 443SLANG_RETURN_ON_FAIL ( 444uploadResourceRef .getResource ()-> Map (0 ,& readRange ,reinterpret_cast < void **> (& uploadData ))); 445memcpy ((uint8_t * )uploadData + uploadResourceOffset ,data ,size ); 446D3D12_RANGE writtenRange = {}; 447writtenRange .Begin = uploadResourceOffset ; 448writtenRange .End = uploadResourceOffset + size ; 449uploadResourceRef .getResource ()-> Unmap (0 ,& writtenRange ); 450 451if (buffer -> getDesc ()-> memoryType != MemoryType ::Upload ) 452 { 453cmdList -> CopyBufferRegion ( 454buffer -> m_resource .getResource (), 455offset , 456uploadResourceRef .getResource (), 457uploadResourceOffset , 458size ); 459 } 460 461return SLANG_OK ; 462} 463 464Result createNullDescriptor ( 465ID3D12Device * d3dDevice , 466D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor , 467const ShaderObjectLayoutImpl ::BindingRangeInfo & bindingRange ) 468{ 469switch (bindingRange .bindingType ) 470 { 471case slang::BindingType ::ConstantBuffer : 472 { 473D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; 474cbvDesc .BufferLocation = 0 ; 475cbvDesc .SizeInBytes = 0 ; 476d3dDevice -> CreateConstantBufferView (& cbvDesc ,destDescriptor ); 477 } 478break ; 479case slang::BindingType ::MutableRawBuffer : 480 { 481D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; 482uavDesc .ViewDimension = D3D12_UAV_DIMENSION_BUFFER ; 483uavDesc .Buffer .Flags = D3D12_BUFFER_UAV_FLAG_RAW ; 484uavDesc .Format = DXGI_FORMAT_R32_TYPELESS ; 485d3dDevice -> CreateUnorderedAccessView (nullptr ,nullptr ,& uavDesc ,destDescriptor ); 486 } 487break ; 488case slang::BindingType ::MutableTypedBuffer : 489 { 490D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; 491uavDesc .ViewDimension = D3D12_UAV_DIMENSION_BUFFER ; 492uavDesc .Format = DXGI_FORMAT_R8G8B8A8_UNORM ; 493d3dDevice -> CreateUnorderedAccessView (nullptr ,nullptr ,& uavDesc ,destDescriptor ); 494 } 495break ; 496case slang::BindingType ::RawBuffer : 497 { 498D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; 499srvDesc .ViewDimension = D3D12_SRV_DIMENSION_BUFFER ; 500srvDesc .Buffer .Flags = D3D12_BUFFER_SRV_FLAG_RAW ; 501srvDesc .Format = DXGI_FORMAT_R32_TYPELESS ; 502srvDesc .Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING ; 503d3dDevice -> CreateShaderResourceView (nullptr ,& srvDesc ,destDescriptor ); 504 } 505break ; 506case slang::BindingType ::TypedBuffer : 507 { 508D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; 509srvDesc .ViewDimension = D3D12_SRV_DIMENSION_BUFFER ; 510srvDesc .Format = DXGI_FORMAT_R8G8B8A8_UNORM ; 511srvDesc .Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING ; 512d3dDevice -> CreateShaderResourceView (nullptr ,& srvDesc ,destDescriptor ); 513 } 514break ; 515case slang::BindingType ::Texture : 516 { 517D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; 518srvDesc .Format = DXGI_FORMAT_R8G8B8A8_UNORM ; 519srvDesc .Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING ; 520switch (bindingRange .resourceShape ) 521 { 522case SLANG_TEXTURE_1D : 523srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D ; 524break ; 525case SLANG_TEXTURE_1D_ARRAY : 526srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY ; 527break ; 528case SLANG_TEXTURE_2D : 529srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D ; 530break ; 531case SLANG_TEXTURE_2D_ARRAY : 532srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY ; 533break ; 534case SLANG_TEXTURE_3D : 535srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D ; 536break ; 537case SLANG_TEXTURE_CUBE : 538srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE ; 539break ; 540case SLANG_TEXTURE_CUBE_ARRAY : 541srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY ; 542break ; 543case SLANG_TEXTURE_2D_MULTISAMPLE : 544srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS ; 545break ; 546case SLANG_TEXTURE_2D_MULTISAMPLE_ARRAY : 547srvDesc .ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY ; 548break ; 549default : 550return SLANG_OK ; 551 } 552d3dDevice -> CreateShaderResourceView (nullptr ,& srvDesc ,destDescriptor ); 553 } 554break ; 555case slang::BindingType ::MutableTexture : 556 { 557D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; 558uavDesc .Format = DXGI_FORMAT_R8G8B8A8_UNORM ; 559switch (bindingRange .resourceShape ) 560 { 561case SLANG_TEXTURE_1D : 562uavDesc .ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D ; 563break ; 564case SLANG_TEXTURE_1D_ARRAY : 565uavDesc .ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1DARRAY ; 566break ; 567case SLANG_TEXTURE_2D : 568uavDesc .ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D ; 569break ; 570case SLANG_TEXTURE_2D_ARRAY : 571uavDesc .ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY ; 572break ; 573case SLANG_TEXTURE_3D : 574uavDesc .ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D ; 575break ; 576case SLANG_TEXTURE_CUBE : 577case SLANG_TEXTURE_CUBE_ARRAY : 578case SLANG_TEXTURE_2D_MULTISAMPLE : 579case SLANG_TEXTURE_2D_MULTISAMPLE_ARRAY : 580default : 581return SLANG_OK ; 582 } 583d3dDevice -> CreateUnorderedAccessView (nullptr ,nullptr ,& uavDesc ,destDescriptor ); 584 } 585break ; 586default : 587break ; 588 } 589return SLANG_OK ; 590} 591 592void translatePostBuildInfoDescs ( 593int propertyQueryCount , 594AccelerationStructureQueryDesc * queryDescs , 595List < D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC >& postBuildInfoDescs ) 596{ 597postBuildInfoDescs .setCount (propertyQueryCount ); 598for (int i = 0 ;i < propertyQueryCount ;i ++ ) 599 { 600switch (queryDescs [i ].queryType ) 601 { 602case QueryType ::AccelerationStructureCompactedSize : 603postBuildInfoDescs [i ].InfoType = 604D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_COMPACTED_SIZE ; 605postBuildInfoDescs [i ].DestBuffer = 606static_cast < PlainBufferProxyQueryPoolImpl *> (queryDescs [i ].queryPool ) 607-> m_bufferResource -> getDeviceAddress ()+ 608sizeof (D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_COMPACTED_SIZE_DESC )* 609queryDescs [i ].firstQueryIndex ; 610break ; 611case QueryType ::AccelerationStructureCurrentSize : 612postBuildInfoDescs [i ].InfoType = 613D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_CURRENT_SIZE ; 614postBuildInfoDescs [i ].DestBuffer = 615static_cast < PlainBufferProxyQueryPoolImpl *> (queryDescs [i ].queryPool ) 616-> m_bufferResource -> getDeviceAddress ()+ 617sizeof (D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_COMPACTED_SIZE_DESC )* 618queryDescs [i ].firstQueryIndex ; 619break ; 620case QueryType ::AccelerationStructureSerializedSize : 621postBuildInfoDescs [i ].InfoType = 622D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_SERIALIZATION ; 623postBuildInfoDescs [i ].DestBuffer = 624static_cast < PlainBufferProxyQueryPoolImpl *> (queryDescs [i ].queryPool ) 625-> m_bufferResource -> getDeviceAddress ()+ 626sizeof (D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_SERIALIZATION_DESC )* 627queryDescs [i ].firstQueryIndex ; 628break ; 629 } 630 } 631} 632 633}// namespace d3d12 634 635Result SLANG_MCALL getD3D12Adapters (List < AdapterInfo >& outAdapters ) 636{ 637List < ComPtr < IDXGIAdapter >> dxgiAdapters ; 638SLANG_RETURN_ON_FAIL ( 639D3DUtil ::findAdapters (DeviceCheckFlag ::UseHardwareDevice ,nullptr ,dxgiAdapters )); 640 641outAdapters .clear (); 642for (const auto & dxgiAdapter :dxgiAdapters ) 643 { 644DXGI_ADAPTER_DESC desc ; 645dxgiAdapter -> GetDesc (& desc ); 646AdapterInfo info = {}; 647auto name = String ::fromWString (desc .Description ); 648memcpy ( 649info .name , 650name .getBuffer (), 651Math ::Min (name .getLength (), (Index )sizeof (AdapterInfo ::name )- 1 )); 652info .vendorID = desc .VendorId ; 653info .deviceID = desc .DeviceId ; 654info .luid = D3DUtil ::getAdapterLUID (dxgiAdapter ); 655outAdapters .add (info ); 656 } 657return SLANG_OK ; 658} 659 660Result SLANG_MCALL createD3D12Device (const IDevice ::Desc * desc ,IDevice ** outDevice ) 661{ 662RefPtr < d3d12::DeviceImpl > result = new d3d12::DeviceImpl (); 663SLANG_RETURN_ON_FAIL (result -> initialize (* desc )); 664returnComPtr (outDevice ,result ); 665return SLANG_OK ; 666} 667 668}// namespace gfx