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) {
|
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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
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) {
|
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];
|
||||||
|
|
||||||
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];
|
||||||
|
|
Reference in a new issue