From 1eb35bf86c7121f98b8610cf58b4fdbc807da7f7 Mon Sep 17 00:00:00 2001 From: tanmaysachan Date: Fri, 21 Mar 2025 13:29:30 +0530 Subject: [PATCH 1/2] Add sync on all barriers, check uma for resource options --- plume_metal.cpp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/plume_metal.cpp b/plume_metal.cpp index dc3e756..bbceeb8 100644 --- a/plume_metal.cpp +++ b/plume_metal.cpp @@ -762,14 +762,16 @@ namespace plume { } } - MTL::ResourceOptions mapResourceOption(RenderHeapType heapType) { + MTL::ResourceOptions mapResourceOption(RenderHeapType heapType, bool hasUma) { switch (heapType) { case RenderHeapType::DEFAULT: return MTL::ResourceStorageModePrivate; case RenderHeapType::UPLOAD: - return MTL::ResourceStorageModeShared; case RenderHeapType::READBACK: - return MTL::ResourceStorageModeShared; + if (hasUma) { + return MTL::ResourceStorageModeShared; + } + return MTL::ResourceStorageModeManaged; default: assert(false && "Unknown heap type."); return MTL::ResourceStorageModePrivate; @@ -1047,7 +1049,7 @@ namespace plume { this->desc = desc; this->device = device; - this->mtl = device->mtl->newBuffer(desc.size, mapResourceOption(desc.heapType)); + this->mtl = device->mtl->newBuffer(desc.size, mapResourceOption(desc.heapType, device->getCapabilities().uma)); } MetalBuffer::~MetalBuffer() { @@ -1092,7 +1094,7 @@ namespace plume { // Configure texture properties const MTL::PixelFormat pixelFormat = mapPixelFormat(format); const MTL::TextureUsage usage = mapTextureUsageFromBufferFlags(buffer->desc.flags); - const MTL::ResourceOptions options = mapResourceOption(buffer->desc.heapType); + const MTL::ResourceOptions options = mapResourceOption(buffer->desc.heapType, buffer->device->getCapabilities().uma); // Create texture with configured descriptor and alignment MTL::TextureDescriptor *descriptor = MTL::TextureDescriptor::textureBufferDescriptor(pixelFormat, width, options, usage); @@ -1489,9 +1491,10 @@ namespace plume { uint64_t requiredSize = setLayout->argumentEncoder->encodedLength(); requiredSize = alignUp(requiredSize, 256); + MTL::ResourceOptions storageMode = device->getCapabilities().uma ? MTL::ResourceStorageModeShared : MTL::ResourceStorageModeManaged; argumentBuffer = { - .mtl = device->mtl->newBuffer(requiredSize, MTL::ResourceStorageModeManaged), + .mtl = device->mtl->newBuffer(requiredSize, storageMode), .argumentEncoder = setLayout->argumentEncoder, .offset = 0, }; @@ -1969,8 +1972,20 @@ namespace plume { return; } - // End render passes on all barriers - endActiveRenderEncoder(); + // Sync resources with the blit encoder + checkActiveBlitEncoder(); + + for (uint32_t i = 0; i < bufferBarriersCount; i++) { + const RenderBufferBarrier &barrier = bufferBarriers[i]; + MTL::Resource *resource = static_cast(barrier.buffer)->mtl; + activeBlitEncoder->synchronizeResource(resource); + } + + for (uint32_t i = 0; i < textureBarriersCount; i++) { + const RenderTextureBarrier &barrier = textureBarriers[i]; + MTL::Resource *resource = static_cast(barrier.texture)->mtl; + activeBlitEncoder->synchronizeResource(resource); + } } void MetalCommandList::dispatch(const uint32_t threadGroupCountX, const uint32_t threadGroupCountY, const uint32_t threadGroupCountZ) { From 279bc6ff446123c295eb15838f7d1f74a3b15fde Mon Sep 17 00:00:00 2001 From: tanmaysachan Date: Fri, 21 Mar 2025 13:37:06 +0530 Subject: [PATCH 2/2] didModifyRange on unmap if written to --- plume_metal.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plume_metal.cpp b/plume_metal.cpp index bbceeb8..3c6f445 100644 --- a/plume_metal.cpp +++ b/plume_metal.cpp @@ -1061,7 +1061,9 @@ namespace plume { } void MetalBuffer::unmap(uint32_t subresource, const RenderRange* writtenRange) { - // Do nothing. + if (mtl->resourceOptions() == MTL::StorageModeManaged) { + mtl->didModifyRange(NS::Range(writtenRange->begin, writtenRange->end)); + } } std::unique_ptr MetalBuffer::createBufferFormattedView(RenderFormat format) {