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