From 2313ce88b1187177957c4ee31dbfc8e39f378fea Mon Sep 17 00:00:00 2001 From: luboslenco Date: Mon, 21 Jul 2025 14:41:08 +0200 Subject: [PATCH 1/2] Fix compile --- base/sources/backends/metal_gpu.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/sources/backends/metal_gpu.m b/base/sources/backends/metal_gpu.m index fa26eb2f..b2fdc336 100644 --- a/base/sources/backends/metal_gpu.m +++ b/base/sources/backends/metal_gpu.m @@ -532,7 +532,7 @@ void gpu_texture_init_from_bytes(gpu_texture_t *texture, void *data, int width, texture->height = height; texture->format = format; texture->state = GPU_TEXTURE_STATE_SHADER_RESOURCE; - target->buffer = NULL; + texture->buffer = NULL; MTLPixelFormat mtlformat = convert_texture_format(format); if (mtlformat == MTLPixelFormatBGRA8Unorm) { From 99d6ba04c338d28f008c667bd3376f68b9ad9aa0 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Mon, 21 Jul 2025 14:50:04 +0200 Subject: [PATCH 2/2] Metal fixes --- base/sources/backends/metal_gpu.m | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/base/sources/backends/metal_gpu.m b/base/sources/backends/metal_gpu.m index b2fdc336..ee34368d 100644 --- a/base/sources/backends/metal_gpu.m +++ b/base/sources/backends/metal_gpu.m @@ -31,6 +31,7 @@ static gpu_texture_t *current_textures[GPU_MAX_TEXTURES] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static void *readback_buffer; +static int readback_buffer_size = 0; static MTLBlendFactor convert_blending_factor(gpu_blending_factor_t factor) { switch (factor) { @@ -358,9 +359,18 @@ void gpu_set_index_buffer(gpu_buffer_t *buffer) { void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) { gpu_execute_and_wait(); - if (readback_buffer == NULL) { + NSUInteger buffer_size = render_target->width * render_target->height * format_byte_size(render_target->format); + int new_readback_buffer_size = buffer_size; + if (new_readback_buffer_size < (2048 * 2048 * 4)) { + new_readback_buffer_size = (2048 * 2048 * 4); + } + if (readback_buffer_size < new_readback_buffer_size) { + readback_buffer_size = new_readback_buffer_size; + if (readback_buffer != NULL) { + id readback = (__bridge_transfer id)readback_buffer; + readback = nil; + } id device = getMetalDevice(); - NSUInteger buffer_size = render_target->width * render_target->height * format_byte_size(render_target->format); readback_buffer = (__bridge_retained void *)[device newBufferWithLength:buffer_size options:MTLResourceStorageModeShared]; }