From ed79b30639899e1815ecfbb4411ea5fd59b77867 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 12 Jul 2023 19:05:20 +0000 Subject: [PATCH] venus: add a missing barrier before copying query feedback The 1st sync scope of vkCmdCopyQueryPoolResults is not sufficient to cover transfer writes against query feedback buffer. We must ensure ordering against prior query reset cmd where the feedback buffer fill gets injected. Fixes: de4593faa193 ("venus: add query pool feedback cmds") Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_feedback.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/virtio/vulkan/vn_feedback.c b/src/virtio/vulkan/vn_feedback.c index c9351d4c3c7..8e6d210b2f1 100644 --- a/src/virtio/vulkan/vn_feedback.c +++ b/src/virtio/vulkan/vn_feedback.c @@ -528,6 +528,25 @@ vn_feedback_query_copy_cmd_record(VkCommandBuffer cmd_handle, const size_t slot_size = (pool->result_array_size * 8) + 8; const size_t offset = slot_size * query; + /* The first synchronization scope of vkCmdCopyQueryPoolResults does not + * include the query feedback buffer. Insert a barrier to ensure ordering + * against feedback buffer fill cmd injected in vkCmdResetQueryPool. + */ + const VkBufferMemoryBarrier buf_barrier_before = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = NULL, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = pool->feedback->buffer, + .offset = offset, + .size = slot_size * count, + }; + vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1, + &buf_barrier_before, 0, NULL); + /* Per spec: "The first synchronization scope includes all commands * which reference the queries in queryPool indicated by query that * occur earlier in submission order. If flags does not include