From e0a34006cba803e5ae3f0e76ca04d0dd58c35300 Mon Sep 17 00:00:00 2001 From: Patrick Baran Date: Thu, 1 Oct 2026 22:36:55 +0100 Subject: [PATCH 1/2] Fix Metal buffer initialization overread --- Engine/gapi/metal/mtbuffer.cpp | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/Engine/gapi/metal/mtbuffer.cpp b/Engine/gapi/metal/mtbuffer.cpp index 576ed62c..1ce1e5d7 100644 --- a/Engine/gapi/metal/mtbuffer.cpp +++ b/Engine/gapi/metal/mtbuffer.cpp @@ -15,24 +15,11 @@ MtBuffer::MtBuffer(MtDevice& dev, const void* data, size_t size, MTL::ResourceOp const size_t roundSize = ((size+64-1)/64)*64; // for uniforms/ssbo structures in msl const MTL::ResourceOptions flg = f | MTL::HazardTrackingModeDefault; - if(data==nullptr) { - impl = NsPtr(dev.impl->newBuffer(roundSize,flg)); - if(impl==nullptr) - throw std::system_error(GraphicsErrc::OutOfVideoMemory); - return; - } - - if(0==(flg & MTL::ResourceStorageModePrivate)) { - impl = NsPtr(dev.impl->newBuffer(data,roundSize,flg)); - if(impl==nullptr) - throw std::system_error(GraphicsErrc::OutOfVideoMemory); - return; - } - impl = NsPtr(dev.impl->newBuffer(roundSize,flg)); if(impl==nullptr) throw std::system_error(GraphicsErrc::OutOfVideoMemory); - update(data,0,size); + if(data!=nullptr) + update(data,0,size); } MtBuffer::~MtBuffer() { From 9a185d320f9416c1d675adb00360bde805a9e477 Mon Sep 17 00:00:00 2001 From: Patrick Baran Date: Tue, 6 Oct 2026 18:02:30 +0100 Subject: [PATCH 2/2] Keep direct Metal buffer initialization when no padding is needed --- Engine/gapi/metal/mtbuffer.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Engine/gapi/metal/mtbuffer.cpp b/Engine/gapi/metal/mtbuffer.cpp index 1ce1e5d7..e5dc6a57 100644 --- a/Engine/gapi/metal/mtbuffer.cpp +++ b/Engine/gapi/metal/mtbuffer.cpp @@ -15,11 +15,24 @@ MtBuffer::MtBuffer(MtDevice& dev, const void* data, size_t size, MTL::ResourceOp const size_t roundSize = ((size+64-1)/64)*64; // for uniforms/ssbo structures in msl const MTL::ResourceOptions flg = f | MTL::HazardTrackingModeDefault; + if(data==nullptr) { + impl = NsPtr(dev.impl->newBuffer(roundSize,flg)); + if(impl==nullptr) + throw std::system_error(GraphicsErrc::OutOfVideoMemory); + return; + } + + if(roundSize==size && 0==(flg & MTL::ResourceStorageModePrivate)) { + impl = NsPtr(dev.impl->newBuffer(data,roundSize,flg)); + if(impl==nullptr) + throw std::system_error(GraphicsErrc::OutOfVideoMemory); + return; + } + impl = NsPtr(dev.impl->newBuffer(roundSize,flg)); if(impl==nullptr) throw std::system_error(GraphicsErrc::OutOfVideoMemory); - if(data!=nullptr) - update(data,0,size); + update(data,0,size); } MtBuffer::~MtBuffer() {