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

Author: Rohan Garg <rohan.g...@intel.com>
Date:   Mon Nov 20 15:33:33 2023 +0100

anv: introduce ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH

In order to rewrite timestamps for indirect dispatch's, instroduce a
ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH that repacks the PostSync field
for a EXECUTE_INDIRECT_DISPATCH.

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

---

 src/intel/vulkan/anv_cmd_buffer.c  |  2 ++
 src/intel/vulkan/anv_private.h     |  8 ++++++++
 src/intel/vulkan/anv_utrace.c      | 26 ++++++++++++++++++-------
 src/intel/vulkan/genX_cmd_buffer.c | 40 ++++++++++++++++++++++++++++++--------
 4 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/src/intel/vulkan/anv_cmd_buffer.c 
b/src/intel/vulkan/anv_cmd_buffer.c
index 8f8cb887700..86350dd6258 100644
--- a/src/intel/vulkan/anv_cmd_buffer.c
+++ b/src/intel/vulkan/anv_cmd_buffer.c
@@ -81,6 +81,7 @@ anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer)
    anv_cmd_state_init(cmd_buffer);
 
    cmd_buffer->last_compute_walker = NULL;
+   cmd_buffer->last_indirect_dispatch = NULL;
 }
 
 VkResult
@@ -169,6 +170,7 @@ anv_create_cmd_buffer(struct vk_command_pool *pool,
    cmd_buffer->generation.return_addr = ANV_NULL_ADDRESS;
 
    cmd_buffer->last_compute_walker = NULL;
+   cmd_buffer->last_indirect_dispatch = NULL;
 
    memset(&cmd_buffer->generation.shader_state, 0,
           sizeof(cmd_buffer->generation.shader_state));
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index b54400c7014..4fbebd30eff 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -914,6 +914,7 @@ enum anv_timestamp_capture_type {
     ANV_TIMESTAMP_CAPTURE_END_OF_PIPE,
     ANV_TIMESTAMP_CAPTURE_AT_CS_STALL,
     ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER,
+    ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH,
 };
 
 struct anv_physical_device {
@@ -3839,6 +3840,13 @@ struct anv_cmd_buffer {
     */
    void                                        *last_compute_walker;
 
+   /** Pointer to the last emitted EXECUTE_INDIRECT_DISPATCH.
+    *
+    * This is used to edit the instruction post emission to replace the "Post
+    * Sync" field for utrace timestamp emission.
+    */
+   void                                        *last_indirect_dispatch;
+
    struct {
       struct anv_video_session *vid;
       struct anv_video_session_params *params;
diff --git a/src/intel/vulkan/anv_utrace.c b/src/intel/vulkan/anv_utrace.c
index 13e3ffd121f..9a94b60ebfd 100644
--- a/src/intel/vulkan/anv_utrace.c
+++ b/src/intel/vulkan/anv_utrace.c
@@ -403,17 +403,29 @@ anv_utrace_record_ts(struct u_trace *ut, void *cs,
 
    /* Is this a end of compute trace point? */
    const bool is_end_compute =
-      (cs == NULL && cmd_buffer->last_compute_walker != NULL && end_of_pipe);
+      cs == NULL &&
+      (cmd_buffer->last_compute_walker != NULL ||
+       cmd_buffer->last_indirect_dispatch != NULL) &&
+      end_of_pipe;
 
    enum anv_timestamp_capture_type capture_type = end_of_pipe ?
-      is_end_compute ? ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER :
-      ANV_TIMESTAMP_CAPTURE_END_OF_PIPE : ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE;
+      (is_end_compute ?
+       (cmd_buffer->last_indirect_dispatch != NULL ?
+        ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH : 
ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER) :
+       ANV_TIMESTAMP_CAPTURE_END_OF_PIPE) : ANV_TIMESTAMP_CAPTURE_TOP_OF_PIPE;
+
+   void *addr = capture_type ==  ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH ?
+                cmd_buffer->last_indirect_dispatch :
+                capture_type ==  ANV_TIMESTAMP_REWRITE_COMPUTE_WALKER ?
+                cmd_buffer->last_compute_walker : NULL;
+
    device->physical->cmd_emit_timestamp(batch, device, ts_address,
                                         capture_type,
-                                        is_end_compute ?
-                                        cmd_buffer->last_compute_walker : 
NULL);
-   if (is_end_compute)
-         cmd_buffer->last_compute_walker = NULL;
+                                        addr);
+   if (is_end_compute) {
+      cmd_buffer->last_compute_walker = NULL;
+      cmd_buffer->last_indirect_dispatch = NULL;
+   }
 }
 
 static uint64_t
diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 1f186156de4..c735f005c84 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -5894,14 +5894,18 @@ emit_indirect_compute_walker(struct anv_cmd_buffer 
*cmd_buffer,
                                        &dispatch),
    };
 
-   anv_batch_emit(&cmd_buffer->batch, GENX(EXECUTE_INDIRECT_DISPATCH), ind) {
-      ind.PredicateEnable            = predicate;
-      ind.MaxCount                   = 1;
-      ind.COMPUTE_WALKER_BODY        = body;
-      ind.ArgumentBufferStartAddress = indirect_addr;
-      ind.MOCS                       = anv_mocs(cmd_buffer->device,
-                                                indirect_addr.bo, 0);
-   }
+   cmd_buffer->last_indirect_dispatch =
+      anv_batch_emitn(
+         &cmd_buffer->batch,
+         GENX(EXECUTE_INDIRECT_DISPATCH_length),
+         GENX(EXECUTE_INDIRECT_DISPATCH),
+         .PredicateEnable            = predicate,
+         .MaxCount                   = 1,
+         .COMPUTE_WALKER_BODY        = body,
+         .ArgumentBufferStartAddress = indirect_addr,
+         .MOCS                       = anv_mocs(cmd_buffer->device,
+                                                indirect_addr.bo, 0),
+      );
 }
 
 static inline void
@@ -8413,6 +8417,26 @@ void genX(cmd_emit_timestamp)(struct anv_batch *batch,
          ((uint32_t *)data)[i] |= dwords[i];
       break;
    }
+
+   case ANV_TIMESTAMP_REWRITE_INDIRECT_DISPATCH: {
+      uint32_t dwords[GENX(EXECUTE_INDIRECT_DISPATCH_length)];
+
+      GENX(EXECUTE_INDIRECT_DISPATCH_pack)
+      (batch, dwords, &(struct GENX(EXECUTE_INDIRECT_DISPATCH)) {
+            .MOCS = anv_mocs(device, NULL, 0),
+            .COMPUTE_WALKER_BODY = {
+               .PostSync = (struct GENX(POSTSYNC_DATA)) {
+                  .Operation = WriteTimestamp,
+                  .DestinationAddress = addr,
+                  .MOCS = anv_mocs(device, NULL, 0),
+               },
+            }
+      });
+
+      for (uint32_t i = 0; i < ARRAY_SIZE(dwords); i++)
+         ((uint32_t *)data)[i] |= dwords[i];
+      break;
+   }
 #endif
 
    default:

Reply via email to