Module: Mesa Branch: staging/23.3 Commit: a33f38d2bf161a7ddf817370264b8546653d22be URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a33f38d2bf161a7ddf817370264b8546653d22be
Author: Juston Li <justo...@google.com> Date: Tue Sep 26 16:29:17 2023 -0700 venus: append query feedback at submission time Cc: 23.3 <mesa-stable> Signed-off-by: Juston Li <justo...@google.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25413> (cherry picked from commit 7fbf608f2dac486b23030d3b48dd10bb453d9eb8) --- .pick_status.json | 2 +- src/virtio/vulkan/vn_feedback.c | 3 +- src/virtio/vulkan/vn_queue.c | 79 ++++++++++++++++++++++++++++++++--------- 3 files changed, 66 insertions(+), 18 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 9744f33d89f..f46d99c7bd9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -244,7 +244,7 @@ "description": "venus: append query feedback at submission time", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/virtio/vulkan/vn_feedback.c b/src/virtio/vulkan/vn_feedback.c index c17d947e958..8b2e01d70b3 100644 --- a/src/virtio/vulkan/vn_feedback.c +++ b/src/virtio/vulkan/vn_feedback.c @@ -727,7 +727,8 @@ vn_feedback_cmd_pools_init(struct vn_device *dev) .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, }; - if (VN_PERF(NO_FENCE_FEEDBACK) && VN_PERF(NO_TIMELINE_SEM_FEEDBACK)) + if (VN_PERF(NO_FENCE_FEEDBACK) && VN_PERF(NO_TIMELINE_SEM_FEEDBACK) && + VN_PERF(NO_QUERY_FEEDBACK)) return VK_SUCCESS; assert(dev->queue_family_count); diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index a3169275a85..045d88f2aed 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -42,6 +42,7 @@ struct vn_queue_submission { VkFence fence_handle; bool has_feedback_fence; + bool has_feedback_query; bool has_feedback_semaphore; const struct vn_device_memory *wsi_mem; uint32_t feedback_cmd_buffer_count; @@ -58,6 +59,8 @@ struct vn_queue_submission { * - copy of cmd buffers for any batch with sem feedback with * additional cmd buffers for each signal semaphore that uses * feedback + * - an extra cmd buffer info for recording and appending defered + * query feedback * - an extra cmd buffer info for appending fence feedback * when using SubmitInfo2 */ @@ -265,11 +268,24 @@ vn_queue_submission_count_batch_feedback(struct vn_queue_submission *submit, } } - if (batch_has_feedback_sem) { + bool batch_has_feedback_query = false; + uint32_t cmd_count = vn_get_cmd_buffer_count(submit, batch_index); + for (uint32_t i = 0; i < cmd_count; i++) { + struct vn_command_buffer *cmd = vn_command_buffer_from_handle( + vn_get_cmd_handle(submit, batch_index, i)); + if (!list_is_empty(&cmd->builder.query_batches)) + batch_has_feedback_query = true; + } + + if (batch_has_feedback_query) + submit->feedback_cmd_buffer_count++; + + if (batch_has_feedback_sem || batch_has_feedback_query) { submit->feedback_cmd_buffer_count += vn_get_cmd_buffer_count(submit, batch_index); } + submit->has_feedback_query |= batch_has_feedback_query; submit->has_feedback_semaphore |= batch_has_feedback_sem; } @@ -316,7 +332,8 @@ vn_queue_submission_alloc_storage(struct vn_queue_submission *submit) size_t alloc_size = 0; size_t cmd_offset = 0; - if (!submit->has_feedback_fence && !submit->has_feedback_semaphore) + if (!submit->has_feedback_fence && !submit->has_feedback_semaphore && + !submit->has_feedback_query) return VK_SUCCESS; switch (submit->batch_type) { @@ -350,8 +367,8 @@ vn_queue_submission_alloc_storage(struct vn_queue_submission *submit) alloc_size += cmd_size; } - /* space for copied cmds and sem feedback cmds */ - if (submit->has_feedback_semaphore) + /* space for copied cmds and sem/query feedback cmds */ + if (submit->has_feedback_semaphore || submit->has_feedback_query) alloc_size += submit->feedback_cmd_buffer_count * cmd_size; submit->temp.storage = vk_alloc(alloc, alloc_size, VN_DEFAULT_ALIGN, @@ -606,13 +623,15 @@ vn_queue_submission_add_feedback_cmds(struct vn_queue_submission *submit, uint32_t batch_index, uint32_t cmd_buffer_count, uint32_t feedback_cmd_count, + bool batch_has_feedback_query, + bool batch_has_feedback_sem, struct vn_feedback_cmds *feedback_cmds) { VkResult result; uint32_t new_cmd_buffer_count = cmd_buffer_count + feedback_cmd_count; - /* Update SubmitInfo to use our copy of cmd buffers with sem feedback cmds - * appended and update the cmd buffer count. + /* Update SubmitInfo to use our copy of cmd buffers with sem adn query + * feedback cmds appended and update the cmd buffer count. * SubmitInfo2 also needs to initialize the cmd buffer info struct. */ switch (submit->batch_type) { @@ -645,7 +664,17 @@ vn_queue_submission_add_feedback_cmds(struct vn_queue_submission *submit, unreachable("unexpected batch type"); } - if (cmd_buffer_count != new_cmd_buffer_count) { + if (batch_has_feedback_query) { + result = vn_queue_submission_add_query_feedback( + submit, cmd_buffer_count, feedback_cmds); + if (result != VK_SUCCESS) + return result; + + /* increment for the cmd buffer used for query feedback cmd */ + cmd_buffer_count++; + } + + if (batch_has_feedback_sem) { result = vn_queue_submission_add_sem_feedback( submit, batch_index, cmd_buffer_count, feedback_cmds); if (result != VK_SUCCESS) @@ -727,7 +756,8 @@ vn_queue_submission_setup_batches(struct vn_queue_submission *submit) size_t batch_size = 0; size_t cmd_size = 0; - if (!submit->has_feedback_fence && !submit->has_feedback_semaphore) + if (!submit->has_feedback_fence && !submit->has_feedback_semaphore && + !submit->has_feedback_query) return VK_SUCCESS; switch (submit->batch_type) { @@ -744,8 +774,8 @@ vn_queue_submission_setup_batches(struct vn_queue_submission *submit) } /* Copy batches and leave an empty batch for fence feedback. - * Timeline semaphore feedback also requires a copy to modify - * cmd buffer. + * Timeline semaphore and query feedback also require a copy + * to modify cmd buffer. * Only needed for non-empty submissions */ if (submit->batches) { @@ -753,8 +783,8 @@ vn_queue_submission_setup_batches(struct vn_queue_submission *submit) batch_size * submit->batch_count); } - /* For any batches with semaphore feedback, copy the original - * cmd_buffer handles and append feedback cmds. + /* For any batches with semaphore or query feedback, copy + * the original cmd_buffer handles and append feedback cmds. */ uint32_t cmd_offset = 0; for (uint32_t batch_index = 0; batch_index < submit->batch_count; @@ -764,15 +794,30 @@ vn_queue_submission_setup_batches(struct vn_queue_submission *submit) uint32_t signal_count = vn_get_signal_semaphore_count(submit, batch_index); + bool batch_has_feedback_sem = false; uint32_t feedback_cmd_count = 0; for (uint32_t i = 0; i < signal_count; i++) { struct vn_semaphore *sem = vn_semaphore_from_handle( vn_get_signal_semaphore(submit, batch_index, i)); - if (sem->feedback.slot) + if (sem->feedback.slot) { feedback_cmd_count++; + batch_has_feedback_sem = true; + } } + bool batch_has_feedback_query = false; + for (uint32_t i = 0; i < cmd_buffer_count; i++) { + struct vn_command_buffer *cmd = vn_command_buffer_from_handle( + vn_get_cmd_handle(submit, batch_index, i)); + if (!list_is_empty(&cmd->builder.query_batches)) { + batch_has_feedback_query = true; + } + } + + if (batch_has_feedback_query) + feedback_cmd_count++; + if (feedback_cmd_count) { struct vn_feedback_cmds feedback_cmds = { .cmds = submit->temp.cmds + cmd_offset, @@ -788,7 +833,7 @@ vn_queue_submission_setup_batches(struct vn_queue_submission *submit) result = vn_queue_submission_add_feedback_cmds( submit, batch_index, cmd_buffer_count, feedback_cmd_count, - &feedback_cmds); + batch_has_feedback_query, batch_has_feedback_sem, &feedback_cmds); if (result != VK_SUCCESS) return result; @@ -876,7 +921,8 @@ vn_queue_submission_cleanup(struct vn_queue_submission *submit) if (submit->has_feedback_semaphore) vn_queue_recycle_src_feedback(submit); - if (submit->has_feedback_fence || submit->has_feedback_semaphore) + if (submit->has_feedback_fence || submit->has_feedback_semaphore || + submit->has_feedback_query) vk_free(alloc, submit->temp.storage); } @@ -1278,7 +1324,8 @@ vn_QueueBindSparse(VkQueue queue, } /* if feedback isn't used in the batch, can directly submit */ - if (!submit.has_feedback_fence && !submit.has_feedback_semaphore) { + if (!submit.has_feedback_fence && !submit.has_feedback_semaphore && + !submit.has_feedback_query) { result = vn_queue_bind_sparse_submit(&submit); if (result != VK_SUCCESS) return result;