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: