yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
3.7 KiB140 linesraw
1// metal-command-buffer.cpp
2#include "metal-command-buffer.h"
3
4#include "metal-command-encoder.h"
5#include "metal-command-queue.h"
6#include "metal-device.h"
7#include "metal-shader-object.h"
8
9namespace gfx
10{
11
12using namespace Slang;
13
14namespace metal
15{
16
17ICommandBuffer* CommandBufferImpl::getInterface(const Guid& guid)
18{
19    if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_ICommandBuffer)
20        return static_cast<ICommandBuffer*>(this);
21    return nullptr;
22}
23
24Result CommandBufferImpl::init(DeviceImpl* device, TransientResourceHeapImpl* transientHeap)
25{
26    m_device = device;
27    m_commandBuffer = NS::RetainPtr(m_device->m_commandQueue->commandBuffer());
28    return SLANG_OK;
29}
30
31void CommandBufferImpl::encodeRenderCommands(
32    IRenderPassLayout* renderPass,
33    IFramebuffer* framebuffer,
34    IRenderCommandEncoder** outEncoder)
35{
36    if (!m_renderCommandEncoder)
37    {
38        m_renderCommandEncoder = new RenderCommandEncoder;
39        m_renderCommandEncoder->init(this);
40    }
41    m_renderCommandEncoder->beginPass(renderPass, framebuffer);
42    *outEncoder = m_renderCommandEncoder;
43}
44
45void CommandBufferImpl::encodeComputeCommands(IComputeCommandEncoder** outEncoder)
46{
47    if (!m_computeCommandEncoder)
48    {
49        m_computeCommandEncoder = new ComputeCommandEncoder;
50        m_computeCommandEncoder->init(this);
51    }
52    *outEncoder = m_computeCommandEncoder;
53}
54
55void CommandBufferImpl::encodeResourceCommands(IResourceCommandEncoder** outEncoder)
56{
57    if (!m_resourceCommandEncoder)
58    {
59        m_resourceCommandEncoder = new ResourceCommandEncoder;
60        m_resourceCommandEncoder->init(this);
61    }
62    *outEncoder = m_resourceCommandEncoder;
63}
64
65void CommandBufferImpl::encodeRayTracingCommands(IRayTracingCommandEncoder** outEncoder)
66{
67    if (!m_rayTracingCommandEncoder)
68    {
69        m_rayTracingCommandEncoder = new RayTracingCommandEncoder;
70        m_rayTracingCommandEncoder->init(this);
71    }
72    *outEncoder = m_rayTracingCommandEncoder;
73}
74
75void CommandBufferImpl::close()
76{
77    // m_commandBuffer->commit();
78}
79
80Result CommandBufferImpl::getNativeHandle(InteropHandle* outHandle)
81{
82    outHandle->api = InteropHandleAPI::Metal;
83    outHandle->handleValue = reinterpret_cast<intptr_t>(m_commandBuffer.get());
84    return SLANG_OK;
85}
86
87MTL::RenderCommandEncoder* CommandBufferImpl::getMetalRenderCommandEncoder(
88    MTL::RenderPassDescriptor* renderPassDesc)
89{
90    if (!m_metalRenderCommandEncoder)
91    {
92        endMetalCommandEncoder();
93        m_metalRenderCommandEncoder =
94            NS::RetainPtr(m_commandBuffer->renderCommandEncoder(renderPassDesc));
95    }
96    return m_metalRenderCommandEncoder.get();
97}
98
99MTL::ComputeCommandEncoder* CommandBufferImpl::getMetalComputeCommandEncoder()
100{
101    if (!m_metalComputeCommandEncoder)
102    {
103        endMetalCommandEncoder();
104        m_metalComputeCommandEncoder = NS::RetainPtr(m_commandBuffer->computeCommandEncoder());
105    }
106    return m_metalComputeCommandEncoder.get();
107}
108
109MTL::BlitCommandEncoder* CommandBufferImpl::getMetalBlitCommandEncoder()
110{
111    if (!m_metalBlitCommandEncoder)
112    {
113        endMetalCommandEncoder();
114        m_metalBlitCommandEncoder = NS::RetainPtr(m_commandBuffer->blitCommandEncoder());
115    }
116    return m_metalBlitCommandEncoder.get();
117}
118
119void CommandBufferImpl::endMetalCommandEncoder()
120{
121    if (m_metalRenderCommandEncoder)
122    {
123        m_metalRenderCommandEncoder->endEncoding();
124        m_metalRenderCommandEncoder.reset();
125    }
126    if (m_metalComputeCommandEncoder)
127    {
128        m_metalComputeCommandEncoder->endEncoding();
129        m_metalComputeCommandEncoder.reset();
130    }
131    if (m_metalBlitCommandEncoder)
132    {
133        m_metalBlitCommandEncoder->endEncoding();
134        m_metalBlitCommandEncoder.reset();
135    }
136}
137
138
139} // namespace metal
140} // namespace gfx