From ce3e5f74e8a6fe798c5e593de7abd1b95bc158ae Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Wed, 25 Aug 2021 09:48:07 -0700 Subject: [PATCH] Fix Metal STREAM buffers (#4543) --- filament/backend/src/metal/MetalBuffer.h | 5 +++-- filament/backend/src/metal/MetalBuffer.mm | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/filament/backend/src/metal/MetalBuffer.h b/filament/backend/src/metal/MetalBuffer.h index f4c69076b2..1cb63e5204 100644 --- a/filament/backend/src/metal/MetalBuffer.h +++ b/filament/backend/src/metal/MetalBuffer.h @@ -62,7 +62,7 @@ public: * Returns the offset into the buffer returned by getGpuBufferForDraw. This is always 0 for * non-STREAM buffers. */ - size_t getGpuBufferStreamOffset() noexcept { return mCurrentStreamOffset; } + size_t getGpuBufferStreamOffset() noexcept { return mCurrentStreamStart; } void* getCpuBuffer() const noexcept { return mCpuBuffer; } @@ -85,7 +85,8 @@ private: BufferUsage mUsage; size_t mBufferSize = 0; - size_t mCurrentStreamOffset = 0; + size_t mCurrentStreamStart = 0; + size_t mCurrentStreamEnd = 0; const MetalBufferPoolEntry* mBufferPoolEntry = nullptr; void* mCpuBuffer = nullptr; MetalContext& mContext; diff --git a/filament/backend/src/metal/MetalBuffer.mm b/filament/backend/src/metal/MetalBuffer.mm index 743c52b982..f93aebbef1 100644 --- a/filament/backend/src/metal/MetalBuffer.mm +++ b/filament/backend/src/metal/MetalBuffer.mm @@ -93,9 +93,13 @@ void MetalBuffer::copyIntoStreamBuffer(void* src, size_t size) { assert_invariant(size <= mBufferSize); assert_invariant(!mCpuBuffer); - if (mCurrentStreamOffset + size > mBufferSize) { + mCurrentStreamStart = mCurrentStreamEnd; + mCurrentStreamEnd += size; + + if (mCurrentStreamEnd > mBufferSize) { // Allocate a new buffer and reset the stream offset. - mCurrentStreamOffset = 0; + mCurrentStreamStart = 0; + mCurrentStreamEnd = size; if (mBufferPoolEntry) { mContext.bufferPool->releaseBuffer(mBufferPoolEntry); } mBufferPoolEntry = mContext.bufferPool->acquireBuffer(mBufferSize); @@ -106,7 +110,7 @@ void MetalBuffer::copyIntoStreamBuffer(void* src, size_t size) { mBufferPoolEntry = mContext.bufferPool->acquireBuffer(mBufferSize); } - memcpy(static_cast(mBufferPoolEntry->buffer.contents) + mCurrentStreamOffset, src, size); + memcpy(static_cast(mBufferPoolEntry->buffer.contents) + mCurrentStreamStart, src, size); } id MetalBuffer::getGpuBufferForDraw(id cmdBuffer) noexcept { @@ -160,7 +164,7 @@ void MetalBuffer::bindBuffers(id cmdBuffer, idmCurrentStreamOffset; + metalOffsets[b] = offsets[b] + buffer->mCurrentStreamStart; } if (stages & Stage::VERTEX) {