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