mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 17:50:11 +01:00
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:
parent
9dd49e7a63
commit
f3d99e3535
4 changed files with 61 additions and 15 deletions
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue