yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
7.1 KiB171 linesraw
1// metal-device.h
2#pragma once
3
4#include "../simple-transient-resource-heap.h"
5#include "metal-base.h"
6#include "metal-device.h"
7#include "metal-framebuffer.h"
8
9namespace gfx
10{
11
12using namespace Slang;
13
14namespace metal
15{
16
17class DeviceImpl : public RendererBase
18{
19public:
20    // Renderer implementation
21    virtual SLANG_NO_THROW Result SLANG_MCALL initialize(const Desc& desc) override;
22    virtual SLANG_NO_THROW Result SLANG_MCALL
23    getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) override;
24    virtual SLANG_NO_THROW Result SLANG_MCALL createTransientResourceHeap(
25        const ITransientResourceHeap::Desc& desc,
26        ITransientResourceHeap** outHeap) override;
27    virtual SLANG_NO_THROW Result SLANG_MCALL
28    createCommandQueue(const ICommandQueue::Desc& desc, ICommandQueue** outQueue) override;
29    virtual SLANG_NO_THROW Result SLANG_MCALL createSwapchain(
30        const ISwapchain::Desc& desc,
31        WindowHandle window,
32        ISwapchain** outSwapchain) override;
33    virtual SLANG_NO_THROW Result SLANG_MCALL createFramebufferLayout(
34        const IFramebufferLayout::Desc& desc,
35        IFramebufferLayout** outLayout) override;
36    virtual SLANG_NO_THROW Result SLANG_MCALL
37    createFramebuffer(const IFramebuffer::Desc& desc, IFramebuffer** outFramebuffer) override;
38    virtual SLANG_NO_THROW Result SLANG_MCALL createRenderPassLayout(
39        const IRenderPassLayout::Desc& desc,
40        IRenderPassLayout** outRenderPassLayout) override;
41    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
42        const ITextureResource::Desc& desc,
43        const ITextureResource::SubresourceData* initData,
44        ITextureResource** outResource) override;
45    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
46        const IBufferResource::Desc& desc,
47        const void* initData,
48        IBufferResource** outResource) override;
49    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferFromNativeHandle(
50        InteropHandle handle,
51        const IBufferResource::Desc& srcDesc,
52        IBufferResource** outResource) override;
53    virtual SLANG_NO_THROW Result SLANG_MCALL
54    createSamplerState(ISamplerState::Desc const& desc, ISamplerState** outSampler) override;
55
56    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
57        ITextureResource* texture,
58        IResourceView::Desc const& desc,
59        IResourceView** outView) override;
60    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
61        IBufferResource* buffer,
62        IBufferResource* counterBuffer,
63        IResourceView::Desc const& desc,
64        IResourceView** outView) override;
65
66    virtual SLANG_NO_THROW Result SLANG_MCALL
67    createInputLayout(IInputLayout::Desc const& desc, IInputLayout** outLayout) override;
68
69    virtual Result createShaderObjectLayout(
70        slang::ISession* session,
71        slang::TypeLayoutReflection* typeLayout,
72        ShaderObjectLayoutBase** outLayout) override;
73    virtual Result createShaderObject(ShaderObjectLayoutBase* layout, IShaderObject** outObject)
74        override;
75    virtual Result createMutableShaderObject(
76        ShaderObjectLayoutBase* layout,
77        IShaderObject** outObject) override;
78    virtual SLANG_NO_THROW Result SLANG_MCALL
79    createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override;
80
81    virtual SLANG_NO_THROW Result SLANG_MCALL
82    createShaderTable(const IShaderTable::Desc& desc, IShaderTable** outShaderTable) override;
83    virtual SLANG_NO_THROW Result SLANG_MCALL createProgram(
84        const IShaderProgram::Desc& desc,
85        IShaderProgram** outProgram,
86        ISlangBlob** outDiagnosticBlob) override;
87    virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
88        const GraphicsPipelineStateDesc& desc,
89        IPipelineState** outState) override;
90    virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
91        const ComputePipelineStateDesc& desc,
92        IPipelineState** outState) override;
93    virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState(
94        const RayTracingPipelineStateDesc& desc,
95        IPipelineState** outState) override;
96    virtual SLANG_NO_THROW Result SLANG_MCALL
97    createQueryPool(const IQueryPool::Desc& desc, IQueryPool** outPool) override;
98
99    virtual SLANG_NO_THROW SlangResult SLANG_MCALL readTextureResource(
100        ITextureResource* texture,
101        ResourceState state,
102        ISlangBlob** outBlob,
103        Size* outRowPitch,
104        Size* outPixelSize) override;
105
106    virtual SLANG_NO_THROW SlangResult SLANG_MCALL readBufferResource(
107        IBufferResource* buffer,
108        Offset offset,
109        Size size,
110        ISlangBlob** outBlob) override;
111
112    virtual SLANG_NO_THROW Result SLANG_MCALL getAccelerationStructurePrebuildInfo(
113        const IAccelerationStructure::BuildInputs& buildInputs,
114        IAccelerationStructure::PrebuildInfo* outPrebuildInfo) override;
115
116    virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure(
117        const IAccelerationStructure::CreateDesc& desc,
118        IAccelerationStructure** outView) override;
119
120    virtual SLANG_NO_THROW Result SLANG_MCALL getTextureAllocationInfo(
121        const ITextureResource::Desc& desc,
122        Size* outSize,
123        Size* outAlignment) override;
124
125    virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment(Size* outAlignment) override;
126
127    virtual SLANG_NO_THROW Result SLANG_MCALL
128    createFence(const IFence::Desc& desc, IFence** outFence) override;
129
130    virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(
131        GfxCount fenceCount,
132        IFence** fences,
133        uint64_t* fenceValues,
134        bool waitForAll,
135        uint64_t timeout) override;
136
137    // void waitForGpu();
138    virtual SLANG_NO_THROW const DeviceInfo& SLANG_MCALL getDeviceInfo() const override;
139    virtual SLANG_NO_THROW Result SLANG_MCALL
140    getNativeDeviceHandles(InteropHandles* outHandles) override;
141    ~DeviceImpl();
142
143public:
144    DeviceInfo m_info;
145    String m_adapterName;
146
147    bool captureEnabled() const { return std::getenv("MTL_CAPTURE") != nullptr; }
148
149    Desc m_desc;
150    NS::SharedPtr<MTL::Device> m_device;
151    NS::SharedPtr<MTL::CommandQueue> m_commandQueue;
152
153    uint32_t m_queueAllocCount;
154
155    bool m_hasArgumentBufferTier2 = false;
156
157    // A list to hold objects that may have a strong back reference to the device
158    // instance. Because of the pipeline cache in `RendererBase`, there could be a reference
159    // cycle among `DeviceImpl`->`PipelineStateImpl`->`ShaderProgramImpl`->`DeviceImpl`.
160    // Depending on whether a `PipelineState` objects gets stored in pipeline cache, there
161    // may or may not be such a reference cycle.
162    // We need to hold strong references to any objects that may become part of the reference
163    // cycle here, so that when objects like `ShaderProgramImpl` lost all public refernces, we
164    // can always safely break the strong reference in `ShaderProgramImpl::m_device` without
165    // worrying the `ShaderProgramImpl` object getting destroyed after the completion of
166    // `DeviceImpl::~DeviceImpl()'.
167    ChunkedList<RefPtr<RefObject>, 1024> m_deviceObjectsWithPotentialBackReferences;
168};
169
170} // namespace metal
171} // namespace gfx