tu: Fix tracepoints with renderpasses spanning several cmdbufs
- cmdbuf tracepoint moved to tu_cmd_buffer_begin since we want to trace internal cmdbuf where we reconstruct renderpass. - Stomp renderpass start tracepoint if renderpass doesn't end in current cmdbuf, and create new renderpass tracepoint when rp is reconstructed. - Create new trace_rp_drawcalls_start when reconstructing rp in the internal cmdbuf. With this there are no crashes in: dEQP-VK.dynamic_rendering.primary_cmd_buff.* With TU_DEBUG=gmem,forcebin MESA_GPU_TRACES=print Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34981>
This commit is contained in:
committed by
Marge Bot
parent
1cd2a857d6
commit
4a80e0baf6
@@ -3230,6 +3230,14 @@ tu_cmd_buffer_begin(struct tu_cmd_buffer *cmd_buffer,
|
||||
tu_cs_begin(&cmd_buffer->draw_cs);
|
||||
tu_cs_begin(&cmd_buffer->draw_epilogue_cs);
|
||||
|
||||
if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
|
||||
if (u_trace_enabled(&cmd_buffer->device->trace_context)) {
|
||||
trace_start_cmd_buffer(&cmd_buffer->trace, &cmd_buffer->cs,
|
||||
cmd_buffer, tu_env_debug_as_string(),
|
||||
ir3_shader_debug_as_string());
|
||||
}
|
||||
}
|
||||
|
||||
tu_cmd_buffer_status_gpu_write(cmd_buffer, TU_CMD_BUFFER_STATUS_ACTIVE);
|
||||
|
||||
return VK_SUCCESS;
|
||||
@@ -3246,12 +3254,6 @@ tu_BeginCommandBuffer(VkCommandBuffer commandBuffer,
|
||||
|
||||
/* setup initial configuration into command buffer */
|
||||
if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
|
||||
if (u_trace_enabled(&cmd_buffer->device->trace_context)) {
|
||||
trace_start_cmd_buffer(&cmd_buffer->trace, &cmd_buffer->cs,
|
||||
cmd_buffer, tu_env_debug_as_string(),
|
||||
ir3_shader_debug_as_string());
|
||||
}
|
||||
|
||||
switch (cmd_buffer->queue_family_index) {
|
||||
case TU_QUEUE_GENERAL:
|
||||
TU_CALLX(cmd_buffer->device, tu6_init_hw)(cmd_buffer, &cmd_buffer->cs);
|
||||
@@ -4163,6 +4165,25 @@ tu_EndCommandBuffer(VkCommandBuffer commandBuffer)
|
||||
tu_emit_cache_flush<CHIP>(cmd_buffer);
|
||||
}
|
||||
|
||||
/* If we called tu_trace_render_start as part of our suspended chain, and
|
||||
* are going to reconstruct the renderpass setup at cmdbuf submit time,
|
||||
* then disable the recorded tu_trace_render_start event now (we didn't
|
||||
* know at the point of recording it whether this RP's our chain would end
|
||||
* within this command buffer or not) in favor of the one created during
|
||||
* submission.
|
||||
*/
|
||||
if (cmd_buffer->state.suspending) {
|
||||
cmd_buffer->trace_rp_drawcalls_end =
|
||||
u_trace_end_iterator(&cmd_buffer->trace);
|
||||
|
||||
if (cmd_buffer->trace_rp_start.chunk != NULL &&
|
||||
(cmd_buffer->state.suspend_resume == SR_IN_CHAIN ||
|
||||
cmd_buffer->state.suspend_resume == SR_IN_CHAIN_AFTER_PRE_CHAIN)) {
|
||||
u_trace_disable_event_range(cmd_buffer->trace_rp_start,
|
||||
cmd_buffer->trace_rp_drawcalls_start);
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
|
||||
trace_end_cmd_buffer(&cmd_buffer->trace, &cmd_buffer->cs, cmd_buffer);
|
||||
} else {
|
||||
@@ -4921,6 +4942,13 @@ tu_restore_suspended_pass(struct tu_cmd_buffer *cmd,
|
||||
cmd->state.gmem_layout = suspended->state.suspended_pass.gmem_layout;
|
||||
cmd->state.tiling = &cmd->state.framebuffer->tiling[cmd->state.gmem_layout];
|
||||
cmd->state.lrz = suspended->state.suspended_pass.lrz;
|
||||
|
||||
/* Re-emit tracepoint only when renderpass was started in
|
||||
* some previous command buffer and it's being reconstructed
|
||||
* in the internal command buffer.
|
||||
*/
|
||||
if (cmd != suspended)
|
||||
tu_trace_start_render_pass(cmd);
|
||||
}
|
||||
|
||||
/* Take the saved pre-chain in "secondary" and copy its commands to "cmd",
|
||||
@@ -5644,11 +5672,12 @@ tu_CmdBeginRendering(VkCommandBuffer commandBuffer,
|
||||
cmd->state.suspended_pass.gmem_layout = cmd->state.gmem_layout;
|
||||
}
|
||||
|
||||
if (!resuming)
|
||||
if (!resuming) {
|
||||
cmd->trace_rp_start = u_trace_end_iterator(&cmd->trace);
|
||||
tu_trace_start_render_pass(cmd);
|
||||
}
|
||||
|
||||
if (!resuming || cmd->state.suspend_resume == SR_NONE) {
|
||||
tu_trace_start_render_pass(cmd);
|
||||
cmd->trace_rp_drawcalls_start = u_trace_end_iterator(&cmd->trace);
|
||||
}
|
||||
|
||||
|
||||
@@ -572,6 +572,7 @@ struct tu_cmd_buffer
|
||||
struct tu_device *device;
|
||||
|
||||
struct u_trace trace;
|
||||
struct u_trace_iterator trace_rp_start;
|
||||
struct u_trace_iterator trace_rp_drawcalls_start;
|
||||
struct u_trace_iterator trace_rp_drawcalls_end;
|
||||
|
||||
|
||||
@@ -144,6 +144,7 @@ tu_insert_dynamic_cmdbufs(struct tu_device *dev,
|
||||
|
||||
case SR_AFTER_PRE_CHAIN:
|
||||
case SR_IN_CHAIN_AFTER_PRE_CHAIN:
|
||||
cmd_buffer->trace_rp_drawcalls_start = u_trace_end_iterator(&cmd_buffer->trace);
|
||||
tu_append_pre_chain(cmd_buffer, old_cmds[i]);
|
||||
|
||||
if (!(old_cmds[i]->usage_flags &
|
||||
|
||||
Reference in New Issue
Block a user