diff --git a/src/modules/graphics/Graphics.cpp b/src/modules/graphics/Graphics.cpp index b2b256e42..999adcf02 100644 --- a/src/modules/graphics/Graphics.cpp +++ b/src/modules/graphics/Graphics.cpp @@ -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]); } } diff --git a/src/modules/graphics/StreamBuffer.h b/src/modules/graphics/StreamBuffer.h index a669ec78a..30883bcc7 100644 --- a/src/modules/graphics/StreamBuffer.h +++ b/src/modules/graphics/StreamBuffer.h @@ -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: diff --git a/src/modules/graphics/metal/Graphics.mm b/src/modules/graphics/metal/Graphics.mm index b8dc5d7ad..8f94f4ca3 100644 --- a/src/modules/graphics/metal/Graphics.mm +++ b/src/modules/graphics/metal/Graphics.mm @@ -745,7 +745,7 @@ void Graphics::applyShaderUniforms(id 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; diff --git a/src/modules/graphics/metal/StreamBuffer.mm b/src/modules/graphics/metal/StreamBuffer.mm index 500e932c9..ead044c87 100644 --- a/src/modules/graphics/metal/StreamBuffer.mm +++ b/src/modules/graphics/metal/StreamBuffer.mm @@ -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 _Nonnull) { dispatch_semaphore_signal(semaphore); + pthis->release(); }]; }