yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
10.2 KiB278 linesraw
1// d3d12-device.h
2#pragma once
3#include "d3d12-command-buffer.h"
4#include "d3d12-command-queue.h"
5#include "d3d12-texture.h"
6#include "d3d12-transient-heap.h"
7
8#include <d3d12.h>
9#include <d3d12sdklayers.h>
10
11namespace gfx
12{
13namespace d3d12
14{
15
16using namespace Slang;
17
18// Define function pointer types for PIX library.
19typedef HRESULT(WINAPI* PFN_BeginEventOnCommandList)(
20    ID3D12GraphicsCommandList* commandList,
21    UINT64 color,
22    PCSTR formatString);
23typedef HRESULT(WINAPI* PFN_EndEventOnCommandList)(ID3D12GraphicsCommandList* commandList);
24
25struct D3D12DeviceInfo
26{
27    void clear()
28    {
29        m_dxgiFactory.setNull();
30        m_device.setNull();
31        m_adapter.setNull();
32        m_desc = {};
33        m_desc1 = {};
34        m_isWarp = false;
35        m_isSoftware = false;
36    }
37
38    bool m_isWarp;
39    bool m_isSoftware;
40    ComPtr<IDXGIFactory> m_dxgiFactory;
41    ComPtr<ID3D12Device> m_device;
42    ComPtr<ID3D12Device5> m_device5;
43    ComPtr<IDXGIAdapter> m_adapter;
44    DXGI_ADAPTER_DESC m_desc;
45    DXGI_ADAPTER_DESC1 m_desc1;
46};
47
48class DeviceImpl : public RendererBase
49{
50public:
51    Desc m_desc;
52    D3D12DeviceExtendedDesc m_extendedDesc;
53
54    DeviceInfo m_info;
55    String m_adapterName;
56
57    bool m_isInitialized = false;
58
59    ComPtr<ID3D12Debug> m_dxDebug;
60
61    static const bool g_isAftermathEnabled;
62
63    D3D12DeviceInfo m_deviceInfo;
64    ID3D12Device* m_device = nullptr;
65    ID3D12Device5* m_device5 = nullptr;
66
67    VirtualObjectPool m_queueIndexAllocator;
68
69    RefPtr<CommandQueueImpl> m_resourceCommandQueue;
70    RefPtr<TransientResourceHeapImpl> m_resourceCommandTransientHeap;
71
72    RefPtr<D3D12GeneralExpandingDescriptorHeap> m_rtvAllocator;
73    RefPtr<D3D12GeneralExpandingDescriptorHeap> m_dsvAllocator;
74
75    // Space in the GPU-visible heaps is precious, so we will also keep
76    // around CPU-visible heaps for storing shader-objects' descriptors in a format
77    // that is ready for copying into the GPU-visible heaps as needed.
78    //
79    RefPtr<D3D12GeneralExpandingDescriptorHeap> m_cpuViewHeap;    ///< Cbv, Srv, Uav
80    RefPtr<D3D12GeneralExpandingDescriptorHeap> m_cpuSamplerHeap; ///< Heap for samplers
81
82    // Dll entry points
83    PFN_D3D12_GET_DEBUG_INTERFACE m_D3D12GetDebugInterface = nullptr;
84    PFN_D3D12_CREATE_DEVICE m_D3D12CreateDevice = nullptr;
85    PFN_D3D12_SERIALIZE_ROOT_SIGNATURE m_D3D12SerializeRootSignature = nullptr;
86    PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE m_D3D12SerializeVersionedRootSignature = nullptr;
87    PFN_BeginEventOnCommandList m_BeginEventOnCommandList = nullptr;
88    PFN_EndEventOnCommandList m_EndEventOnCommandList = nullptr;
89
90    bool m_nvapi = false;
91
92    // Command signatures required for indirect draws. These indicate the format of the indirect
93    // as well as the command type to be used (DrawInstanced and DrawIndexedInstanced, in this
94    // case).
95    ComPtr<ID3D12CommandSignature> drawIndirectCmdSignature;
96    ComPtr<ID3D12CommandSignature> drawIndexedIndirectCmdSignature;
97    ComPtr<ID3D12CommandSignature> dispatchIndirectCmdSignature;
98
99public:
100    virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc) override;
101    virtual SLANG_NO_THROW Result SLANG_MCALL
102    getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) override;
103
104    virtual SLANG_NO_THROW Result SLANG_MCALL
105    createCommandQueue(const ICommandQueue::Desc& desc, ICommandQueue** outQueue) override;
106    virtual SLANG_NO_THROW Result SLANG_MCALL createTransientResourceHeap(
107        const ITransientResourceHeap::Desc& desc,
108        ITransientResourceHeap** outHeap) override;
109    virtual SLANG_NO_THROW Result SLANG_MCALL createSwapchain(
110        const ISwapchain::Desc& desc,
111        WindowHandle window,
112        ISwapchain** outSwapchain) override;
113
114    virtual SLANG_NO_THROW Result SLANG_MCALL getTextureAllocationInfo(
115        const ITextureResource::Desc& desc,
116        Size* outSize,
117        Size* outAlignment) override;
118    virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment(Size* outAlignment) override;
119    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
120        const ITextureResource::Desc& desc,
121        const ITextureResource::SubresourceData* initData,
122        ITextureResource** outResource) override;
123    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureFromNativeHandle(
124        InteropHandle handle,
125        const ITextureResource::Desc& srcDesc,
126        ITextureResource** outResource) override;
127    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
128        const IBufferResource::Desc& desc,
129        const void* initData,
130        IBufferResource** outResource) override;
131    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferFromNativeHandle(
132        InteropHandle handle,
133        const IBufferResource::Desc& srcDesc,
134        IBufferResource** outResource) override;
135
136    virtual SLANG_NO_THROW Result SLANG_MCALL
137    createSamplerState(ISamplerState::Desc const& desc, ISamplerState** outSampler) override;
138
139    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
140        ITextureResource* texture,
141        IResourceView::Desc const& desc,
142        IResourceView** outView) override;
143    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
144        IBufferResource* buffer,
145        IBufferResource* counterBuffer,
146        IResourceView::Desc const& desc,
147        IResourceView** outView) override;
148
149    virtual SLANG_NO_THROW Result SLANG_MCALL
150    createFramebuffer(IFramebuffer::Desc const& desc, IFramebuffer** outFrameBuffer) override;
151
152    virtual SLANG_NO_THROW Result SLANG_MCALL createFramebufferLayout(
153        IFramebufferLayout::Desc const& desc,
154        IFramebufferLayout** outLayout) override;
155
156    virtual SLANG_NO_THROW Result SLANG_MCALL createRenderPassLayout(
157        const IRenderPassLayout::Desc& desc,
158        IRenderPassLayout** outRenderPassLayout) override;
159
160    virtual SLANG_NO_THROW Result SLANG_MCALL
161    createInputLayout(IInputLayout::Desc const& desc, IInputLayout** outLayout) override;
162
163    virtual Result createShaderObjectLayout(
164        slang::ISession* session,
165        slang::TypeLayoutReflection* typeLayout,
166        ShaderObjectLayoutBase** outLayout) override;
167    virtual Result createShaderObject(ShaderObjectLayoutBase* layout, IShaderObject** outObject)
168        override;
169    virtual Result createMutableShaderObject(
170        ShaderObjectLayoutBase* layout,
171        IShaderObject** outObject) override;
172    virtual SLANG_NO_THROW Result SLANG_MCALL
173    createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override;
174
175    virtual SLANG_NO_THROW Result SLANG_MCALL
176    createShaderTable(const IShaderTable::Desc& desc, IShaderTable** outShaderTable) override;
177    virtual SLANG_NO_THROW Result SLANG_MCALL createProgram(
178        const IShaderProgram::Desc& desc,
179        IShaderProgram** outProgram,
180        ISlangBlob** outDiagnostics) override;
181    virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
182        const GraphicsPipelineStateDesc& desc,
183        IPipelineState** outState) override;
184    virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
185        const ComputePipelineStateDesc& desc,
186        IPipelineState** outState) override;
187
188    virtual SLANG_NO_THROW Result SLANG_MCALL
189    createQueryPool(const IQueryPool::Desc& desc, IQueryPool** outState) override;
190
191    virtual SLANG_NO_THROW Result SLANG_MCALL
192    createFence(const IFence::Desc& desc, IFence** outFence) override;
193
194    virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(
195        GfxCount fenceCount,
196        IFence** fences,
197        uint64_t* fenceValues,
198        bool waitForAll,
199        uint64_t timeout) override;
200
201    virtual SLANG_NO_THROW SlangResult SLANG_MCALL readTextureResource(
202        ITextureResource* resource,
203        ResourceState state,
204        ISlangBlob** outBlob,
205        Size* outRowPitch,
206        Size* outPixelSize) override;
207
208    virtual SLANG_NO_THROW SlangResult SLANG_MCALL readBufferResource(
209        IBufferResource* resource,
210        Offset offset,
211        Size size,
212        ISlangBlob** outBlob) override;
213
214    virtual SLANG_NO_THROW const gfx::DeviceInfo& SLANG_MCALL getDeviceInfo() const override;
215
216    virtual SLANG_NO_THROW Result SLANG_MCALL
217    getNativeDeviceHandles(InteropHandles* outHandles) override;
218
219    ~DeviceImpl();
220
221    virtual SLANG_NO_THROW Result SLANG_MCALL getAccelerationStructurePrebuildInfo(
222        const IAccelerationStructure::BuildInputs& buildInputs,
223        IAccelerationStructure::PrebuildInfo* outPrebuildInfo) override;
224    virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure(
225        const IAccelerationStructure::CreateDesc& desc,
226        IAccelerationStructure** outView) override;
227    virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState(
228        const RayTracingPipelineStateDesc& desc,
229        IPipelineState** outState) override;
230
231public:
232    static void* loadProc(SharedLibrary::Handle module, char const* name);
233
234    Result createCommandQueueImpl(CommandQueueImpl** outQueue);
235
236    Result createTransientResourceHeapImpl(
237        ITransientResourceHeap::Flags::Enum flags,
238        Size constantBufferSize,
239        uint32_t viewDescriptors,
240        uint32_t samplerDescriptors,
241        TransientResourceHeapImpl** outHeap);
242
243    Result createBuffer(
244        const D3D12_RESOURCE_DESC& resourceDesc,
245        const void* srcData,
246        Size srcDataSize,
247        D3D12_RESOURCE_STATES finalState,
248        D3D12Resource& resourceOut,
249        bool isShared,
250        MemoryType access = MemoryType::DeviceLocal);
251
252    Result captureTextureToSurface(
253        TextureResourceImpl* resource,
254        ResourceState state,
255        ISlangBlob** blob,
256        Size* outRowPitch,
257        Size* outPixelSize);
258
259    Result _createDevice(
260        DeviceCheckFlags deviceCheckFlags,
261        const AdapterLUID* adapterLUID,
262        D3D_FEATURE_LEVEL featureLevel,
263        D3D12DeviceInfo& outDeviceInfo);
264
265    struct ResourceCommandRecordInfo
266    {
267        ComPtr<ICommandBuffer> commandBuffer;
268        ID3D12GraphicsCommandList* d3dCommandList;
269    };
270    ResourceCommandRecordInfo encodeResourceCommands();
271    void submitResourceCommandsAndWait(const ResourceCommandRecordInfo& info);
272
273private:
274    void processExperimentalFeaturesDesc(SharedLibrary::Handle d3dModule, void* desc);
275};
276
277} // namespace d3d12
278} // namespace gfx