From a431e701798d8824f60f7b440a73d2f1d8a895ea Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Fri, 24 Dec 2021 18:56:21 -0400 Subject: [PATCH] metal: add internal compute encoder APIs --- src/modules/graphics/metal/Graphics.h | 5 +++++ src/modules/graphics/metal/Graphics.mm | 28 ++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/metal/Graphics.h b/src/modules/graphics/metal/Graphics.h index e1c356d02..bd6b39df0 100644 --- a/src/modules/graphics/metal/Graphics.h +++ b/src/modules/graphics/metal/Graphics.h @@ -129,6 +129,10 @@ public: id getBlitEncoder() const { return blitEncoder; } void submitBlitEncoder(); + id useComputeEncoder(); + id getComputeEncoder() const { return computeEncoder; } + void submitComputeEncoder(); + id getCachedSampler(const SamplerState &s); StreamBuffer *getUniformBuffer() const { return uniformBuffer; } @@ -206,6 +210,7 @@ private: id commandBuffer; id renderEncoder; id blitEncoder; + id computeEncoder; CAMetalLayer *metalLayer; id activeDrawable; diff --git a/src/modules/graphics/metal/Graphics.mm b/src/modules/graphics/metal/Graphics.mm index e17534b7d..8a5be01e1 100644 --- a/src/modules/graphics/metal/Graphics.mm +++ b/src/modules/graphics/metal/Graphics.mm @@ -488,6 +488,7 @@ void Graphics::submitCommandBuffer(SubmitType type) { submitRenderEncoder(type); submitBlitEncoder(); + submitComputeEncoder(); if (commandBuffer != nil) { @@ -528,6 +529,7 @@ id Graphics::useRenderEncoder() if (renderEncoder == nil) { submitBlitEncoder(); + submitComputeEncoder(); // Pass desc info for non-backbuffer render targets are set up in // setRenderTargetsInternal. @@ -630,6 +632,7 @@ id Graphics::useBlitEncoder() if (blitEncoder == nil) { submitRenderEncoder(SUBMIT_STORE); + submitComputeEncoder(); blitEncoder = [useCommandBuffer() blitCommandEncoder]; } @@ -645,6 +648,27 @@ void Graphics::submitBlitEncoder() } } +id Graphics::useComputeEncoder() +{ + if (computeEncoder == nil) + { + submitRenderEncoder(SUBMIT_STORE); + submitBlitEncoder(); + computeEncoder = [useCommandBuffer() computeCommandEncoder]; + } + + return computeEncoder; +} + +void Graphics::submitComputeEncoder() +{ + if (computeEncoder != nil) + { + [computeEncoder endEncoding]; + computeEncoder = nil; + } +} + static bool isClampOne(SamplerState::WrapMode w) { return w == SamplerState::WRAP_CLAMP_ONE; @@ -1096,10 +1120,10 @@ void Graphics::drawQuads(int start, int count, const VertexAttributes &attribute }} bool Graphics::dispatch(int x, int y, int z) -{ +{ @autoreleasepool { // TODO return false; -} +}} void Graphics::setRenderTargetsInternal(const RenderTargets &rts, int w, int h, int /*pixelw*/, int /*pixelh*/, bool /*hasSRGBtexture*/) { @autoreleasepool {