tu: Don't leak pre_chain.rp_trace, and correct u_trace_move

pre_chain.rp_trace usage relied on a bunch of bad assumptions
and together with u_trace_move didn't cause issues until
u_trace is started to be refactored. Fixing those bad assumptions
and correctly initializing and freeing pre_chain.rp_trace
also requires fixing u_trace_move at the same time.

u_trace_move fixes:
- If dst had trace chunks in it - we may have leaked them.
- The correct list move pattern is "list_replace -> list_inithead"
  not "list_replace -> list_delinit"

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
This commit is contained in:
Danylo Piliaiev 2026-05-06 14:19:01 +02:00
parent 27c870a283
commit 0a1539d0c0
2 changed files with 8 additions and 1 deletions

View file

@ -4109,6 +4109,7 @@ tu_create_cmd_buffer(struct vk_command_pool *pool,
u_trace_init(&cmd_buffer->trace, &device->trace_context); u_trace_init(&cmd_buffer->trace, &device->trace_context);
u_trace_init(&cmd_buffer->rp_trace, &device->trace_context); u_trace_init(&cmd_buffer->rp_trace, &device->trace_context);
u_trace_init(&cmd_buffer->pre_chain.rp_trace, &device->trace_context);
cmd_buffer->trace_renderpass_start = cmd_buffer->trace_renderpass_start =
u_trace_begin_iterator(&cmd_buffer->rp_trace); u_trace_begin_iterator(&cmd_buffer->rp_trace);
new (&cmd_buffer->autotune_ctx) tu_autotune::cmd_buf_ctx(*device->autotune); new (&cmd_buffer->autotune_ctx) tu_autotune::cmd_buf_ctx(*device->autotune);
@ -4159,6 +4160,7 @@ tu_cmd_buffer_destroy(struct vk_command_buffer *vk_cmd_buffer)
u_trace_fini(&cmd_buffer->trace); u_trace_fini(&cmd_buffer->trace);
u_trace_fini(&cmd_buffer->rp_trace); u_trace_fini(&cmd_buffer->rp_trace);
u_trace_fini(&cmd_buffer->pre_chain.rp_trace);
cmd_buffer->autotune_ctx.~cmd_buf_ctx(); cmd_buffer->autotune_ctx.~cmd_buf_ctx();
@ -4267,6 +4269,9 @@ tu_reset_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer,
u_trace_init(&cmd_buffer->trace, &cmd_buffer->device->trace_context); u_trace_init(&cmd_buffer->trace, &cmd_buffer->device->trace_context);
u_trace_fini(&cmd_buffer->rp_trace); u_trace_fini(&cmd_buffer->rp_trace);
u_trace_init(&cmd_buffer->rp_trace, &cmd_buffer->device->trace_context); u_trace_init(&cmd_buffer->rp_trace, &cmd_buffer->device->trace_context);
u_trace_fini(&cmd_buffer->pre_chain.rp_trace);
u_trace_init(&cmd_buffer->pre_chain.rp_trace,
&cmd_buffer->device->trace_context);
cmd_buffer->trace_renderpass_start = cmd_buffer->trace_renderpass_start =
u_trace_begin_iterator(&cmd_buffer->rp_trace); u_trace_begin_iterator(&cmd_buffer->rp_trace);

View file

@ -796,11 +796,13 @@ u_trace_init(struct u_trace *ut, struct u_trace_context *utctx)
void void
u_trace_move(struct u_trace *dst, struct u_trace *src) u_trace_move(struct u_trace *dst, struct u_trace *src)
{ {
u_trace_fini(dst);
dst->utctx = src->utctx; dst->utctx = src->utctx;
list_replace(&src->trace_chunks, &dst->trace_chunks); list_replace(&src->trace_chunks, &dst->trace_chunks);
dst->num_traces = src->num_traces; dst->num_traces = src->num_traces;
src->num_traces = 0; src->num_traces = 0;
list_delinit(&src->trace_chunks); list_inithead(&src->trace_chunks);
} }
void void