1+ // /////////////////////////////////////////////////////////////////////////////
2+ // //
3+ // D3D12RaytracingFallback.h //
4+ // //
5+ // Provides a simplified interface for the DX12 Ray Tracing interface that //
6+ // will use native DX12 ray tracing when available. For drivers that do not //
7+ // support ray tracing, a fallback compute-shader based solution will be //
8+ // used instead. //
9+ // //
10+ // /////////////////////////////////////////////////////////////////////////////
11+
12+ #pragma once
13+ #include " d3d12_1.h"
14+
15+ struct EMULATED_GPU_POINTER
16+ {
17+ UINT32 OffsetInBytes;
18+ UINT32 DescriptorHeapIndex;
19+ };
20+
21+ struct WRAPPED_GPU_POINTER
22+ {
23+ union
24+ {
25+ EMULATED_GPU_POINTER EmulatedGpuPtr;
26+ D3D12_GPU_VIRTUAL_ADDRESS GpuVA;
27+ };
28+
29+ WRAPPED_GPU_POINTER operator +(UINT64 offset)
30+ {
31+ WRAPPED_GPU_POINTER pointer = *this ;
32+ pointer.GpuVA += offset;
33+ return pointer;
34+ }
35+ };
36+
37+ typedef struct D3D12_RAYTRACING_FALLBACK_INSTANCE_DESC
38+ {
39+ FLOAT Transform[3 ][4 ];
40+ UINT InstanceID : 24 ;
41+ UINT InstanceMask : 8 ;
42+ UINT InstanceContributionToHitGroupIndex : 24 ;
43+ UINT Flags : 8 ;
44+ WRAPPED_GPU_POINTER AccelerationStructure;
45+ } D3D12_RAYTRACING_FALLBACK_INSTANCE_DESC;
46+
47+ class
48+ _declspec (uuid(" 539e5c40-df25-4c7d-81d8-6537f54306ed" ))
49+ ID3D12RaytracingFallbackStateObject : public IUnknown
50+ {
51+ public:
52+ virtual ~ID3D12RaytracingFallbackStateObject () {};
53+
54+ virtual void *STDMETHODCALLTYPE GetShaderIdentifier (
55+ _In_ LPCWSTR pExportName) = 0 ;
56+
57+ virtual UINT64 STDMETHODCALLTYPE GetShaderStackSize (
58+ _In_ LPCWSTR pExportName) = 0 ;
59+
60+ virtual UINT64 STDMETHODCALLTYPE GetPipelineStackSize (void ) = 0 ;
61+
62+ virtual void STDMETHODCALLTYPE SetPipelineStackSize (
63+ UINT64 PipelineStackSizeInBytes) = 0 ;
64+
65+ virtual ID3D12StateObject *GetStateObject () = 0 ;
66+ };
67+
68+ class
69+ _declspec (uuid(" 348a2a6b-6760-4b78-a9a7-1758b6f78d46" ))
70+ ID3D12RaytracingFallbackCommandList : public IUnknown
71+ {
72+ public:
73+ virtual ~ID3D12RaytracingFallbackCommandList () {}
74+
75+ virtual void BuildRaytracingAccelerationStructure (
76+ _In_ const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC *pDesc,
77+ _In_ UINT NumPostbuildInfoDescs,
78+ _In_reads_opt_ (NumPostbuildInfoDescs) const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *pPostbuildInfoDescs) = 0 ;
79+
80+ virtual void STDMETHODCALLTYPE EmitRaytracingAccelerationStructurePostbuildInfo (
81+ _In_ const D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC *pDesc,
82+ _In_ UINT NumSourceAccelerationStructures,
83+ _In_reads_ (NumSourceAccelerationStructures) const D3D12_GPU_VIRTUAL_ADDRESS *pSourceAccelerationStructureData) = 0 ;
84+
85+ virtual void STDMETHODCALLTYPE CopyRaytracingAccelerationStructure (
86+ _In_ D3D12_GPU_VIRTUAL_ADDRESS DestAccelerationStructureData,
87+ _In_ D3D12_GPU_VIRTUAL_ADDRESS SourceAccelerationStructureData,
88+ _In_ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE Mode) = 0 ;
89+
90+ virtual void STDMETHODCALLTYPE SetDescriptorHeaps (
91+ _In_ UINT NumDescriptorHeaps,
92+ _In_reads_ (NumDescriptorHeaps) ID3D12DescriptorHeap *const *ppDescriptorHeaps) = 0 ;
93+
94+ virtual void STDMETHODCALLTYPE SetTopLevelAccelerationStructure (
95+ _In_ UINT RootParameterIndex,
96+ _In_ WRAPPED_GPU_POINTER BufferLocation) = 0 ;
97+
98+ virtual void STDMETHODCALLTYPE SetPipelineState1 (
99+ _In_ ID3D12RaytracingFallbackStateObject *pStateObject) = 0 ;
100+
101+ virtual void STDMETHODCALLTYPE DispatchRays (
102+ _In_ const D3D12_DISPATCH_RAYS_DESC *pDesc) = 0 ;
103+ };
104+
105+ class
106+ _declspec (uuid(" 0a662ea0-ab43-423a-848f-4824ae4b25ba" ))
107+ ID3D12RaytracingFallbackDevice : public IUnknown
108+ {
109+ public:
110+ virtual ~ID3D12RaytracingFallbackDevice () {};
111+
112+ virtual bool UsingRaytracingDriver () = 0 ;
113+
114+ // Automatically determine how to create WRAPPED_GPU_POINTER based on UsingRaytracingDriver()
115+ virtual WRAPPED_GPU_POINTER GetWrappedPointerSimple (UINT32 DescriptorHeapIndex, D3D12_GPU_VIRTUAL_ADDRESS GpuVA) = 0 ;
116+
117+ // Pre-condition: UsingRaytracingDriver() must be false
118+ virtual WRAPPED_GPU_POINTER GetWrappedPointerFromDescriptorHeapIndex (UINT32 DescriptorHeapIndex, UINT32 OffsetInBytes = 0 ) = 0 ;
119+
120+ // Pre-condition: UsingRaytracingDriver() must be true
121+ virtual WRAPPED_GPU_POINTER GetWrappedPointerFromGpuVA (D3D12_GPU_VIRTUAL_ADDRESS gpuVA) = 0 ;
122+
123+ virtual D3D12_RESOURCE_STATES GetAccelerationStructureResourceState () = 0 ;
124+
125+ virtual UINT STDMETHODCALLTYPE GetShaderIdentifierSize (void ) = 0 ;
126+
127+ virtual HRESULT STDMETHODCALLTYPE CreateStateObject (
128+ const D3D12_STATE_OBJECT_DESC *pDesc,
129+ REFIID riid,
130+ _COM_Outptr_ void **ppStateObject) = 0 ;
131+
132+ virtual void STDMETHODCALLTYPE GetRaytracingAccelerationStructurePrebuildInfo (
133+ _In_ const D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS *pDesc,
134+ _Out_ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO *pInfo) = 0 ;
135+
136+ virtual void QueryRaytracingCommandList (
137+ ID3D12GraphicsCommandList *pCommandList,
138+ REFIID riid,
139+ _COM_Outptr_ void **ppRaytracingCommandList) = 0 ;
140+
141+ virtual HRESULT STDMETHODCALLTYPE CreateRootSignature (
142+ _In_ UINT nodeMask,
143+ _In_reads_ (blobLengthInBytes) const void *pBlobWithRootSignature,
144+ _In_ SIZE_T blobLengthInBytes,
145+ REFIID riid,
146+ _COM_Outptr_ void **ppvRootSignature) = 0 ;
147+
148+ virtual HRESULT D3D12SerializeVersionedRootSignature (
149+ _In_ const D3D12_VERSIONED_ROOT_SIGNATURE_DESC* pRootSignature,
150+ _Out_ ID3DBlob** ppBlob,
151+ _Always_ (_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorBlob) = 0 ;
152+
153+ virtual HRESULT WINAPI D3D12SerializeRootSignature (
154+ _In_ const D3D12_ROOT_SIGNATURE_DESC* pRootSignature,
155+ _In_ D3D_ROOT_SIGNATURE_VERSION Version,
156+ _Out_ ID3DBlob** ppBlob,
157+ _Always_ (_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorBlob) = 0 ;
158+ };
159+
160+ enum CreateRaytracingFallbackDeviceFlags
161+ {
162+ None = 0x0 ,
163+ ForceComputeFallback = 0x1 ,
164+ EnableRootDescriptorsInShaderRecords = 0x2
165+ };
166+
167+ HRESULT D3D12CreateRaytracingFallbackDevice (
168+ _In_ ID3D12Device *pDevice,
169+ _In_ DWORD createRaytracingFallbackDeviceFlags,
170+ _In_ UINT NodeMask,
171+ _In_ REFIID riid,
172+ _COM_Outptr_opt_ void ** ppDevice);
0 commit comments