yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
11.7 KiB345 linesraw
1// metal-command-encoder.h
2#pragma once
3
4#include "metal-base.h"
5#include "metal-pipeline-state.h"
6#include "metal-render-pass.h"
7
8namespace gfx
9{
10
11using namespace Slang;
12
13namespace metal
14{
15
16class PipelineCommandEncoder : public ComObject
17{
18public:
19    CommandBufferImpl* m_commandBuffer;
20    MTL::CommandBuffer* m_metalCommandBuffer;
21    RefPtr<PipelineStateImpl> m_currentPipeline;
22
23    void init(CommandBufferImpl* commandBuffer);
24    void endEncodingImpl();
25
26    Result setPipelineStateImpl(IPipelineState* state, IShaderObject** outRootObject);
27};
28
29class ResourceCommandEncoder : public IResourceCommandEncoder, public PipelineCommandEncoder
30{
31public:
32    virtual void* getInterface(SlangUUID const& guid)
33    {
34        if (guid == GfxGUID::IID_IResourceCommandEncoder || guid == ISlangUnknown::getTypeGuid())
35            return this;
36        return nullptr;
37    }
38    virtual SLANG_NO_THROW SlangResult SLANG_MCALL
39    queryInterface(SlangUUID const& uuid, void** outObject) override
40    {
41        if (auto ptr = getInterface(uuid))
42        {
43            *outObject = ptr;
44            return SLANG_OK;
45        }
46        return SLANG_E_NO_INTERFACE;
47    }
48    virtual SLANG_NO_THROW uint32_t SLANG_MCALL addRef() override { return 1; }
49    virtual SLANG_NO_THROW uint32_t SLANG_MCALL release() override { return 1; }
50
51    virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override;
52
53    virtual SLANG_NO_THROW void SLANG_MCALL
54    writeTimestamp(IQueryPool* queryPool, GfxIndex index) override;
55
56    virtual SLANG_NO_THROW void SLANG_MCALL copyBuffer(
57        IBufferResource* dst,
58        Offset dstOffset,
59        IBufferResource* src,
60        Offset srcOffset,
61        Size size) override;
62
63    virtual SLANG_NO_THROW void SLANG_MCALL copyTexture(
64        ITextureResource* dst,
65        ResourceState dstState,
66        SubresourceRange dstSubresource,
67        ITextureResource::Offset3D dstOffset,
68        ITextureResource* src,
69        ResourceState srcState,
70        SubresourceRange srcSubresource,
71        ITextureResource::Offset3D srcOffset,
72        ITextureResource::Extents extent) override;
73
74    virtual SLANG_NO_THROW void SLANG_MCALL copyTextureToBuffer(
75        IBufferResource* dst,
76        Offset dstOffset,
77        Size dstSize,
78        Size dstRowStride,
79        ITextureResource* src,
80        ResourceState srcState,
81        SubresourceRange srcSubresource,
82        ITextureResource::Offset3D srcOffset,
83        ITextureResource::Extents extent) override;
84
85    virtual SLANG_NO_THROW void SLANG_MCALL
86    uploadBufferData(IBufferResource* buffer, Offset offset, Size size, void* data) override;
87
88    virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData(
89        ITextureResource* dst,
90        SubresourceRange subResourceRange,
91        ITextureResource::Offset3D offset,
92        ITextureResource::Extents extend,
93        ITextureResource::SubresourceData* subResourceData,
94        GfxCount subResourceDataCount) override;
95
96    virtual SLANG_NO_THROW void SLANG_MCALL bufferBarrier(
97        GfxCount count,
98        IBufferResource* const* buffers,
99        ResourceState src,
100        ResourceState dst) override;
101
102    virtual SLANG_NO_THROW void SLANG_MCALL textureBarrier(
103        GfxCount count,
104        ITextureResource* const* textures,
105        ResourceState src,
106        ResourceState dst) override;
107
108    virtual SLANG_NO_THROW void SLANG_MCALL textureSubresourceBarrier(
109        ITextureResource* texture,
110        SubresourceRange subresourceRange,
111        ResourceState src,
112        ResourceState dst) override;
113
114    void _clearColorImage(TextureResourceViewImpl* viewImpl, ClearValue* clearValue);
115
116    void _clearDepthImage(
117        TextureResourceViewImpl* viewImpl,
118        ClearValue* clearValue,
119        ClearResourceViewFlags::Enum flags);
120
121    virtual SLANG_NO_THROW void SLANG_MCALL clearResourceView(
122        IResourceView* view,
123        ClearValue* clearValue,
124        ClearResourceViewFlags::Enum flags) override;
125
126    virtual SLANG_NO_THROW void SLANG_MCALL resolveResource(
127        ITextureResource* source,
128        ResourceState sourceState,
129        SubresourceRange sourceRange,
130        ITextureResource* dest,
131        ResourceState destState,
132        SubresourceRange destRange) override;
133
134    virtual SLANG_NO_THROW void SLANG_MCALL resolveQuery(
135        IQueryPool* queryPool,
136        GfxIndex index,
137        GfxCount count,
138        IBufferResource* buffer,
139        Offset offset) override;
140
141
142    virtual SLANG_NO_THROW void SLANG_MCALL
143    beginDebugEvent(const char* name, float rgbColor[3]) override;
144    virtual SLANG_NO_THROW void SLANG_MCALL endDebugEvent() override;
145};
146
147class RenderCommandEncoder : public IRenderCommandEncoder, public ResourceCommandEncoder
148{
149    SLANG_GFX_FORWARD_RESOURCE_COMMAND_ENCODER_IMPL(ResourceCommandEncoder)
150    virtual void* getInterface(SlangUUID const& uuid) override
151    {
152        if (uuid == GfxGUID::IID_IResourceCommandEncoder ||
153            uuid == GfxGUID::IID_IRenderCommandEncoder || uuid == ISlangUnknown::getTypeGuid())
154        {
155            return this;
156        }
157        return nullptr;
158    }
159
160public:
161    RefPtr<RenderPassLayoutImpl> m_renderPassLayout;
162    RefPtr<FramebufferImpl> m_framebuffer;
163    NS::SharedPtr<MTL::RenderPassDescriptor> m_renderPassDesc;
164
165    ShortList<MTL::Viewport, 16> m_viewports;
166    ShortList<MTL::ScissorRect, 16> m_scissorRects;
167    MTL::PrimitiveType m_primitiveType = MTL::PrimitiveTypeTriangle;
168
169    ShortList<MTL::Buffer*, 16> m_vertexBuffers;
170    ShortList<NS::UInteger, 16> m_vertexBufferOffsets;
171
172    MTL::Buffer* m_indexBuffer = nullptr;
173    NS::UInteger m_indexBufferOffset = 0;
174    MTL::IndexType m_indexBufferType = MTL::IndexTypeUInt16;
175
176    uint32_t m_stencilReferenceValue = 0;
177
178public:
179    void beginPass(IRenderPassLayout* renderPass, IFramebuffer* framebuffer);
180
181    virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override;
182
183    virtual SLANG_NO_THROW Result SLANG_MCALL
184    bindPipeline(IPipelineState* pipelineState, IShaderObject** outRootObject) override;
185
186    virtual SLANG_NO_THROW Result SLANG_MCALL
187    bindPipelineWithRootObject(IPipelineState* pipelineState, IShaderObject* rootObject) override;
188
189    virtual SLANG_NO_THROW void SLANG_MCALL
190    setViewports(GfxCount count, const Viewport* viewports) override;
191
192    virtual SLANG_NO_THROW void SLANG_MCALL
193    setScissorRects(GfxCount count, const ScissorRect* rects) override;
194
195    virtual SLANG_NO_THROW void SLANG_MCALL
196    setPrimitiveTopology(PrimitiveTopology topology) override;
197
198    virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers(
199        GfxIndex startSlot,
200        GfxCount slotCount,
201        IBufferResource* const* buffers,
202        const Offset* offsets) override;
203
204    virtual SLANG_NO_THROW void SLANG_MCALL
205    setIndexBuffer(IBufferResource* buffer, Format indexFormat, Offset offset = 0) override;
206
207    virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override;
208
209    virtual SLANG_NO_THROW Result SLANG_MCALL setSamplePositions(
210        GfxCount samplesPerPixel,
211        GfxCount pixelCount,
212        const SamplePosition* samplePositions) override;
213
214    Result prepareDraw(MTL::RenderCommandEncoder*& encoder);
215
216    virtual SLANG_NO_THROW Result SLANG_MCALL
217    draw(GfxCount vertexCount, GfxIndex startVertex = 0) override;
218    virtual SLANG_NO_THROW Result SLANG_MCALL
219    drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) override;
220
221    virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect(
222        GfxCount maxDrawCount,
223        IBufferResource* argBuffer,
224        Offset argOffset,
225        IBufferResource* countBuffer,
226        Offset countOffset) override;
227
228    virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect(
229        GfxCount maxDrawCount,
230        IBufferResource* argBuffer,
231        Offset argOffset,
232        IBufferResource* countBuffer,
233        Offset countOffset) override;
234
235    virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced(
236        GfxCount vertexCount,
237        GfxCount instanceCount,
238        GfxIndex startVertex,
239        GfxIndex startInstanceLocation) override;
240
241    virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced(
242        GfxCount indexCount,
243        GfxCount instanceCount,
244        GfxIndex startIndexLocation,
245        GfxIndex baseVertexLocation,
246        GfxIndex startInstanceLocation) override;
247
248    virtual SLANG_NO_THROW Result SLANG_MCALL drawMeshTasks(int x, int y, int z) override;
249};
250
251class ComputeCommandEncoder : public IComputeCommandEncoder, public ResourceCommandEncoder
252{
253public:
254    SLANG_GFX_FORWARD_RESOURCE_COMMAND_ENCODER_IMPL(ResourceCommandEncoder)
255    virtual void* getInterface(SlangUUID const& uuid) override
256    {
257        if (uuid == GfxGUID::IID_IResourceCommandEncoder ||
258            uuid == GfxGUID::IID_IComputeCommandEncoder || uuid == ISlangUnknown::getTypeGuid())
259        {
260            return this;
261        }
262        return nullptr;
263    }
264
265    virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override;
266
267    virtual SLANG_NO_THROW Result SLANG_MCALL
268    bindPipeline(IPipelineState* pipelineState, IShaderObject** outRootObject) override;
269
270    virtual SLANG_NO_THROW Result SLANG_MCALL
271    bindPipelineWithRootObject(IPipelineState* pipelineState, IShaderObject* rootObject) override;
272
273    virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) override;
274
275    virtual SLANG_NO_THROW Result SLANG_MCALL
276    dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) override;
277};
278
279class RayTracingCommandEncoder : public IRayTracingCommandEncoder, public ResourceCommandEncoder
280{
281public:
282    SLANG_GFX_FORWARD_RESOURCE_COMMAND_ENCODER_IMPL(ResourceCommandEncoder)
283    virtual void* getInterface(SlangUUID const& uuid) override
284    {
285        if (uuid == GfxGUID::IID_IResourceCommandEncoder ||
286            uuid == GfxGUID::IID_IRayTracingCommandEncoder || uuid == ISlangUnknown::getTypeGuid())
287        {
288            return this;
289        }
290        return nullptr;
291    }
292
293public:
294    void _memoryBarrier(
295        int count,
296        IAccelerationStructure* const* structures,
297        AccessFlag srcAccess,
298        AccessFlag destAccess);
299
300    void _queryAccelerationStructureProperties(
301        GfxCount accelerationStructureCount,
302        IAccelerationStructure* const* accelerationStructures,
303        GfxCount queryCount,
304        AccelerationStructureQueryDesc* queryDescs);
305
306    virtual SLANG_NO_THROW void SLANG_MCALL buildAccelerationStructure(
307        const IAccelerationStructure::BuildDesc& desc,
308        GfxCount propertyQueryCount,
309        AccelerationStructureQueryDesc* queryDescs) override;
310
311    virtual SLANG_NO_THROW void SLANG_MCALL copyAccelerationStructure(
312        IAccelerationStructure* dest,
313        IAccelerationStructure* src,
314        AccelerationStructureCopyMode mode) override;
315
316    virtual SLANG_NO_THROW void SLANG_MCALL queryAccelerationStructureProperties(
317        GfxCount accelerationStructureCount,
318        IAccelerationStructure* const* accelerationStructures,
319        GfxCount queryCount,
320        AccelerationStructureQueryDesc* queryDescs) override;
321
322    virtual SLANG_NO_THROW void SLANG_MCALL
323    serializeAccelerationStructure(DeviceAddress dest, IAccelerationStructure* source) override;
324
325    virtual SLANG_NO_THROW void SLANG_MCALL
326    deserializeAccelerationStructure(IAccelerationStructure* dest, DeviceAddress source) override;
327
328    virtual SLANG_NO_THROW Result SLANG_MCALL
329    bindPipeline(IPipelineState* pipeline, IShaderObject** outRootObject) override;
330
331    virtual SLANG_NO_THROW Result SLANG_MCALL
332    bindPipelineWithRootObject(IPipelineState* pipelineState, IShaderObject* rootObject) override;
333
334    virtual SLANG_NO_THROW Result SLANG_MCALL dispatchRays(
335        GfxIndex raygenShaderIndex,
336        IShaderTable* shaderTable,
337        GfxCount width,
338        GfxCount height,
339        GfxCount depth) override;
340
341    virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override;
342};
343
344} // namespace metal
345} // namespace gfx