mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +02:00
metal: fix crash when stream buffers are resized
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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();
|
||||
}];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user