From 6dcab66c730b6e8455128e9b4239ec269098266a Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Tue, 5 Nov 2024 11:16:02 +0100 Subject: [PATCH] render/vulkan: Maintain buffer order when releasing spans We expect the render buffers to be ordered largest to smallest, with the allocator using a reverse iteration to fill smallest buffers first. Buffers that had been borrowed by a command buffer would just be inserted at the end of the list, and would not maintain ordering with any buffers already in that list. Use a sorted insert to ensure that buffers remain ordered. --- render/vulkan/renderer.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 4051dbf05..9f3aed7ae 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -465,13 +465,22 @@ static void release_command_buffer_resources(struct wlr_vk_command_buffer *cb, wlr_texture_destroy(&texture->wlr_texture); } + VkDeviceSize cur_size = min_stage_size; + struct wl_list *insertion_target = &renderer->stage.buffers; struct wlr_vk_shared_buffer *buf, *buf_tmp; - wl_list_for_each_safe(buf, buf_tmp, &cb->stage_buffers, link) { + wl_list_for_each_reverse_safe(buf, buf_tmp, &cb->stage_buffers, link) { buf->allocs.size = 0; buf->last_used_ms = now; wl_list_remove(&buf->link); - wl_list_insert(&renderer->stage.buffers, &buf->link); + + // Sorted insert + while (insertion_target->prev != &renderer->stage.buffers && buf->buf_size > cur_size) { + insertion_target = insertion_target->prev; + struct wlr_vk_shared_buffer *tbuf = wl_container_of(insertion_target, tbuf, link); + cur_size = tbuf->buf_size; + } + wl_list_insert(insertion_target, &buf->link); } if (cb->color_transform) {