From f03c0a2769c3e0e939631075055cd14dfc267945 Mon Sep 17 00:00:00 2001 From: Samuliak Date: Thu, 19 Sep 2024 10:05:48 +0200 Subject: [PATCH] only set buffer offset if needed --- .../HW/Latte/Renderer/Metal/MetalRenderer.cpp | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp index 3191b90b..78404949 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp @@ -1318,7 +1318,27 @@ void MetalRenderer::SetBuffer(MTL::RenderCommandEncoder* renderCommandEncoder, M if (buffer == boundBuffer.m_buffer && offset == boundBuffer.m_offset) return; - // TODO: only set the offset if only offset changed + if (buffer == boundBuffer.m_buffer) + { + // Just update the offset + boundBuffer.m_offset = offset; + + switch (shaderType) + { + case METAL_SHADER_TYPE_VERTEX: + renderCommandEncoder->setVertexBufferOffset(offset, index); + break; + case METAL_SHADER_TYPE_OBJECT: + renderCommandEncoder->setObjectBufferOffset(offset, index); + break; + case METAL_SHADER_TYPE_MESH: + renderCommandEncoder->setMeshBufferOffset(offset, index); + break; + case METAL_SHADER_TYPE_FRAGMENT: + renderCommandEncoder->setFragmentBufferOffset(offset, index); + break; + } + } boundBuffer = {buffer, offset}; @@ -1874,7 +1894,7 @@ void MetalRenderer::CopyBufferToBuffer(MTL::Buffer* src, uint32 srcOffset, MTL:: { auto renderCommandEncoder = static_cast(m_commandEncoder); - MTL::Resource* barrierBuffers[] = {src}; + MTL::Resource* barrierBuffers[] = {src}; renderCommandEncoder->memoryBarrier(barrierBuffers, 1, after, after | MTL::RenderStageVertex); renderCommandEncoder->setRenderPipelineState(m_copyBufferToBufferPipeline->GetRenderPipelineState());