Archived
1
Fork 0

Improve the metal backend's command buffer acquire behavior

This commit is contained in:
redstrate 2020-08-17 09:54:55 -04:00
parent 6e446d4260
commit cb3f9d3202
2 changed files with 22 additions and 16 deletions

View file

@ -241,6 +241,7 @@ std::unique_ptr<Texture> load_texture(const file::Path path) {
if(createInfo.mip_count > 1) { if(createInfo.mip_count > 1) {
GFXCommandBuffer* cmd_buf = engine->get_gfx()->acquire_command_buffer(); GFXCommandBuffer* cmd_buf = engine->get_gfx()->acquire_command_buffer();
cmd_buf->generate_mipmaps(texture->handle, createInfo.mip_count); cmd_buf->generate_mipmaps(texture->handle, createInfo.mip_count);
engine->get_gfx()->submit(cmd_buf); engine->get_gfx()->submit(cmd_buf);

View file

@ -622,19 +622,22 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
} }
GFXCommandBuffer* GFXMetal::acquire_command_buffer() { GFXCommandBuffer* GFXMetal::acquire_command_buffer() {
for(const auto [i, buffer_status] : utility::enumerate(free_command_buffers)) { GFXCommandBuffer* cmdbuf = nullptr;
if(buffer_status) { while(cmdbuf == nullptr) {
GFXCommandBuffer* buffer = command_buffers[i]; for(const auto [i, buffer_status] : utility::enumerate(free_command_buffers)) {
if(buffer_status) {
free_command_buffers[i] = false; GFXCommandBuffer* buffer = command_buffers[i];
buffer->commands.clear(); free_command_buffers[i] = false;
return buffer; buffer->commands.clear();
return buffer;
}
} }
} }
return nullptr; return cmdbuf;
} }
void GFXMetal::submit(GFXCommandBuffer* command_buffer, const int window) { 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) if(blitEncoder != nil)
[blitEncoder endEncoding]; [blitEncoder endEncoding];
for(auto [i, buffer] : utility::enumerate(command_buffers)) { [commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull) {
if(buffer == command_buffer) for(auto [i, buffer] : utility::enumerate(command_buffers)) {
free_command_buffers[i] = true; if(buffer == command_buffer)
} free_command_buffers[i] = true;
}
}];
if(window != -1) { if(window != -1) {
[commandBuffer presentDrawable:drawable]; [commandBuffer presentDrawable:drawable];