yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
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{ 19if (guid == GfxGUID ::IID_ISlangUnknown || guid == GfxGUID ::IID_ICommandBuffer ) 20return static_cast < ICommandBuffer *> (this ); 21return nullptr ; 22} 23 24Result CommandBufferImpl ::init (DeviceImpl * device ,TransientResourceHeapImpl * transientHeap ) 25{ 26m_device = device ; 27m_commandBuffer = NS ::RetainPtr (m_device -> m_commandQueue -> commandBuffer ()); 28return SLANG_OK ; 29} 30 31void CommandBufferImpl ::encodeRenderCommands ( 32IRenderPassLayout * renderPass , 33IFramebuffer * framebuffer , 34IRenderCommandEncoder ** outEncoder ) 35{ 36if (!m_renderCommandEncoder ) 37 { 38m_renderCommandEncoder = new RenderCommandEncoder ; 39m_renderCommandEncoder -> init (this ); 40 } 41m_renderCommandEncoder -> beginPass (renderPass ,framebuffer ); 42* outEncoder = m_renderCommandEncoder ; 43} 44 45void CommandBufferImpl ::encodeComputeCommands (IComputeCommandEncoder ** outEncoder ) 46{ 47if (!m_computeCommandEncoder ) 48 { 49m_computeCommandEncoder = new ComputeCommandEncoder ; 50m_computeCommandEncoder -> init (this ); 51 } 52* outEncoder = m_computeCommandEncoder ; 53} 54 55void CommandBufferImpl ::encodeResourceCommands (IResourceCommandEncoder ** outEncoder ) 56{ 57if (!m_resourceCommandEncoder ) 58 { 59m_resourceCommandEncoder = new ResourceCommandEncoder ; 60m_resourceCommandEncoder -> init (this ); 61 } 62* outEncoder = m_resourceCommandEncoder ; 63} 64 65void CommandBufferImpl ::encodeRayTracingCommands (IRayTracingCommandEncoder ** outEncoder ) 66{ 67if (!m_rayTracingCommandEncoder ) 68 { 69m_rayTracingCommandEncoder = new RayTracingCommandEncoder ; 70m_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{ 82outHandle -> api = InteropHandleAPI ::Metal ; 83outHandle -> handleValue = reinterpret_cast < intptr_t > (m_commandBuffer .get ()); 84return SLANG_OK ; 85} 86 87MTL ::RenderCommandEncoder * CommandBufferImpl ::getMetalRenderCommandEncoder ( 88MTL ::RenderPassDescriptor * renderPassDesc ) 89{ 90if (!m_metalRenderCommandEncoder ) 91 { 92endMetalCommandEncoder (); 93m_metalRenderCommandEncoder = 94NS ::RetainPtr (m_commandBuffer -> renderCommandEncoder (renderPassDesc )); 95 } 96return m_metalRenderCommandEncoder .get (); 97} 98 99MTL ::ComputeCommandEncoder * CommandBufferImpl ::getMetalComputeCommandEncoder () 100{ 101if (!m_metalComputeCommandEncoder ) 102 { 103endMetalCommandEncoder (); 104m_metalComputeCommandEncoder = NS ::RetainPtr (m_commandBuffer -> computeCommandEncoder ()); 105 } 106return m_metalComputeCommandEncoder .get (); 107} 108 109MTL ::BlitCommandEncoder * CommandBufferImpl ::getMetalBlitCommandEncoder () 110{ 111if (!m_metalBlitCommandEncoder ) 112 { 113endMetalCommandEncoder (); 114m_metalBlitCommandEncoder = NS ::RetainPtr (m_commandBuffer -> blitCommandEncoder ()); 115 } 116return m_metalBlitCommandEncoder .get (); 117} 118 119void CommandBufferImpl ::endMetalCommandEncoder () 120{ 121if (m_metalRenderCommandEncoder ) 122 { 123m_metalRenderCommandEncoder -> endEncoding (); 124m_metalRenderCommandEncoder .reset (); 125 } 126if (m_metalComputeCommandEncoder ) 127 { 128m_metalComputeCommandEncoder -> endEncoding (); 129m_metalComputeCommandEncoder .reset (); 130 } 131if (m_metalBlitCommandEncoder ) 132 { 133m_metalBlitCommandEncoder -> endEncoding (); 134m_metalBlitCommandEncoder .reset (); 135 } 136} 137 138 139}// namespace metal 140}// namespace gfx