render/vulkan: switch to timeline semaphores

Up until now we were using a VkFence for GPU-to-CPU
synchronization. This has some limitations that become a blocker
when trying to have multiple command buffers in flight at once
(e.g. for multi-output). It's desirable to implement a command
buffer pool [1], but VkFence cannot be used to track command buffer
completion for individual subpasses.

Let's just switch to timeline semaphores [2], which fix this issue,
make synchronization a lot more ergonomic and are a core Vulkan 1.2
feature.

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3802
[2]: https://www.khronos.org/blog/vulkan-timeline-semaphores
This commit is contained in:
Simon Ser 2022-11-04 15:58:11 +01:00
parent f92d1499cd
commit a8a194d695
3 changed files with 62 additions and 27 deletions

View file

@ -44,6 +44,7 @@ struct wlr_vk_device {
struct {
PFN_vkGetMemoryFdPropertiesKHR getMemoryFdPropertiesKHR;
PFN_vkWaitSemaphoresKHR waitSemaphoresKHR;
} api;
uint32_t format_prop_count;
@ -151,7 +152,8 @@ struct wlr_vk_renderer {
VkPipelineLayout pipe_layout;
VkSampler sampler;
VkFence fence;
VkSemaphore timeline_semaphore;
uint64_t timeline_point;
struct wlr_vk_render_buffer *current_render_buffer;