Browse Source

metal: fix crash when stream buffers are resized

Alex Szpakowski 4 years ago
parent
commit
9acf7df8e8

+ 8 - 5
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]);
 		}
 	}

+ 2 - 1
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:
 

+ 1 - 1
src/modules/graphics/metal/Graphics.mm

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

+ 7 - 0
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<MTLCommandBuffer> _Nonnull)
 			{
 				dispatch_semaphore_signal(semaphore);
+				pthis->release();
 			}];
 		}