From de771ec93ce375ecafd2761c9fb92d4faf40d68a Mon Sep 17 00:00:00 2001 From: wendlinga Date: Wed, 15 Apr 2026 12:25:26 -0700 Subject: [PATCH] Fix Metal crash on Intel Mac AMD GPU (missing setArgumentBuffer) On macOS 11+, all GPUs are reported as Tier 2 for argument buffers. Intel Mac AMD GPUs (AMDMTLBronzeDriver) do not support Metal3 direct buffer addresses. The constructor skips setArgumentBuffer() when useArgumentBuffersTier2=true, leaving the encoder without a backing buffer. Calling setBuffer() on it then causes a SIGSEGV inside AMDMTLBronzeDriver. Fix: call setArgumentBuffer() before setBuffer() in the non-direct-address path. --- plume_metal.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plume_metal.cpp b/plume_metal.cpp index fd27894..69d7ee8 100644 --- a/plume_metal.cpp +++ b/plume_metal.cpp @@ -1847,6 +1847,12 @@ namespace plume { uint64_t gpuAddress = nativeBuffer->gpuAddress() + bufferDescriptor->offset; *reinterpret_cast(bufferPtr + argumentOffset) = gpuAddress; } else { + // On Tier 2 devices without direct buffer addresses (e.g. Intel Mac AMD on macOS 11+), + // the argument encoder's backing buffer must be set before encoding arguments. + // macOS 11+ reports all GPUs as Tier 2, but Intel AMD GPUs skip setArgumentBuffer + // in the constructor because useArgumentBuffersTier2 is true. Without this call + // the encoder has no backing buffer, causing a SIGSEGV in AMDMTLBronzeDriver. + argumentBuffer.argumentEncoder->setArgumentBuffer(argumentBuffer.mtl, argumentBuffer.offset); argumentBuffer.argumentEncoder->setBuffer(nativeBuffer, bufferDescriptor->offset, argumentIndex); } nativeBuffer->retain();