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