Fix Metal STREAM buffers (#4543)
This commit is contained in:
committed by
Benjamin Doherty
parent
f37112358e
commit
ce3e5f74e8
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user