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.garg@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26421>
This commit is contained in:
Rohan Garg 2023-11-20 15:33:33 +01:00 committed by Marge Bot
parent 9dd49e7a63
commit f3d99e3535
4 changed files with 61 additions and 15 deletions

View file

@ -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));

View file

@ -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;

View file

@ -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

View file

@ -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: