Improve the metal backend's command buffer acquire behavior
This commit is contained in:
parent
6e446d4260
commit
cb3f9d3202
2 changed files with 22 additions and 16 deletions
|
@ -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);
|
||||
|
|
|
@ -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];
|
||||
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;
|
||||
free_command_buffers[i] = false;
|
||||
|
||||
buffer->commands.clear();
|
||||
buffer->commands.clear();
|
||||
|
||||
return 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];
|
||||
|
||||
for(auto [i, buffer] : utility::enumerate(command_buffers)) {
|
||||
if(buffer == command_buffer)
|
||||
free_command_buffers[i] = true;
|
||||
}
|
||||
[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];
|
||||
|
|
Reference in a new issue