metal: fix crash when stream buffers are resized

This commit is contained in:
Alex Szpakowski
2021-04-02 17:53:55 -03:00
parent 4cac353908
commit 9acf7df8e8
4 changed files with 18 additions and 7 deletions
+8 -5
View File
@@ -190,9 +190,12 @@ Graphics::~Graphics()
defaultFont.set(nullptr);
delete batchedDrawState.vb[0];
delete batchedDrawState.vb[1];
delete batchedDrawState.indexBuffer;
if (batchedDrawState.vb[0])
batchedDrawState.vb[0]->release();
if (batchedDrawState.vb[1])
batchedDrawState.vb[1]->release();
if (batchedDrawState.indexBuffer)
batchedDrawState.indexBuffer->release();
for (int i = 0; i < (int) ShaderStage::STAGE_MAX_ENUM; i++)
cachedShaderStages[i].clear();
@@ -1196,14 +1199,14 @@ Graphics::BatchedVertexData Graphics::requestBatchedDraw(const BatchedDrawComman
{
if (state.vb[i]->getSize() < buffersizes[i])
{
delete state.vb[i];
state.vb[i]->release();
state.vb[i] = newStreamBuffer(BUFFERUSAGE_VERTEX, buffersizes[i]);
}
}
if (state.indexBuffer->getSize() < buffersizes[2])
{
delete state.indexBuffer;
state.indexBuffer->release();
state.indexBuffer = newStreamBuffer(BUFFERUSAGE_INDEX, buffersizes[2]);
}
}
+2 -1
View File
@@ -22,6 +22,7 @@
// LOVE
#include "common/int.h"
#include "common/Object.h"
#include "vertex.h"
#include "Resource.h"
@@ -33,7 +34,7 @@ namespace love
namespace graphics
{
class StreamBuffer : public Resource
class StreamBuffer : public love::Object, public Resource
{
public:
+1 -1
View File
@@ -745,7 +745,7 @@ void Graphics::applyShaderUniforms(id<MTLRenderCommandEncoder> renderEncoder, lo
if (uniformBuffer->getSize() < uniformBufferOffset + size)
{
size_t newsize = uniformBuffer->getSize() * 2;
delete uniformBuffer;
uniformBuffer->release();
uniformBuffer = CreateStreamBuffer(device, BUFFERUSAGE_VERTEX, newsize);
uniformBufferData = {};
uniformBufferOffset = 0;
@@ -58,7 +58,11 @@ public:
{ @autoreleasepool {
buffer = nil;
for (int i = 0; i < BUFFER_FRAMES; i++)
{
if (mappedFrames[i])
dispatch_semaphore_signal(frameSemaphores[i]);
frameSemaphores[i] = nil;
}
}}
MapInfo map(size_t /*minsize*/) override
@@ -91,9 +95,12 @@ public:
if (mappedFrames[frameIndex])
{
/*__weak*/ dispatch_semaphore_t semaphore = frameSemaphores[frameIndex];
StreamBuffer *pthis = this;
pthis->retain();
[cmd addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull)
{
dispatch_semaphore_signal(semaphore);
pthis->release();
}];
}