Module: Mesa
Branch: main
Commit: 40c6e54ce7382007ba3ffa28c9d3d7362799274b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=40c6e54ce7382007ba3ffa28c9d3d7362799274b

Author: Rohan Garg <rohan.g...@intel.com>
Date:   Tue Dec 12 11:54:28 2023 +0100

anv: rename anv_create_companion_rcs_command_buffer to 
anv_cmd_buffer_ensure_rcs_companion

We can now drop any checks for companion_rcs_cmd_buffer before calling
anv_create_companion_rcs_command_buffer.

Ensure that anv_cmd_buffer_ensure_rcs_companion callee's have the proper
error handling.

Signed-off-by: Rohan Garg <rohan.g...@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
Reviewed-by: Sagar Ghuge <sagar.gh...@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26648>

---

 src/intel/vulkan/anv_blorp.c       | 27 +++++++++++++++------------
 src/intel/vulkan/anv_cmd_buffer.c  | 35 ++++++++++++++++++-----------------
 src/intel/vulkan/anv_private.h     |  2 +-
 src/intel/vulkan/genX_cmd_buffer.c | 11 +++++------
 4 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index f907586522d..24593dba6fc 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -377,21 +377,24 @@ record_main_rcs_cmd_buffer_done(struct anv_cmd_buffer 
*cmd_buffer)
 {
    const struct intel_device_info *info = cmd_buffer->device->info;
 
-   if (cmd_buffer->companion_rcs_cmd_buffer == NULL) {
-      anv_create_companion_rcs_command_buffer(cmd_buffer);
-      /* Re-emit the aux table register in every command buffer.  This way 
we're
-       * ensured that we have the table even if this command buffer doesn't
-       * initialize any images.
-       */
-      if (cmd_buffer->device->info->has_aux_map) {
-         assert(cmd_buffer->companion_rcs_cmd_buffer != NULL);
-         anv_add_pending_pipe_bits(cmd_buffer->companion_rcs_cmd_buffer,
-                                   ANV_PIPE_AUX_TABLE_INVALIDATE_BIT,
-                                   "new cmd buffer with aux-tt");
-      }
+   const VkResult result = anv_cmd_buffer_ensure_rcs_companion(cmd_buffer);
+   if (result != VK_SUCCESS) {
+      anv_batch_set_error(&cmd_buffer->batch, result);
+      return ANV_STATE_NULL;
    }
 
    assert(cmd_buffer->companion_rcs_cmd_buffer != NULL);
+
+   /* Re-emit the aux table register in every command buffer.  This way we're
+    * ensured that we have the table even if this command buffer doesn't
+    * initialize any images.
+    */
+   if (cmd_buffer->device->info->has_aux_map) {
+      anv_add_pending_pipe_bits(cmd_buffer->companion_rcs_cmd_buffer,
+                                 ANV_PIPE_AUX_TABLE_INVALIDATE_BIT,
+                                 "new cmd buffer with aux-tt");
+   }
+
    return anv_genX(info, cmd_buffer_begin_companion_rcs_syncpoint)(cmd_buffer);
 }
 
diff --git a/src/intel/vulkan/anv_cmd_buffer.c 
b/src/intel/vulkan/anv_cmd_buffer.c
index 300de3dc906..0718fa31206 100644
--- a/src/intel/vulkan/anv_cmd_buffer.c
+++ b/src/intel/vulkan/anv_cmd_buffer.c
@@ -85,29 +85,30 @@ anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer)
 }
 
 VkResult
-anv_create_companion_rcs_command_buffer(struct anv_cmd_buffer *cmd_buffer)
+anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer)
 {
+   if (cmd_buffer->companion_rcs_cmd_buffer)
+      return VK_SUCCESS;
+
    VkResult result = VK_SUCCESS;
    pthread_mutex_lock(&cmd_buffer->device->mutex);
-   if (cmd_buffer->companion_rcs_cmd_buffer == NULL) {
-      VK_FROM_HANDLE(vk_command_pool, pool,
-                     cmd_buffer->device->companion_rcs_cmd_pool);
-      assert(pool != NULL);
+   VK_FROM_HANDLE(vk_command_pool, pool,
+                  cmd_buffer->device->companion_rcs_cmd_pool);
+   assert(pool != NULL);
 
-      struct vk_command_buffer *tmp_cmd_buffer = NULL;
-      result = pool->command_buffer_ops->create(pool, &tmp_cmd_buffer);
-      if (result != VK_SUCCESS) {
-         pthread_mutex_unlock(&cmd_buffer->device->mutex);
-         return result;
-      }
+   struct vk_command_buffer *tmp_cmd_buffer = NULL;
+   result = pool->command_buffer_ops->create(pool, &tmp_cmd_buffer);
 
-      cmd_buffer->companion_rcs_cmd_buffer =
-         container_of(tmp_cmd_buffer, struct anv_cmd_buffer, vk);
-      cmd_buffer->companion_rcs_cmd_buffer->vk.level = cmd_buffer->vk.level;
-      cmd_buffer->companion_rcs_cmd_buffer->is_companion_rcs_cmd_buffer = true;
-   }
-   pthread_mutex_unlock(&cmd_buffer->device->mutex);
+   if (result != VK_SUCCESS)
+      goto unlock_and_return;
 
+   cmd_buffer->companion_rcs_cmd_buffer =
+      container_of(tmp_cmd_buffer, struct anv_cmd_buffer, vk);
+   cmd_buffer->companion_rcs_cmd_buffer->vk.level = cmd_buffer->vk.level;
+   cmd_buffer->companion_rcs_cmd_buffer->is_companion_rcs_cmd_buffer = true;
+
+unlock_and_return:
+   pthread_mutex_unlock(&cmd_buffer->device->mutex);
    return result;
 }
 
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index a3551b8b191..c75fa733713 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -5334,7 +5334,7 @@ anv_cmd_buffer_fill_area(struct anv_cmd_buffer 
*cmd_buffer,
                          uint32_t data);
 
 VkResult
-anv_create_companion_rcs_command_buffer(struct anv_cmd_buffer *cmd_buffer);
+anv_cmd_buffer_ensure_rcs_companion(struct anv_cmd_buffer *cmd_buffer);
 
 bool
 anv_can_hiz_clear_ds_view(struct anv_device *device,
diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 7154ab68670..2e7b0e5e37a 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -3714,13 +3714,12 @@ genX(CmdExecuteCommands)(
        * command buffer for execution if secondary RCS is valid.
        */
       if (secondary->companion_rcs_cmd_buffer != NULL) {
-         if (container->companion_rcs_cmd_buffer == NULL) {
-            VkResult result = 
anv_create_companion_rcs_command_buffer(container);
-            if (result != VK_SUCCESS) {
-               anv_batch_set_error(&container->batch, result);
-               return;
-            }
+         VkResult result = anv_cmd_buffer_ensure_rcs_companion(container);
+         if (result != VK_SUCCESS) {
+            anv_batch_set_error(&container->batch, result);
+            return;
          }
+
          anv_cmd_buffer_add_secondary(container->companion_rcs_cmd_buffer,
                                       secondary->companion_rcs_cmd_buffer);
       }

Reply via email to