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;

Reply via email to