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) {
GFXCommandBuffer* cmd_buf = engine->get_gfx()->acquire_command_buffer();
cmd_buf->generate_mipmaps(texture->handle, createInfo.mip_count);
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* cmdbuf = nullptr;
while(cmdbuf == nullptr) {
for(const auto [i, buffer_status] : utility::enumerate(free_command_buffers)) {
if(buffer_status) {
GFXCommandBuffer* buffer = command_buffers[i];
@ -633,8 +635,9 @@ GFXCommandBuffer* GFXMetal::acquire_command_buffer() {
return buffer;
}
}
}
return nullptr;
return cmdbuf;
}
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)
[blitEncoder endEncoding];
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull) {
for(auto [i, buffer] : utility::enumerate(command_buffers)) {
if(buffer == command_buffer)
free_command_buffers[i] = true;
}
}];
if(window != -1) {
[commandBuffer presentDrawable:drawable];