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

Author: Timur Kristóf <[email protected]>
Date:   Fri Oct 20 18:48:47 2023 +0200

radv: Slightly refactor gang semaphore functions.

This is in preparation for adding some new ones.

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 | 41 ++++++++++++++++++++++++++--------------
 1 file changed, 27 insertions(+), 14 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 1d8f8539751..7d8fc9760d1 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -619,34 +619,47 @@ 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)
+radv_flush_gang_semaphore(struct radv_cmd_buffer *cmd_buffer, struct 
radeon_cmdbuf *cs, const enum radv_queue_family qf,
+                          const uint32_t va_off, const uint32_t value)
 {
-   if (!radv_gang_leader_sem_dirty(cmd_buffer) || 
!radv_gang_sem_init(cmd_buffer))
+   if (!radv_gang_sem_init(cmd_buffer))
       return false;
 
-   ASSERTED unsigned cdw_max = radeon_check_space(cmd_buffer->device->ws, 
cmd_buffer->cs, 12);
+   ASSERTED unsigned cdw_max = radeon_check_space(cmd_buffer->device->ws, cs, 
12);
 
-   /* GFX writes a value to the semaphore which ACE can wait for.*/
-   si_cs_emit_write_event_eop(cmd_buffer->cs, 
cmd_buffer->device->physical_device->rad_info.gfx_level, cmd_buffer->qf,
+   si_cs_emit_write_event_eop(cs, 
cmd_buffer->device->physical_device->rad_info.gfx_level, qf,
                               V_028A90_BOTTOM_OF_PIPE_TS, 0, EOP_DST_SEL_MEM, 
EOP_DATA_SEL_VALUE_32BIT,
-                              cmd_buffer->gang.sem.va, 
cmd_buffer->gang.sem.leader_value, cmd_buffer->gfx9_eop_bug_va);
-
-   cmd_buffer->gang.sem.emitted_leader_value = 
cmd_buffer->gang.sem.leader_value;
+                              cmd_buffer->gang.sem.va + va_off, value, 
cmd_buffer->gfx9_eop_bug_va);
 
    assert(cmd_buffer->cs->cdw <= cdw_max);
    return true;
 }
 
+ALWAYS_INLINE static bool
+radv_flush_gang_leader_semaphore(struct radv_cmd_buffer *cmd_buffer)
+{
+   if (!radv_gang_leader_sem_dirty(cmd_buffer))
+      return false;
+
+   /* Gang leader writes a value to the semaphore which the follower can wait 
for. */
+   cmd_buffer->gang.sem.emitted_leader_value = 
cmd_buffer->gang.sem.leader_value;
+   return radv_flush_gang_semaphore(cmd_buffer, cmd_buffer->cs, 
cmd_buffer->qf, 0, cmd_buffer->gang.sem.leader_value);
+}
+
 ALWAYS_INLINE static void
-radv_wait_gang_leader(struct radv_cmd_buffer *cmd_buffer)
+radv_wait_gang_semaphore(struct radv_cmd_buffer *cmd_buffer, struct 
radeon_cmdbuf *cs, const enum radv_queue_family qf,
+                         const uint32_t va_off, const uint32_t value)
 {
    assert(cmd_buffer->gang.sem.va);
-   struct radeon_cmdbuf *ace_cs = cmd_buffer->gang.cs;
-   radeon_check_space(cmd_buffer->device->ws, ace_cs, 7);
+   radeon_check_space(cmd_buffer->device->ws, cs, 7);
+   radv_cp_wait_mem(cs, qf, WAIT_REG_MEM_GREATER_OR_EQUAL, 
cmd_buffer->gang.sem.va + va_off, value, 0xffffffff);
+}
 
-   /* ACE waits for the semaphore which GFX wrote. */
-   radv_cp_wait_mem(ace_cs, RADV_QUEUE_COMPUTE, WAIT_REG_MEM_GREATER_OR_EQUAL, 
cmd_buffer->gang.sem.va,
-                    cmd_buffer->gang.sem.leader_value, 0xffffffff);
+ALWAYS_INLINE static void
+radv_wait_gang_leader(struct radv_cmd_buffer *cmd_buffer)
+{
+   /* Follower waits for the semaphore which the gang leader wrote. */
+   radv_wait_gang_semaphore(cmd_buffer, cmd_buffer->gang.cs, 
RADV_QUEUE_COMPUTE, 0, cmd_buffer->gang.sem.leader_value);
 }
 
 static bool

Reply via email to