Fix Metal STREAM buffers (#4543)

This commit is contained in:
Ben Doherty
2021-08-25 09:48:07 -07:00
committed by Benjamin Doherty
parent f37112358e
commit ce3e5f74e8
2 changed files with 11 additions and 6 deletions

View File

@@ -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;

View File

@@ -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<uint8_t*>(mBufferPoolEntry->buffer.contents) + mCurrentStreamOffset, src, size);
memcpy(static_cast<uint8_t*>(mBufferPoolEntry->buffer.contents) + mCurrentStreamStart, src, size);
}
id<MTLBuffer> MetalBuffer::getGpuBufferForDraw(id<MTLCommandBuffer> cmdBuffer) noexcept {
@@ -160,7 +164,7 @@ void MetalBuffer::bindBuffers(id<MTLCommandBuffer> cmdBuffer, id<MTLRenderComman
continue;
}
metalBuffers[b] = gpuBuffer;
metalOffsets[b] = offsets[b] + buffer->mCurrentStreamOffset;
metalOffsets[b] = offsets[b] + buffer->mCurrentStreamStart;
}
if (stages & Stage::VERTEX) {