From 8ea3854d94eb1ff213be716a38493d601784810b Mon Sep 17 00:00:00 2001 From: skallweitNV <64953474+skallweitNV@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:08:38 +0200 Subject: work on gfx metal backend (#4287) * implement sampler state * implement input layout * implement fence object * buffer implementation * texture implementation * cleanup * add adapter enumeration * supported formats and allocation info * work on device and implement readBufferResource * skeleton for transient resource heap * initial work on command queue / buffers / encoders * fix uploading initial buffer data * implement buffer resource view * string utility functions * wip query pool implementation * cleanup * swapchain * wip * remove plain buffer view * extend gfxGetDeviceTypeName with metal * basic support for resource binding with compute shaders * needed for metal bindings * replace assert(0) with SLANG_UNIMPLEMENTED_X --- tools/gfx/metal/metal-command-buffer.cpp | 58 +++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 5 deletions(-) (limited to 'tools/gfx/metal/metal-command-buffer.cpp') diff --git a/tools/gfx/metal/metal-command-buffer.cpp b/tools/gfx/metal/metal-command-buffer.cpp index 08caa03dd..8aac6ea4b 100644 --- a/tools/gfx/metal/metal-command-buffer.cpp +++ b/tools/gfx/metal/metal-command-buffer.cpp @@ -21,12 +21,10 @@ ICommandBuffer* CommandBufferImpl::getInterface(const Guid& guid) return nullptr; } -void CommandBufferImpl::comFree() { } - -Result CommandBufferImpl::init(DeviceImpl* renderer, TransientResourceHeapImpl* transientHeap) +Result CommandBufferImpl::init(DeviceImpl* device, TransientResourceHeapImpl* transientHeap) { - m_renderer = renderer; - m_commandBuffer = m_renderer->m_commandQueue->commandBuffer(); + m_device = device; + m_commandBuffer = NS::RetainPtr(m_device->m_commandQueue->commandBuffer()); return SLANG_OK; } @@ -82,5 +80,55 @@ Result CommandBufferImpl::getNativeHandle(InteropHandle* outHandle) return SLANG_E_NOT_IMPLEMENTED; } +MTL::RenderCommandEncoder* CommandBufferImpl::getMetalRenderCommandEncoder() +{ + if (!m_metalRenderCommandEncoder) + { + endMetalCommandEncoder(); + // m_metalRenderCommandEncoder = NS::RetainPtr(m_commandBuffer->renderCommandEncoder()); + } + return m_metalRenderCommandEncoder.get(); +} + +MTL::ComputeCommandEncoder* CommandBufferImpl::getMetalComputeCommandEncoder() +{ + if (!m_metalComputeCommandEncoder) + { + endMetalCommandEncoder(); + m_metalComputeCommandEncoder = NS::RetainPtr(m_commandBuffer->computeCommandEncoder()); + } + return m_metalComputeCommandEncoder.get(); +} + +MTL::BlitCommandEncoder* CommandBufferImpl::getMetalBlitCommandEncoder() +{ + if (!m_metalBlitCommandEncoder) + { + endMetalCommandEncoder(); + m_metalBlitCommandEncoder = NS::RetainPtr(m_commandBuffer->blitCommandEncoder()); + } + return m_metalBlitCommandEncoder.get(); +} + +void CommandBufferImpl::endMetalCommandEncoder() +{ + if (m_metalRenderCommandEncoder) + { + m_metalRenderCommandEncoder->endEncoding(); + m_metalRenderCommandEncoder.reset(); + } + if (m_metalComputeCommandEncoder) + { + m_metalComputeCommandEncoder->endEncoding(); + m_metalComputeCommandEncoder.reset(); + } + if (m_metalBlitCommandEncoder) + { + m_metalBlitCommandEncoder->endEncoding(); + m_metalBlitCommandEncoder.reset(); + } +} + + } // namespace metal } // namespace gfx -- cgit v1.2.3