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]; }