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

Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 16 11:42:42 2023 +0200

radv: Simplify gang CS and semaphore initialization.

Signed-off-by: Timur Kristóf <[email protected]>
Reviewed-by: Samuel Pitoiset <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25796>

---

 src/amd/vulkan/radv_cmd_buffer.c | 49 +++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 69b44266afd..77ca2582415 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -592,9 +592,12 @@ radv_gang_cache_flush(struct radv_cmd_buffer *cmd_buffer)
    cmd_buffer->gang.flush_bits = 0;
 }
 
-static uint64_t
-radv_gang_sem_create(struct radv_cmd_buffer *cmd_buffer)
+static bool
+radv_gang_sem_init(struct radv_cmd_buffer *cmd_buffer)
 {
+   if (cmd_buffer->gang.sem.va)
+      return true;
+
    /* DWORD 0: GFX->ACE semaphore (GFX blocks ACE, ie. ACE waits for GFX)
     * DWORD 1: ACE->GFX semaphore
     */
@@ -602,10 +605,11 @@ radv_gang_sem_create(struct radv_cmd_buffer *cmd_buffer)
    uint32_t va_off = 0;
    if (!radv_cmd_buffer_upload_data(cmd_buffer, sizeof(uint64_t), &sem_init, 
&va_off)) {
       vk_command_buffer_set_error(&cmd_buffer->vk, 
VK_ERROR_OUT_OF_HOST_MEMORY);
-      return 0;
+      return false;
    }
 
-   return radv_buffer_get_va(cmd_buffer->upload.upload_bo) + va_off;
+   cmd_buffer->gang.sem.va = radv_buffer_get_va(cmd_buffer->upload.upload_bo) 
+ va_off;
+   return true;
 }
 
 static bool
@@ -617,15 +621,9 @@ radv_gang_leader_sem_dirty(const struct radv_cmd_buffer 
*cmd_buffer)
 ALWAYS_INLINE static bool
 radv_flush_gang_leader_semaphore(struct radv_cmd_buffer *cmd_buffer)
 {
-   if (!radv_gang_leader_sem_dirty(cmd_buffer))
+   if (!radv_gang_leader_sem_dirty(cmd_buffer) || 
!radv_gang_sem_init(cmd_buffer))
       return false;
 
-   if (!cmd_buffer->gang.sem.va) {
-      cmd_buffer->gang.sem.va = radv_gang_sem_create(cmd_buffer);
-      if (!cmd_buffer->gang.sem.va)
-         return false;
-   }
-
    ASSERTED unsigned cdw_max = radeon_check_space(cmd_buffer->device->ws, 
cmd_buffer->cs, 12);
 
    /* GFX writes a value to the semaphore which ACE can wait for.*/
@@ -651,18 +649,23 @@ radv_wait_gang_leader(struct radv_cmd_buffer *cmd_buffer)
                     cmd_buffer->gang.sem.leader_value, 0xffffffff);
 }
 
-static struct radeon_cmdbuf *
-radv_gang_create(struct radv_cmd_buffer *cmd_buffer)
+static bool
+radv_gang_init(struct radv_cmd_buffer *cmd_buffer)
 {
-   assert(!cmd_buffer->gang.cs);
+   if (cmd_buffer->gang.cs)
+      return true;
+
    struct radv_device *device = cmd_buffer->device;
    struct radeon_cmdbuf *ace_cs =
       device->ws->cs_create(device->ws, AMD_IP_COMPUTE, cmd_buffer->vk.level 
== VK_COMMAND_BUFFER_LEVEL_SECONDARY);
 
-   if (!ace_cs)
+   if (!ace_cs) {
       vk_command_buffer_set_error(&cmd_buffer->vk, 
VK_ERROR_OUT_OF_HOST_MEMORY);
+      return false;
+   }
 
-   return ace_cs;
+   cmd_buffer->gang.cs = ace_cs;
+   return true;
 }
 
 static VkResult
@@ -6448,11 +6451,8 @@ radv_bind_fragment_shader(struct radv_cmd_buffer 
*cmd_buffer, const struct radv_
 static void
 radv_bind_task_shader(struct radv_cmd_buffer *cmd_buffer, const struct 
radv_shader *ts)
 {
-   if (!cmd_buffer->gang.cs) {
-      cmd_buffer->gang.cs = radv_gang_create(cmd_buffer);
-      if (!cmd_buffer->gang.cs)
-         return;
-   }
+   if (!radv_gang_init(cmd_buffer))
+      return;
 
    cmd_buffer->task_rings_needed = true;
 }
@@ -7481,11 +7481,8 @@ radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, 
uint32_t commandBufferCou
       }
 
       if (secondary->gang.cs) {
-         if (!primary->gang.cs) {
-            primary->gang.cs = radv_gang_create(primary);
-            if (!primary->gang.cs)
-               return;
-         }
+         if (!radv_gang_init(primary))
+            return;
 
          struct radeon_cmdbuf *ace_primary = primary->gang.cs;
          struct radeon_cmdbuf *ace_secondary = secondary->gang.cs;

Reply via email to