From 98f131cb3076f299d062079773b8957c5732ee06 Mon Sep 17 00:00:00 2001 From: Martin Fouilleul Date: Wed, 23 Aug 2023 15:09:06 +0200 Subject: [PATCH] Fix leak in metal surface: command buffer must not be committed if there is no surface to present it to, or it will result in a huge leak in metal resources. Also wrap oc_mtl_surface_acquire_command_buffer() in an @autoreleasepool to fix a smaller leak --- src/graphics/mtl_surface.m | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/graphics/mtl_surface.m b/src/graphics/mtl_surface.m index 2d40083..ecab941 100644 --- a/src/graphics/mtl_surface.m +++ b/src/graphics/mtl_surface.m @@ -53,10 +53,13 @@ void oc_mtl_surface_destroy(oc_surface_data* interface) void oc_mtl_surface_acquire_command_buffer(oc_mtl_surface* surface) { - if(surface->commandBuffer == nil) + @autoreleasepool { - surface->commandBuffer = [surface->commandQueue commandBuffer]; - [surface->commandBuffer retain]; + if(surface->commandBuffer == nil) + { + surface->commandBuffer = [surface->commandQueue commandBuffer]; + [surface->commandBuffer retain]; + } } } @@ -102,8 +105,9 @@ void oc_mtl_surface_present(oc_surface_data* interface) [surface->commandBuffer presentDrawable:surface->drawable]; [surface->drawable release]; surface->drawable = nil; + + [surface->commandBuffer commit]; } - [surface->commandBuffer commit]; [surface->commandBuffer release]; surface->commandBuffer = nil; }