yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
b118451e3
master
1// d3d-util.cpp 2#include "d3d-util.h" 3 4#include <d3d12.h> 5#include <dxgi1_4.h> 6#include <dxgidebug.h> 7#if SLANG_ENABLE_DXBC_SUPPORT 8#include <d3dcompiler.h> 9#endif 10 11// We will use the C standard library just for printing error messages. 12#include "core/slang-basic.h" 13#include "core/slang-platform.h" 14 15#include <stdio.h> 16 17#ifdef GFX_NV_AFTERMATH 18#include "GFSDK_Aftermath.h" 19#include "GFSDK_Aftermath_Defines.h" 20#include "GFSDK_Aftermath_GpuCrashDump.h" 21#include "core/slang-process.h" 22#endif 23 24namespace gfx 25{ 26using namespace Slang ; 27 28/* static */ D3D_PRIMITIVE_TOPOLOGY D3DUtil ::getPrimitiveTopology (PrimitiveTopology topology ) 29{ 30switch (topology ) 31 { 32case PrimitiveTopology ::TriangleList : 33return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST ; 34case PrimitiveTopology ::TriangleStrip : 35return D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP ; 36case PrimitiveTopology ::LineList : 37return D3D_PRIMITIVE_TOPOLOGY_LINELIST ; 38case PrimitiveTopology ::LineStrip : 39return D3D_PRIMITIVE_TOPOLOGY_LINESTRIP ; 40case PrimitiveTopology ::PointList : 41return D3D_PRIMITIVE_TOPOLOGY_POINTLIST ; 42default : 43break ; 44 } 45return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED ; 46} 47 48D3D12_PRIMITIVE_TOPOLOGY_TYPE D3DUtil ::getPrimitiveType (PrimitiveTopology topology ) 49{ 50switch (topology ) 51 { 52case PrimitiveTopology ::TriangleList : 53case PrimitiveTopology ::TriangleStrip : 54return D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE ; 55case PrimitiveTopology ::LineList : 56case PrimitiveTopology ::LineStrip : 57return D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE ; 58case PrimitiveTopology ::PointList : 59return D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT ; 60default : 61break ; 62 } 63return D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED ; 64} 65 66D3D12_PRIMITIVE_TOPOLOGY_TYPE D3DUtil ::getPrimitiveType (PrimitiveType type ) 67{ 68switch (type ) 69 { 70case PrimitiveType ::Point : 71return D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT ; 72case PrimitiveType ::Line : 73return D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE ; 74case PrimitiveType ::Triangle : 75return D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE ; 76case PrimitiveType ::Patch : 77return D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH ; 78default : 79break ; 80 } 81return D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED ; 82} 83 84D3D12_COMPARISON_FUNC D3DUtil ::getComparisonFunc (ComparisonFunc func ) 85{ 86switch (func ) 87 { 88case gfx::ComparisonFunc ::Never : 89return D3D12_COMPARISON_FUNC_NEVER ; 90case gfx::ComparisonFunc ::Less : 91return D3D12_COMPARISON_FUNC_LESS ; 92case gfx::ComparisonFunc ::Equal : 93return D3D12_COMPARISON_FUNC_EQUAL ; 94case gfx::ComparisonFunc ::LessEqual : 95return D3D12_COMPARISON_FUNC_LESS_EQUAL ; 96case gfx::ComparisonFunc ::Greater : 97return D3D12_COMPARISON_FUNC_GREATER ; 98case gfx::ComparisonFunc ::NotEqual : 99return D3D12_COMPARISON_FUNC_NOT_EQUAL ; 100case gfx::ComparisonFunc ::GreaterEqual : 101return D3D12_COMPARISON_FUNC_GREATER_EQUAL ; 102case gfx::ComparisonFunc ::Always : 103return D3D12_COMPARISON_FUNC_ALWAYS ; 104default : 105return D3D12_COMPARISON_FUNC_NEVER ; 106 } 107} 108 109static D3D12_STENCIL_OP translateStencilOp (StencilOp op ) 110{ 111switch (op ) 112 { 113case gfx::StencilOp ::Keep : 114return D3D12_STENCIL_OP_KEEP ; 115case gfx::StencilOp ::Zero : 116return D3D12_STENCIL_OP_ZERO ; 117case gfx::StencilOp ::Replace : 118return D3D12_STENCIL_OP_REPLACE ; 119case gfx::StencilOp ::IncrementSaturate : 120return D3D12_STENCIL_OP_INCR_SAT ; 121case gfx::StencilOp ::DecrementSaturate : 122return D3D12_STENCIL_OP_DECR_SAT ; 123case gfx::StencilOp ::Invert : 124return D3D12_STENCIL_OP_INVERT ; 125case gfx::StencilOp ::IncrementWrap : 126return D3D12_STENCIL_OP_INCR ; 127case gfx::StencilOp ::DecrementWrap : 128return D3D12_STENCIL_OP_DECR ; 129default : 130return D3D12_STENCIL_OP_KEEP ; 131 } 132} 133 134D3D12_DEPTH_STENCILOP_DESC D3DUtil ::translateStencilOpDesc (DepthStencilOpDesc desc ) 135{ 136D3D12_DEPTH_STENCILOP_DESC rs ; 137rs .StencilDepthFailOp = translateStencilOp (desc .stencilDepthFailOp ); 138rs .StencilFailOp = translateStencilOp (desc .stencilFailOp ); 139rs .StencilFunc = getComparisonFunc (desc .stencilFunc ); 140rs .StencilPassOp = translateStencilOp (desc .stencilPassOp ); 141return rs ; 142} 143 144/* static */ DXGI_FORMAT D3DUtil ::getMapFormat (Format format ) 145{ 146switch (format ) 147 { 148case Format ::R32G32B32A32_TYPELESS : 149return DXGI_FORMAT_R32G32B32A32_TYPELESS ; 150case Format ::R32G32B32_TYPELESS : 151return DXGI_FORMAT_R32G32B32_TYPELESS ; 152case Format ::R32G32_TYPELESS : 153return DXGI_FORMAT_R32G32_TYPELESS ; 154case Format ::R32_TYPELESS : 155return DXGI_FORMAT_R32_TYPELESS ; 156 157case Format ::R16G16B16A16_TYPELESS : 158return DXGI_FORMAT_R16G16B16A16_TYPELESS ; 159case Format ::R16G16_TYPELESS : 160return DXGI_FORMAT_R16G16_TYPELESS ; 161case Format ::R16_TYPELESS : 162return DXGI_FORMAT_R16_TYPELESS ; 163 164case Format ::R8G8B8A8_TYPELESS : 165return DXGI_FORMAT_R8G8B8A8_TYPELESS ; 166case Format ::R8G8_TYPELESS : 167return DXGI_FORMAT_R8G8_TYPELESS ; 168case Format ::R8_TYPELESS : 169return DXGI_FORMAT_R8_TYPELESS ; 170case Format ::B8G8R8A8_TYPELESS : 171return DXGI_FORMAT_B8G8R8A8_TYPELESS ; 172 173case Format ::R32G32B32A32_FLOAT : 174return DXGI_FORMAT_R32G32B32A32_FLOAT ; 175case Format ::R32G32B32_FLOAT : 176return DXGI_FORMAT_R32G32B32_FLOAT ; 177case Format ::R32G32_FLOAT : 178return DXGI_FORMAT_R32G32_FLOAT ; 179case Format ::R32_FLOAT : 180return DXGI_FORMAT_R32_FLOAT ; 181 182case Format ::R16G16B16A16_FLOAT : 183return DXGI_FORMAT_R16G16B16A16_FLOAT ; 184case Format ::R16G16_FLOAT : 185return DXGI_FORMAT_R16G16_FLOAT ; 186case Format ::R16_FLOAT : 187return DXGI_FORMAT_R16_FLOAT ; 188 189case Format ::R64_UINT : 190return DXGI_FORMAT_R32G32_UINT ; 191 192case Format ::R32G32B32A32_UINT : 193return DXGI_FORMAT_R32G32B32A32_UINT ; 194case Format ::R32G32B32_UINT : 195return DXGI_FORMAT_R32G32B32_UINT ; 196case Format ::R32G32_UINT : 197return DXGI_FORMAT_R32G32_UINT ; 198case Format ::R32_UINT : 199return DXGI_FORMAT_R32_UINT ; 200 201case Format ::R16G16B16A16_UINT : 202return DXGI_FORMAT_R16G16B16A16_UINT ; 203case Format ::R16G16_UINT : 204return DXGI_FORMAT_R16G16_UINT ; 205case Format ::R16_UINT : 206return DXGI_FORMAT_R16_UINT ; 207 208case Format ::R8G8B8A8_UINT : 209return DXGI_FORMAT_R8G8B8A8_UINT ; 210case Format ::R8G8_UINT : 211return DXGI_FORMAT_R8G8_UINT ; 212case Format ::R8_UINT : 213return DXGI_FORMAT_R8_UINT ; 214 215case Format ::R64_SINT : 216return DXGI_FORMAT_R32G32_SINT ; 217 218case Format ::R32G32B32A32_SINT : 219return DXGI_FORMAT_R32G32B32A32_SINT ; 220case Format ::R32G32B32_SINT : 221return DXGI_FORMAT_R32G32B32_SINT ; 222case Format ::R32G32_SINT : 223return DXGI_FORMAT_R32G32_SINT ; 224case Format ::R32_SINT : 225return DXGI_FORMAT_R32_SINT ; 226 227case Format ::R16G16B16A16_SINT : 228return DXGI_FORMAT_R16G16B16A16_SINT ; 229case Format ::R16G16_SINT : 230return DXGI_FORMAT_R16G16_SINT ; 231case Format ::R16_SINT : 232return DXGI_FORMAT_R16_SINT ; 233 234case Format ::R8G8B8A8_SINT : 235return DXGI_FORMAT_R8G8B8A8_SINT ; 236case Format ::R8G8_SINT : 237return DXGI_FORMAT_R8G8_SINT ; 238case Format ::R8_SINT : 239return DXGI_FORMAT_R8_SINT ; 240 241case Format ::R16G16B16A16_UNORM : 242return DXGI_FORMAT_R16G16B16A16_UNORM ; 243case Format ::R16G16_UNORM : 244return DXGI_FORMAT_R16G16_UNORM ; 245case Format ::R16_UNORM : 246return DXGI_FORMAT_R16_UNORM ; 247 248case Format ::R8G8B8A8_UNORM : 249return DXGI_FORMAT_R8G8B8A8_UNORM ; 250case Format ::R8G8B8A8_UNORM_SRGB : 251return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB ; 252case Format ::R8G8_UNORM : 253return DXGI_FORMAT_R8G8_UNORM ; 254case Format ::R8_UNORM : 255return DXGI_FORMAT_R8_UNORM ; 256case Format ::B8G8R8A8_UNORM : 257return DXGI_FORMAT_B8G8R8A8_UNORM ; 258case Format ::B8G8R8X8_UNORM : 259return DXGI_FORMAT_B8G8R8X8_UNORM ; 260case Format ::B8G8R8A8_UNORM_SRGB : 261return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ; 262case Format ::B8G8R8X8_UNORM_SRGB : 263return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB ; 264 265case Format ::R16G16B16A16_SNORM : 266return DXGI_FORMAT_R16G16B16A16_SNORM ; 267case Format ::R16G16_SNORM : 268return DXGI_FORMAT_R16G16_SNORM ; 269case Format ::R16_SNORM : 270return DXGI_FORMAT_R16_SNORM ; 271 272case Format ::R8G8B8A8_SNORM : 273return DXGI_FORMAT_R8G8B8A8_SNORM ; 274case Format ::R8G8_SNORM : 275return DXGI_FORMAT_R8G8_SNORM ; 276case Format ::R8_SNORM : 277return DXGI_FORMAT_R8_SNORM ; 278 279case Format ::D32_FLOAT : 280return DXGI_FORMAT_D32_FLOAT ; 281case Format ::D16_UNORM : 282return DXGI_FORMAT_D16_UNORM ; 283case Format ::D32_FLOAT_S8_UINT : 284return DXGI_FORMAT_D32_FLOAT_S8X24_UINT ; 285case Format ::R32_FLOAT_X32_TYPELESS : 286return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS ; 287 288case Format ::B4G4R4A4_UNORM : 289return DXGI_FORMAT_B4G4R4A4_UNORM ; 290case Format ::B5G6R5_UNORM : 291return DXGI_FORMAT_B5G6R5_UNORM ; 292case Format ::B5G5R5A1_UNORM : 293return DXGI_FORMAT_B5G5R5A1_UNORM ; 294 295case Format ::R9G9B9E5_SHAREDEXP : 296return DXGI_FORMAT_R9G9B9E5_SHAREDEXP ; 297case Format ::R10G10B10A2_TYPELESS : 298return DXGI_FORMAT_R10G10B10A2_TYPELESS ; 299case Format ::R10G10B10A2_UINT : 300return DXGI_FORMAT_R10G10B10A2_UINT ; 301case Format ::R10G10B10A2_UNORM : 302return DXGI_FORMAT_R10G10B10A2_UNORM ; 303case Format ::R11G11B10_FLOAT : 304return DXGI_FORMAT_R11G11B10_FLOAT ; 305 306case Format ::BC1_UNORM : 307return DXGI_FORMAT_BC1_UNORM ; 308case Format ::BC1_UNORM_SRGB : 309return DXGI_FORMAT_BC1_UNORM_SRGB ; 310case Format ::BC2_UNORM : 311return DXGI_FORMAT_BC2_UNORM ; 312case Format ::BC2_UNORM_SRGB : 313return DXGI_FORMAT_BC2_UNORM_SRGB ; 314case Format ::BC3_UNORM : 315return DXGI_FORMAT_BC3_UNORM ; 316case Format ::BC3_UNORM_SRGB : 317return DXGI_FORMAT_BC3_UNORM_SRGB ; 318case Format ::BC4_UNORM : 319return DXGI_FORMAT_BC4_UNORM ; 320case Format ::BC4_SNORM : 321return DXGI_FORMAT_BC4_SNORM ; 322case Format ::BC5_UNORM : 323return DXGI_FORMAT_BC5_UNORM ; 324case Format ::BC5_SNORM : 325return DXGI_FORMAT_BC5_SNORM ; 326case Format ::BC6H_UF16 : 327return DXGI_FORMAT_BC6H_UF16 ; 328case Format ::BC6H_SF16 : 329return DXGI_FORMAT_BC6H_SF16 ; 330case Format ::BC7_UNORM : 331return DXGI_FORMAT_BC7_UNORM ; 332case Format ::BC7_UNORM_SRGB : 333return DXGI_FORMAT_BC7_UNORM_SRGB ; 334 335default : 336return DXGI_FORMAT_UNKNOWN ; 337 } 338} 339 340/* static */ DXGI_FORMAT 341D3DUtil ::calcResourceFormat (UsageType usage ,Int usageFlags ,DXGI_FORMAT format ) 342{ 343SLANG_UNUSED (usage ); 344if (usageFlags ) 345 { 346switch (format ) 347 { 348case DXGI_FORMAT_R32_FLOAT :/* fallthru */ 349case DXGI_FORMAT_R32_UINT : 350case DXGI_FORMAT_D32_FLOAT : 351 { 352return DXGI_FORMAT_R32_TYPELESS ; 353 } 354case DXGI_FORMAT_D24_UNORM_S8_UINT : 355return DXGI_FORMAT_R24G8_TYPELESS ; 356default : 357break ; 358 } 359return format ; 360 } 361return format ; 362} 363 364/* static */ DXGI_FORMAT D3DUtil ::calcFormat (UsageType usage ,DXGI_FORMAT format ) 365{ 366switch (usage ) 367 { 368case USAGE_COUNT_OF : 369case USAGE_UNKNOWN : 370 { 371return DXGI_FORMAT_UNKNOWN ; 372 } 373case USAGE_DEPTH_STENCIL : 374 { 375switch (format ) 376 { 377case DXGI_FORMAT_D32_FLOAT :/* fallthru */ 378case DXGI_FORMAT_R32_TYPELESS : 379 { 380return DXGI_FORMAT_D32_FLOAT ; 381 } 382case DXGI_FORMAT_R24_UNORM_X8_TYPELESS : 383return DXGI_FORMAT_D24_UNORM_S8_UINT ; 384case DXGI_FORMAT_R24G8_TYPELESS : 385return DXGI_FORMAT_D24_UNORM_S8_UINT ; 386default : 387break ; 388 } 389return format ; 390 } 391case USAGE_TARGET : 392 { 393switch (format ) 394 { 395case DXGI_FORMAT_D32_FLOAT :/* fallthru */ 396case DXGI_FORMAT_D24_UNORM_S8_UINT : 397 { 398return DXGI_FORMAT_UNKNOWN ; 399 } 400case DXGI_FORMAT_R32_TYPELESS : 401return DXGI_FORMAT_R32_FLOAT ; 402default : 403break ; 404 } 405return format ; 406 } 407case USAGE_SRV : 408 { 409switch (format ) 410 { 411case DXGI_FORMAT_D32_FLOAT :/* fallthru */ 412case DXGI_FORMAT_R32_TYPELESS : 413 { 414return DXGI_FORMAT_R32_FLOAT ; 415 } 416case DXGI_FORMAT_R24_UNORM_X8_TYPELESS : 417return DXGI_FORMAT_R24_UNORM_X8_TYPELESS ; 418default : 419break ; 420 } 421 422return format ; 423 } 424 } 425 426assert (!"Not reachable" ); 427return DXGI_FORMAT_UNKNOWN ; 428} 429 430bool D3DUtil ::isTypeless (DXGI_FORMAT format ) 431{ 432switch (format ) 433 { 434case DXGI_FORMAT_R32G32B32A32_TYPELESS : 435case DXGI_FORMAT_R32G32B32_TYPELESS : 436case DXGI_FORMAT_R16G16B16A16_TYPELESS : 437case DXGI_FORMAT_R32G32_TYPELESS : 438case DXGI_FORMAT_R32G8X24_TYPELESS : 439case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS : 440case DXGI_FORMAT_R10G10B10A2_TYPELESS : 441case DXGI_FORMAT_R8G8B8A8_TYPELESS : 442case DXGI_FORMAT_R16G16_TYPELESS : 443case DXGI_FORMAT_R32_TYPELESS : 444case DXGI_FORMAT_R24_UNORM_X8_TYPELESS : 445case DXGI_FORMAT_R24G8_TYPELESS : 446case DXGI_FORMAT_R8G8_TYPELESS : 447case DXGI_FORMAT_R16_TYPELESS : 448case DXGI_FORMAT_R8_TYPELESS : 449case DXGI_FORMAT_BC1_TYPELESS : 450case DXGI_FORMAT_BC2_TYPELESS : 451case DXGI_FORMAT_BC3_TYPELESS : 452case DXGI_FORMAT_BC4_TYPELESS : 453case DXGI_FORMAT_BC5_TYPELESS : 454case DXGI_FORMAT_B8G8R8A8_TYPELESS : 455case DXGI_FORMAT_BC6H_TYPELESS : 456case DXGI_FORMAT_BC7_TYPELESS : 457 { 458return true; 459 } 460default : 461break ; 462 } 463return false; 464} 465 466/* static */ Int D3DUtil ::getNumColorChannelBits (DXGI_FORMAT fmt ) 467{ 468switch (fmt ) 469 { 470case DXGI_FORMAT_R32G32B32A32_TYPELESS : 471case DXGI_FORMAT_R32G32B32A32_FLOAT : 472case DXGI_FORMAT_R32G32B32A32_UINT : 473case DXGI_FORMAT_R32G32B32A32_SINT : 474case DXGI_FORMAT_R32G32B32_TYPELESS : 475case DXGI_FORMAT_R32G32B32_FLOAT : 476case DXGI_FORMAT_R32G32B32_UINT : 477case DXGI_FORMAT_R32G32B32_SINT : 478 { 479return 32 ; 480 } 481case DXGI_FORMAT_R16G16B16A16_TYPELESS : 482case DXGI_FORMAT_R16G16B16A16_FLOAT : 483case DXGI_FORMAT_R16G16B16A16_UNORM : 484case DXGI_FORMAT_R16G16B16A16_UINT : 485case DXGI_FORMAT_R16G16B16A16_SNORM : 486case DXGI_FORMAT_R16G16B16A16_SINT : 487 { 488return 16 ; 489 } 490case DXGI_FORMAT_R10G10B10A2_TYPELESS : 491case DXGI_FORMAT_R10G10B10A2_UNORM : 492case DXGI_FORMAT_R10G10B10A2_UINT : 493case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM : 494 { 495return 10 ; 496 } 497case DXGI_FORMAT_R8G8B8A8_TYPELESS : 498case DXGI_FORMAT_R8G8B8A8_UNORM : 499case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB : 500case DXGI_FORMAT_R8G8B8A8_UINT : 501case DXGI_FORMAT_R8G8B8A8_SNORM : 502case DXGI_FORMAT_R8G8B8A8_SINT : 503case DXGI_FORMAT_B8G8R8A8_UNORM : 504case DXGI_FORMAT_B8G8R8X8_UNORM : 505case DXGI_FORMAT_B8G8R8A8_TYPELESS : 506case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB : 507case DXGI_FORMAT_B8G8R8X8_TYPELESS : 508case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB : 509 { 510return 8 ; 511 } 512case DXGI_FORMAT_B5G6R5_UNORM : 513case DXGI_FORMAT_B5G5R5A1_UNORM : 514 { 515return 5 ; 516 } 517case DXGI_FORMAT_B4G4R4A4_UNORM : 518return 4 ; 519 520default : 521return 0 ; 522 } 523} 524 525// Note: this subroutine is now only used by D3D11 for generating bytecode to go into input layouts. 526// 527// TODO: we can probably remove that code completely by switching to a PSO-like model across all 528// APIs. 529// 530/* static */ Result D3DUtil ::compileHLSLShader ( 531char const * sourcePath , 532char const * source , 533char const * entryPointName , 534char const * dxProfileName , 535ComPtr < ID3DBlob >& shaderBlobOut ) 536{ 537#if !SLANG_ENABLE_DXBC_SUPPORT 538return SLANG_E_NOT_IMPLEMENTED ; 539#else 540// Rather than statically link against the `d3dcompile` library, we 541// dynamically load it. 542// 543// Note: A more realistic application would compile from HLSL text to D3D 544// shader bytecode as part of an offline process, rather than doing it 545// on-the-fly like this 546// 547static pD3DCompile compileFunc = nullptr ; 548if (!compileFunc ) 549 { 550// On Linux, vkd3d-utils isn't suitable as a unix replacement for fxc 551// due to at least the following missing feature: 552// https://bugs.winehq.org/show_bug.cgi?id=54872 553 554// TODO(tfoley): maybe want to search for one of a few versions of the DLL 555const char * const libName = "d3dcompiler_47" ; 556SharedLibrary ::Handle compilerModule ; 557if (SLANG_FAILED (SharedLibrary ::load (libName ,compilerModule ))) 558 { 559fprintf (stderr ,"error: failed to load '%s'\n" ,libName ); 560return SLANG_FAIL ; 561 } 562 563compileFunc = 564 (pD3DCompile )SharedLibrary ::findSymbolAddressByName (compilerModule ,"D3DCompile" ); 565if (!compileFunc ) 566 { 567fprintf (stderr ,"error: failed load symbol 'D3DCompile'\n" ); 568return SLANG_FAIL ; 569 } 570 } 571 572// For this example, we turn on debug output, and turn off all 573// optimization. A real application would only use these flags 574// when shader debugging is needed. 575UINT flags = 0 ; 576flags |=D3DCOMPILE_DEBUG ; 577flags |=D3DCOMPILE_OPTIMIZATION_LEVEL0 |D3DCOMPILE_SKIP_OPTIMIZATION ; 578 579// We will always define `__HLSL__` when compiling here, so that 580// input code can react differently to being compiled as pure HLSL. 581D3D_SHADER_MACRO defines []= { 582 {"__HLSL__" ,"1" }, 583 {nullptr ,nullptr }, 584 }; 585 586// The `D3DCompile` entry point takes a bunch of parameters, but we 587// don't really need most of them for Slang-generated code. 588ComPtr < ID3DBlob > shaderBlob ; 589ComPtr < ID3DBlob > errorBlob ; 590 591HRESULT hr = compileFunc ( 592source , 593strlen (source ), 594sourcePath , 595& defines [0 ], 596nullptr , 597entryPointName , 598dxProfileName , 599flags , 6000 , 601shaderBlob .writeRef (), 602errorBlob .writeRef ()); 603 604// If the HLSL-to-bytecode compilation produced any diagnostic messages 605// then we will print them out (whether or not the compilation failed). 606if (errorBlob ) 607 { 608 ::fputs ((const char * )errorBlob -> GetBufferPointer (),stderr ); 609 ::fflush (stderr ); 610#if SLANG_WINDOWS_FAMILY 611 ::OutputDebugStringA ((const char * )errorBlob -> GetBufferPointer ()); 612#endif 613 } 614 615SLANG_RETURN_ON_FAIL (hr ); 616shaderBlobOut .swap (shaderBlob ); 617return SLANG_OK ; 618#endif // SLANG_ENABLE_DXBC_SUPPORT 619} 620 621/* static */ SharedLibrary ::Handle D3DUtil ::getDxgiModule () 622{ 623const char * const libName = SLANG_ENABLE_DXVK ?"dxvk_dxgi" :"dxgi" ; 624 625static SharedLibrary ::Handle s_dxgiModule = [& ]() 626 { 627SharedLibrary ::Handle h = nullptr ; 628SharedLibrary ::load (libName ,h ); 629if (!h ) 630 { 631fprintf (stderr ,"error: failed to load dll '%s'\n" ,libName ); 632 } 633return h ; 634 }(); 635return s_dxgiModule ; 636} 637 638/* static */ SlangResult D3DUtil ::createFactory ( 639DeviceCheckFlags flags , 640ComPtr < IDXGIFactory >& outFactory ) 641{ 642auto dxgiModule = getDxgiModule (); 643if (!dxgiModule ) 644 { 645return SLANG_FAIL ; 646 } 647 648typedef HRESULT (WINAPI * PFN_DXGI_CREATE_FACTORY )(REFIID riid ,void ** ppFactory ); 649typedef HRESULT (WINAPI * PFN_DXGI_CREATE_FACTORY_2 )(UINT Flags ,REFIID riid ,void ** ppFactory ); 650 651 { 652auto createFactory2 = (PFN_DXGI_CREATE_FACTORY_2 )SharedLibrary ::findSymbolAddressByName ( 653dxgiModule , 654"CreateDXGIFactory2" ); 655if (createFactory2 ) 656 { 657UINT dxgiFlags = 0 ; 658 659if (flags & DeviceCheckFlag ::UseDebug ) 660 { 661dxgiFlags |=DXGI_CREATE_FACTORY_DEBUG ; 662 } 663 664ComPtr < IDXGIFactory4 > factory ; 665SLANG_RETURN_ON_FAIL (createFactory2 (dxgiFlags ,IID_PPV_ARGS (factory .writeRef ()))); 666 667outFactory = factory ; 668return SLANG_OK ; 669 } 670 } 671 672 { 673auto createFactory = (PFN_DXGI_CREATE_FACTORY )SharedLibrary ::findSymbolAddressByName ( 674dxgiModule , 675"CreateDXGIFactory" ); 676if (!createFactory ) 677 { 678fprintf (stderr ,"error: failed load symbol '%s'\n" ,"CreateDXGIFactory" ); 679return SLANG_FAIL ; 680 } 681return createFactory (IID_PPV_ARGS (outFactory .writeRef ())); 682 } 683} 684 685/* static */ SlangResult D3DUtil ::findAdapters ( 686DeviceCheckFlags flags , 687const AdapterLUID * adapterLUID , 688List < ComPtr < IDXGIAdapter >>& outDxgiAdapters ) 689{ 690ComPtr < IDXGIFactory > factory ; 691SLANG_RETURN_ON_FAIL (createFactory (flags ,factory )); 692return findAdapters (flags ,adapterLUID ,factory ,outDxgiAdapters ); 693} 694 695/* static */ AdapterLUID D3DUtil ::getAdapterLUID (IDXGIAdapter * dxgiAdapter ) 696{ 697DXGI_ADAPTER_DESC desc ; 698dxgiAdapter -> GetDesc (& desc ); 699AdapterLUID luid = {}; 700SLANG_ASSERT (sizeof (AdapterLUID ) >=sizeof (LUID )); 701memcpy (& luid ,& desc .AdapterLuid ,sizeof (LUID )); 702return luid ; 703} 704 705/* static */ bool D3DUtil ::isWarp (IDXGIFactory * dxgiFactory ,IDXGIAdapter * adapterIn ) 706{ 707ComPtr < IDXGIFactory4 > dxgiFactory4 ; 708if (SLANG_SUCCEEDED (dxgiFactory -> QueryInterface (IID_PPV_ARGS (dxgiFactory4 .writeRef ())))) 709 { 710ComPtr < IDXGIAdapter > warpAdapter ; 711dxgiFactory4 -> EnumWarpAdapter (IID_PPV_ARGS (warpAdapter .writeRef ())); 712 713return adapterIn == warpAdapter ; 714 } 715 716return false; 717} 718 719bool D3DUtil ::isUAVBinding (slang::BindingType bindingType ) 720{ 721switch (bindingType ) 722 { 723case slang::BindingType ::MutableRawBuffer : 724case slang::BindingType ::MutableTexture : 725case slang::BindingType ::MutableTypedBuffer : 726return true; 727default : 728return false; 729 } 730} 731 732int D3DUtil ::getShaderModelFromProfileName (const char * name ) 733{ 734UnownedStringSlice nameSlice (name ); 735 736if (nameSlice .endsWith ("5_1" )) 737return D3D_SHADER_MODEL_5_1 ; 738if (nameSlice .endsWith ("6_0" )) 739return D3D_SHADER_MODEL_6_0 ; 740if (nameSlice .endsWith ("6_1" )) 741return D3D_SHADER_MODEL_6_1 ; 742if (nameSlice .endsWith ("6_2" )) 743return D3D_SHADER_MODEL_6_2 ; 744if (nameSlice .endsWith ("6_3" )) 745return D3D_SHADER_MODEL_6_3 ; 746if (nameSlice .endsWith ("6_4" )) 747return D3D_SHADER_MODEL_6_4 ; 748if (nameSlice .endsWith ("6_5" )) 749return D3D_SHADER_MODEL_6_5 ; 750if (nameSlice .endsWith ("6_6" )) 751return D3D_SHADER_MODEL_6_6 ; 752if (nameSlice .endsWith ("6_7" )) 753return 0x67 ; 754return 0 ; 755} 756 757uint32_t D3DUtil ::getPlaneSliceCount (DXGI_FORMAT format ) 758{ 759switch (format ) 760 { 761case DXGI_FORMAT_D24_UNORM_S8_UINT : 762case DXGI_FORMAT_D32_FLOAT_S8X24_UINT : 763return 2 ; 764default : 765return 1 ; 766 } 767} 768 769uint32_t D3DUtil ::getPlaneSlice (DXGI_FORMAT format ,TextureAspect aspect ) 770{ 771switch (aspect ) 772 { 773case TextureAspect ::Default : 774case TextureAspect ::Color : 775return 0 ; 776case TextureAspect ::Depth : 777return 0 ; 778case TextureAspect ::Stencil : 779switch (format ) 780 { 781case DXGI_FORMAT_D24_UNORM_S8_UINT : 782case DXGI_FORMAT_D32_FLOAT_S8X24_UINT : 783return 1 ; 784default : 785return 0 ; 786 } 787case TextureAspect ::Plane0 : 788return 0 ; 789case TextureAspect ::Plane1 : 790return 1 ; 791case TextureAspect ::Plane2 : 792return 2 ; 793default : 794SLANG_ASSERT_FAILURE ("Unknown texture aspect." ); 795return 0 ; 796 } 797} 798 799D3D12_INPUT_CLASSIFICATION D3DUtil ::getInputSlotClass (InputSlotClass slotClass ) 800{ 801switch (slotClass ) 802 { 803case InputSlotClass ::PerVertex : 804return D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA ; 805case InputSlotClass ::PerInstance : 806return D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA ; 807default : 808SLANG_ASSERT_FAILURE ("Unknown input slot class." ); 809return D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA ; 810 } 811} 812 813D3D12_FILL_MODE D3DUtil ::getFillMode (FillMode mode ) 814{ 815switch (mode ) 816 { 817case FillMode ::Solid : 818return D3D12_FILL_MODE_SOLID ; 819case FillMode ::Wireframe : 820return D3D12_FILL_MODE_WIREFRAME ; 821default : 822SLANG_ASSERT_FAILURE ("Unknown fill mode." ); 823return D3D12_FILL_MODE_SOLID ; 824 } 825} 826 827D3D12_CULL_MODE D3DUtil ::getCullMode (CullMode mode ) 828{ 829switch (mode ) 830 { 831case CullMode ::None : 832return D3D12_CULL_MODE_NONE ; 833case CullMode ::Front : 834return D3D12_CULL_MODE_FRONT ; 835case CullMode ::Back : 836return D3D12_CULL_MODE_BACK ; 837default : 838SLANG_ASSERT_FAILURE ("Unknown cull mode." ); 839return D3D12_CULL_MODE_NONE ; 840 } 841} 842 843D3D12_BLEND_OP D3DUtil ::getBlendOp (BlendOp op ) 844{ 845switch (op ) 846 { 847case BlendOp ::Add : 848return D3D12_BLEND_OP_ADD ; 849case BlendOp ::Subtract : 850return D3D12_BLEND_OP_SUBTRACT ; 851case BlendOp ::ReverseSubtract : 852return D3D12_BLEND_OP_REV_SUBTRACT ; 853case BlendOp ::Min : 854return D3D12_BLEND_OP_MIN ; 855case BlendOp ::Max : 856return D3D12_BLEND_OP_MAX ; 857default : 858SLANG_ASSERT_FAILURE ("Unknown blend op." ); 859return D3D12_BLEND_OP_ADD ; 860 } 861} 862 863D3D12_BLEND D3DUtil ::getBlendFactor (BlendFactor factor ) 864{ 865switch (factor ) 866 { 867case BlendFactor ::Zero : 868return D3D12_BLEND_ZERO ; 869case BlendFactor ::One : 870return D3D12_BLEND_ONE ; 871case BlendFactor ::SrcColor : 872return D3D12_BLEND_SRC_COLOR ; 873case BlendFactor ::InvSrcColor : 874return D3D12_BLEND_INV_SRC_COLOR ; 875case BlendFactor ::SrcAlpha : 876return D3D12_BLEND_SRC_ALPHA ; 877case BlendFactor ::InvSrcAlpha : 878return D3D12_BLEND_INV_SRC_ALPHA ; 879case BlendFactor ::DestAlpha : 880return D3D12_BLEND_DEST_ALPHA ; 881case BlendFactor ::InvDestAlpha : 882return D3D12_BLEND_INV_DEST_ALPHA ; 883case BlendFactor ::DestColor : 884return D3D12_BLEND_DEST_COLOR ; 885case BlendFactor ::InvDestColor : 886return D3D12_BLEND_INV_DEST_COLOR ; 887case BlendFactor ::SrcAlphaSaturate : 888return D3D12_BLEND_SRC_ALPHA_SAT ; 889case BlendFactor ::BlendColor : 890return D3D12_BLEND_BLEND_FACTOR ; 891case BlendFactor ::InvBlendColor : 892return D3D12_BLEND_INV_BLEND_FACTOR ; 893case BlendFactor ::SecondarySrcColor : 894return D3D12_BLEND_SRC1_COLOR ; 895case BlendFactor ::InvSecondarySrcColor : 896return D3D12_BLEND_INV_SRC1_COLOR ; 897case BlendFactor ::SecondarySrcAlpha : 898return D3D12_BLEND_SRC1_ALPHA ; 899case BlendFactor ::InvSecondarySrcAlpha : 900return D3D12_BLEND_INV_SRC1_ALPHA ; 901default : 902SLANG_ASSERT_FAILURE ("Unknown blend factor." ); 903return D3D12_BLEND_ZERO ; 904 } 905} 906 907uint32_t D3DUtil ::getSubresourceIndex ( 908uint32_t mipIndex , 909uint32_t arrayIndex , 910uint32_t planeIndex , 911uint32_t mipLevelCount , 912uint32_t arraySize ) 913{ 914return mipIndex + arrayIndex * mipLevelCount + planeIndex * mipLevelCount * arraySize ; 915} 916 917uint32_t D3DUtil ::getSubresourceMipLevel (uint32_t subresourceIndex ,uint32_t mipLevelCount ) 918{ 919return subresourceIndex %mipLevelCount ; 920} 921 922D3D12_RESOURCE_STATES D3DUtil ::getResourceState (ResourceState state ) 923{ 924switch (state ) 925 { 926case ResourceState ::Undefined : 927return D3D12_RESOURCE_STATE_COMMON ; 928case ResourceState ::General : 929return D3D12_RESOURCE_STATE_COMMON ; 930case ResourceState ::PreInitialized : 931return D3D12_RESOURCE_STATE_COMMON ; 932case ResourceState ::VertexBuffer : 933return D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER ; 934case ResourceState ::IndexBuffer : 935return D3D12_RESOURCE_STATE_INDEX_BUFFER ; 936case ResourceState ::ConstantBuffer : 937return D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER ; 938case ResourceState ::StreamOutput : 939return D3D12_RESOURCE_STATE_STREAM_OUT ; 940case ResourceState ::ShaderResource : 941case ResourceState ::AccelerationStructureBuildInput : 942return D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | 943D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE ; 944case ResourceState ::PixelShaderResource : 945return D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE ; 946case ResourceState ::NonPixelShaderResource : 947return D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE ; 948case ResourceState ::UnorderedAccess : 949return D3D12_RESOURCE_STATE_UNORDERED_ACCESS ; 950case ResourceState ::RenderTarget : 951return D3D12_RESOURCE_STATE_RENDER_TARGET ; 952case ResourceState ::DepthRead : 953return D3D12_RESOURCE_STATE_DEPTH_READ ; 954case ResourceState ::DepthWrite :; 955return D3D12_RESOURCE_STATE_DEPTH_WRITE ; 956case ResourceState ::Present : 957return D3D12_RESOURCE_STATE_PRESENT ; 958case ResourceState ::IndirectArgument : 959return D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT ; 960case ResourceState ::CopySource : 961return D3D12_RESOURCE_STATE_COPY_SOURCE ; 962case ResourceState ::CopyDestination : 963return D3D12_RESOURCE_STATE_COPY_DEST ; 964case ResourceState ::ResolveSource : 965return D3D12_RESOURCE_STATE_RESOLVE_SOURCE ; 966case ResourceState ::ResolveDestination : 967return D3D12_RESOURCE_STATE_RESOLVE_DEST ; 968case ResourceState ::AccelerationStructure : 969return D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE ; 970default : 971return D3D12_RESOURCE_STATE_COMMON ; 972 } 973} 974 975/* static */ SlangResult D3DUtil ::reportLiveObjects () 976{ 977static IDXGIDebug * dxgiDebug = nullptr ; 978 979#if SLANG_ENABLE_DXGI_DEBUG 980if (!dxgiDebug ) 981 { 982HMODULE debugModule = LoadLibraryA ("dxgidebug.dll" ); 983if (debugModule != INVALID_HANDLE_VALUE ) 984 { 985auto fun = reinterpret_cast < decltype(& DXGIGetDebugInterface )> ( 986GetProcAddress (debugModule ,"DXGIGetDebugInterface" )); 987if (fun ) 988 { 989fun (__uuidof (IDXGIDebug ), (void ** )& dxgiDebug ); 990 } 991 } 992 } 993#endif 994 995if (dxgiDebug ) 996 { 997const GUID DXGI_DEBUG_ALL_ = 998 {0xe48ae283 ,0xda80 ,0x490b , {0x87 ,0xe6 ,0x43 ,0xe9 ,0xa9 ,0xcf ,0xda ,0x8 }}; 999dxgiDebug -> ReportLiveObjects (DXGI_DEBUG_ALL_ ,DXGI_DEBUG_RLO_ALL ); 1000return SLANG_OK ; 1001 } 1002 1003return SLANG_E_NOT_AVAILABLE ; 1004} 1005 1006Result SLANG_MCALL reportD3DLiveObjects () 1007{ 1008return D3DUtil ::reportLiveObjects (); 1009} 1010 1011 1012/* static */ SlangResult D3DUtil ::waitForCrashDumpCompletion (HRESULT res ) 1013{ 1014// If it's not a device remove/reset then theres nothing to wait for 1015if (!(res == DXGI_ERROR_DEVICE_REMOVED || res == DXGI_ERROR_DEVICE_RESET )) 1016 { 1017return SLANG_OK ; 1018 } 1019 1020#if GFX_NV_AFTERMATH 1021 { 1022GFSDK_Aftermath_CrashDump_Status status = GFSDK_Aftermath_CrashDump_Status_Unknown ; 1023if (GFSDK_Aftermath_GetCrashDumpStatus (& status )!= GFSDK_Aftermath_Result_Success ) 1024 { 1025return SLANG_FAIL ; 1026 } 1027 1028const auto startTick = Process ::getClockTick (); 1029const auto frequency = Process ::getClockFrequency (); 1030 1031float timeOutInSecs = 1.0f ; 1032 1033uint64_t timeOutTicks = uint64_t (frequency * timeOutInSecs )+ 1 ; 1034 1035// Loop while Aftermath crash dump data collection has not finished or 1036// the application is still processing the crash dump data. 1037while (status != GFSDK_Aftermath_CrashDump_Status_CollectingDataFailed && 1038status != GFSDK_Aftermath_CrashDump_Status_Finished && 1039Process ::getClockTick ()- startTick < timeOutTicks ) 1040 { 1041// Sleep a couple of milliseconds and poll the status again. 1042Process ::sleepCurrentThread (50 ); 1043if (GFSDK_Aftermath_GetCrashDumpStatus (& status )!= GFSDK_Aftermath_Result_Success ) 1044 { 1045return SLANG_FAIL ; 1046 } 1047 } 1048 1049if (status == GFSDK_Aftermath_CrashDump_Status_Finished ) 1050 { 1051return SLANG_OK ; 1052 } 1053else 1054 { 1055return SLANG_E_TIME_OUT ; 1056 } 1057 } 1058#endif 1059 1060return SLANG_OK ; 1061} 1062 1063/* static */ SlangResult D3DUtil ::findAdapters ( 1064DeviceCheckFlags flags , 1065const AdapterLUID * adapterLUID , 1066IDXGIFactory * dxgiFactory , 1067List < ComPtr < IDXGIAdapter >>& outDxgiAdapters ) 1068{ 1069outDxgiAdapters .clear (); 1070 1071ComPtr < IDXGIAdapter > warpAdapter ; 1072if ((flags & DeviceCheckFlag ::UseHardwareDevice )== 0 ) 1073 { 1074ComPtr < IDXGIFactory4 > dxgiFactory4 ; 1075if (SLANG_SUCCEEDED (dxgiFactory -> QueryInterface (IID_PPV_ARGS (dxgiFactory4 .writeRef ())))) 1076 { 1077dxgiFactory4 -> EnumWarpAdapter (IID_PPV_ARGS (warpAdapter .writeRef ())); 1078if (!adapterLUID || D3DUtil ::getAdapterLUID (warpAdapter )== * adapterLUID ) 1079 { 1080outDxgiAdapters .add (warpAdapter ); 1081 } 1082 } 1083 } 1084 1085for (UINT adapterIndex = 0 ; true;adapterIndex ++ ) 1086 { 1087ComPtr < IDXGIAdapter > dxgiAdapter ; 1088if (dxgiFactory -> EnumAdapters (adapterIndex ,dxgiAdapter .writeRef ())== DXGI_ERROR_NOT_FOUND ) 1089break ; 1090 1091// Skip if warp (as we will have already added it) 1092if (dxgiAdapter == warpAdapter ) 1093 { 1094continue ; 1095 } 1096if (adapterLUID && D3DUtil ::getAdapterLUID (dxgiAdapter )!= * adapterLUID ) 1097 { 1098continue ; 1099 } 1100 1101// Get if it's software 1102UINT deviceFlags = 0 ; 1103ComPtr < IDXGIAdapter1 > dxgiAdapter1 ; 1104if (SLANG_SUCCEEDED (dxgiAdapter -> QueryInterface (IID_PPV_ARGS (dxgiAdapter1 .writeRef ())))) 1105 { 1106DXGI_ADAPTER_DESC1 desc ; 1107dxgiAdapter1 -> GetDesc1 (& desc ); 1108deviceFlags = desc .Flags ; 1109 } 1110 1111// If the right type then add it 1112if ((deviceFlags & DXGI_ADAPTER_FLAG_SOFTWARE )== 0 && 1113 (flags & DeviceCheckFlag ::UseHardwareDevice )!= 0 ) 1114 { 1115outDxgiAdapters .add (dxgiAdapter ); 1116 } 1117 } 1118 1119return SLANG_OK ; 1120} 1121 1122#if SLANG_GFX_HAS_DXR_SUPPORT 1123Result D3DAccelerationStructureInputsBuilder ::build ( 1124const IAccelerationStructure ::BuildInputs & buildInputs , 1125IDebugCallback * callback ) 1126{ 1127if (buildInputs .geometryDescs ) 1128 { 1129geomDescs .setCount (buildInputs .descCount ); 1130for (Index i = 0 ;i < geomDescs .getCount ();i ++ ) 1131 { 1132auto & inputGeomDesc = buildInputs .geometryDescs [i ]; 1133geomDescs [i ].Flags = translateGeometryFlags (inputGeomDesc .flags ); 1134switch (inputGeomDesc .type ) 1135 { 1136case IAccelerationStructure ::GeometryType ::Triangles : 1137geomDescs [i ].Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES ; 1138geomDescs [i ].Triangles .IndexBuffer = inputGeomDesc .content .triangles .indexData ; 1139geomDescs [i ].Triangles .IndexCount = inputGeomDesc .content .triangles .indexCount ; 1140geomDescs [i ].Triangles .IndexFormat = 1141D3DUtil ::getMapFormat (inputGeomDesc .content .triangles .indexFormat ); 1142geomDescs [i ].Triangles .Transform3x4 = inputGeomDesc .content .triangles .transform3x4 ; 1143geomDescs [i ].Triangles .VertexBuffer .StartAddress = 1144inputGeomDesc .content .triangles .vertexData ; 1145geomDescs [i ].Triangles .VertexBuffer .StrideInBytes = 1146inputGeomDesc .content .triangles .vertexStride ; 1147geomDescs [i ].Triangles .VertexCount = inputGeomDesc .content .triangles .vertexCount ; 1148geomDescs [i ].Triangles .VertexFormat = 1149D3DUtil ::getMapFormat (inputGeomDesc .content .triangles .vertexFormat ); 1150break ; 1151case IAccelerationStructure ::GeometryType ::ProcedurePrimitives : 1152geomDescs [i ].Type = D3D12_RAYTRACING_GEOMETRY_TYPE_PROCEDURAL_PRIMITIVE_AABBS ; 1153geomDescs [i ].AABBs .AABBCount = inputGeomDesc .content .proceduralAABBs .count ; 1154geomDescs [i ].AABBs .AABBs .StartAddress = inputGeomDesc .content .proceduralAABBs .data ; 1155geomDescs [i ].AABBs .AABBs .StrideInBytes = 1156inputGeomDesc .content .proceduralAABBs .stride ; 1157break ; 1158default : 1159callback -> handleMessage ( 1160DebugMessageType ::Error , 1161DebugMessageSource ::Layer , 1162"invalid value of IAccelerationStructure::GeometryType." ); 1163return SLANG_E_INVALID_ARG ; 1164 } 1165 } 1166 } 1167desc .DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY ; 1168desc .NumDescs = buildInputs .descCount ; 1169switch (buildInputs .kind ) 1170 { 1171case IAccelerationStructure ::Kind ::TopLevel : 1172desc .Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL ; 1173desc .InstanceDescs = buildInputs .instanceDescs ; 1174break ; 1175case IAccelerationStructure ::Kind ::BottomLevel : 1176desc .Type = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL ; 1177desc .pGeometryDescs = geomDescs .getBuffer (); 1178break ; 1179 } 1180desc .Flags = (D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS )buildInputs .flags ; 1181return SLANG_OK ; 1182} 1183#endif 1184 1185}// namespace gfx