From 68e219c39b13036f447e61ed62c7e06a3bc49d81 Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Wed, 14 Jan 2026 20:57:34 +0800 Subject: [PATCH] only update offset if we call setVertexBuffer previously (#4049) Co-authored-by: Wei Chen --- include/mbgl/mtl/buffer_resource.hpp | 2 ++ src/mbgl/mtl/buffer_resource.cpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/mbgl/mtl/buffer_resource.hpp b/include/mbgl/mtl/buffer_resource.hpp index 4efe37a9a..d519666f1 100644 --- a/include/mbgl/mtl/buffer_resource.hpp +++ b/include/mbgl/mtl/buffer_resource.hpp @@ -87,6 +87,8 @@ protected: std::uint16_t version = 0; bool isIndexBuffer; bool persistent; + + mutable bool usingVertexBuffer = false; }; } // namespace mtl diff --git a/src/mbgl/mtl/buffer_resource.cpp b/src/mbgl/mtl/buffer_resource.cpp index ab2f75174..6e7b47161 100644 --- a/src/mbgl/mtl/buffer_resource.cpp +++ b/src/mbgl/mtl/buffer_resource.cpp @@ -165,9 +165,11 @@ void BufferResource::bindVertex(const MTLRenderCommandEncoderPtr& encoder, assert(offset + size_ <= size); if (const auto* mtlBuf = buffer.get()) { encoder->setVertexBuffer(mtlBuf, static_cast(offset), static_cast(index)); + usingVertexBuffer = true; } else if (!raw.empty()) { size_ = size_ ? std::min(size_, size - offset) : size - offset; encoder->setVertexBytes(raw.data() + offset, size_, index); + usingVertexBuffer = false; } } @@ -192,7 +194,7 @@ void BufferResource::updateVertexBindOffset(const MTLRenderCommandEncoderPtr& en // The documentation for `setVertexBufferOffset` indicates that it should work for buffers // assigned using `setVertexBytes` but, in practice, it produces a validation failure: // `Set Vertex Buffer Offset Validation index(1) must have an existing buffer.` - if (buffer.get()) { + if (buffer.get() && usingVertexBuffer) { encoder->setVertexBufferOffset(offset, index); } else { bindVertex(encoder, offset, index, size_);