diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index d9685163492..f54fe7b65fd 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -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(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); } diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 5f181ec4c60..f6a2e02fa68 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -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; diff --git a/src/freedreno/vulkan/tu_dynamic_rendering.cc b/src/freedreno/vulkan/tu_dynamic_rendering.cc index a883d1dd711..ad8ea2e030a 100644 --- a/src/freedreno/vulkan/tu_dynamic_rendering.cc +++ b/src/freedreno/vulkan/tu_dynamic_rendering.cc @@ -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 &