From cb3f9d3202186dc1842e2cea21b2863cd5b5ca57 Mon Sep 17 00:00:00 2001 From: redstrate <54911369+redstrate@users.noreply.github.com> Date: Mon, 17 Aug 2020 09:54:55 -0400 Subject: [PATCH] Improve the metal backend's command buffer acquire behavior --- engine/asset/src/asset.cpp | 1 + engine/gfx/metal/src/gfx_metal.mm | 37 ++++++++++++++++++------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/engine/asset/src/asset.cpp b/engine/asset/src/asset.cpp index 22903f1..9ff8ad0 100644 --- a/engine/asset/src/asset.cpp +++ b/engine/asset/src/asset.cpp @@ -241,6 +241,7 @@ std::unique_ptr load_texture(const file::Path path) { if(createInfo.mip_count > 1) { GFXCommandBuffer* cmd_buf = engine->get_gfx()->acquire_command_buffer(); + cmd_buf->generate_mipmaps(texture->handle, createInfo.mip_count); engine->get_gfx()->submit(cmd_buf); diff --git a/engine/gfx/metal/src/gfx_metal.mm b/engine/gfx/metal/src/gfx_metal.mm index da66af8..96b6205 100755 --- a/engine/gfx/metal/src/gfx_metal.mm +++ b/engine/gfx/metal/src/gfx_metal.mm @@ -622,19 +622,22 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI } GFXCommandBuffer* GFXMetal::acquire_command_buffer() { - for(const auto [i, buffer_status] : utility::enumerate(free_command_buffers)) { - if(buffer_status) { - GFXCommandBuffer* buffer = command_buffers[i]; - - free_command_buffers[i] = false; - - buffer->commands.clear(); - - return buffer; + GFXCommandBuffer* cmdbuf = nullptr; + while(cmdbuf == nullptr) { + for(const auto [i, buffer_status] : utility::enumerate(free_command_buffers)) { + if(buffer_status) { + GFXCommandBuffer* buffer = command_buffers[i]; + + free_command_buffers[i] = false; + + buffer->commands.clear(); + + return buffer; + } } } - - return nullptr; + + return cmdbuf; } void GFXMetal::submit(GFXCommandBuffer* command_buffer, const int window) { @@ -981,11 +984,13 @@ void GFXMetal::submit(GFXCommandBuffer* command_buffer, const int window) { if(blitEncoder != nil) [blitEncoder endEncoding]; - - for(auto [i, buffer] : utility::enumerate(command_buffers)) { - if(buffer == command_buffer) - free_command_buffers[i] = true; - } + + [commandBuffer addCompletedHandler:^(id _Nonnull) { + for(auto [i, buffer] : utility::enumerate(command_buffers)) { + if(buffer == command_buffer) + free_command_buffers[i] = true; + } + }]; if(window != -1) { [commandBuffer presentDrawable:drawable];