From e8fbb7e8200508a8002ecc72dbd97f39355a742b Mon Sep 17 00:00:00 2001 From: Jakub Wasilewski Date: Sun, 14 Dec 2025 11:16:02 +0100 Subject: [PATCH] GPU: Metal: Rebind storage buffers when changing the pipeline moves them. (cherry picked from commit 73c9f25867e60c8a7c18ff9b427c1c5e7ffdc8be) --- src/gpu/metal/SDL_gpu_metal.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m index c93b8a0e02..2071919cf6 100644 --- a/src/gpu/metal/SDL_gpu_metal.m +++ b/src/gpu/metal/SDL_gpu_metal.m @@ -2373,6 +2373,7 @@ static void METAL_BindGraphicsPipeline( { @autoreleasepool { MetalCommandBuffer *metalCommandBuffer = (MetalCommandBuffer *)commandBuffer; + MetalGraphicsPipeline *previousPipeline = metalCommandBuffer->graphics_pipeline; MetalGraphicsPipeline *pipeline = (MetalGraphicsPipeline *)graphicsPipeline; SDL_GPURasterizerState *rast = &pipeline->rasterizerState; Uint32 i; @@ -2415,6 +2416,17 @@ static void METAL_BindGraphicsPipeline( metalCommandBuffer); } } + + if (previousPipeline && previousPipeline != pipeline) { + // if the number of uniform buffers has changed, the storage buffers will move as well + // and need a rebind at their new locations + if (previousPipeline->header.num_vertex_uniform_buffers != pipeline->header.num_vertex_uniform_buffers) { + metalCommandBuffer->needVertexStorageBufferBind = true; + } + if (previousPipeline->header.num_fragment_uniform_buffers != pipeline->header.num_fragment_uniform_buffers) { + metalCommandBuffer->needFragmentStorageBufferBind = true; + } + } } }