From 9c4d2a1f51a80972e314797ece35e95d4bb64aa6 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Wed, 5 Nov 2025 13:06:05 +0100 Subject: [PATCH] tu: Add a reason for concurrent binning disablement to RP tracepoint Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.cc | 25 +++++++++++++++++++++---- src/freedreno/vulkan/tu_cmd_buffer.h | 1 + src/freedreno/vulkan/tu_tracepoints.py | 3 ++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 5c098d3920c..1b82a7567ad 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -2702,7 +2702,8 @@ tu_trace_start_render_pass(struct tu_cmd_buffer *cmd) trace_start_render_pass(&cmd->trace, &cmd->cs, cmd, cmd->state.framebuffer, cmd->state.tiling, max_samples, clear_cpp, - load_cpp, store_cpp, has_depth, ubwc); + load_cpp, store_cpp, has_depth, ubwc, + cmd->state.rp.cb_disable_reason ? cmd->state.rp.cb_disable_reason : ""); } template @@ -2767,16 +2768,29 @@ tu_emit_renderpass_begin(struct tu_cmd_buffer *cmd) cmd->state.fdm_enabled = cmd->state.pass->has_fdm; } +static inline bool +tu7_cb_disable_reason(bool disable_cb, + struct tu_cmd_buffer *cmd, + const char *reason) +{ + if (disable_cb && !cmd->state.rp.cb_disable_reason) { + cmd->state.rp.cb_disable_reason = reason; + } + return disable_cb; +} + static bool tu7_emit_concurrent_binning(struct tu_cmd_buffer *cmd, struct tu_cs *cs, bool disable_cb) { - if (disable_cb || + if (tu7_cb_disable_reason(disable_cb, cmd, "disable_cb") || /* LRZ can only be cleared via fast clear in BV. Disable CB if we can't * use it. */ - !cmd->state.lrz.fast_clear || - TU_DEBUG(NO_CONCURRENT_BINNING)) { + tu7_cb_disable_reason(!cmd->state.lrz.fast_clear, cmd, + "LRZ fast clear disabled") || + tu7_cb_disable_reason(TU_DEBUG(NO_CONCURRENT_BINNING), cmd, + "TU_DEBUG(NO_CONCURRENT_BINNING)")) { tu_cs_emit_pkt7(cs, CP_THREAD_CONTROL, 1); tu_cs_emit(cs, CP_THREAD_CONTROL_0_THREAD(CP_SET_THREAD_BR) | CP_THREAD_CONTROL_0_CONCURRENT_BIN_DISABLE); @@ -2972,6 +2986,9 @@ tu7_emit_concurrent_binning_gmem(struct tu_cmd_buffer *cmd, struct tu_cs *cs, cmd->state.rp.has_vtx_stats_query_in_rp || cmd->state.prim_counters_running > 0; + tu7_cb_disable_reason(disable_cb, cmd, + "xfb/prim-gen/prim-counters/vtx-stats query is running"); + tu7_cb_disable_reason(!use_hw_binning, cmd, "hw binning disabled"); if (!tu7_emit_concurrent_binning(cmd, cs, disable_cb || !use_hw_binning)) return false; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 95466c8d4a8..60c7e3435f2 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -345,6 +345,7 @@ struct tu_render_pass_state uint32_t lrz_write_disabled_at_draw; const char *gmem_disable_reason; + const char *cb_disable_reason; }; /* These are the states of the suspend/resume state machine. In addition to diff --git a/src/freedreno/vulkan/tu_tracepoints.py b/src/freedreno/vulkan/tu_tracepoints.py index b5a57415942..6fac1b65def 100644 --- a/src/freedreno/vulkan/tu_tracepoints.py +++ b/src/freedreno/vulkan/tu_tracepoints.py @@ -102,7 +102,8 @@ begin_end_tp('render_pass', Arg(type='uint8_t', var='loadCPP', c_format='%u'), Arg(type='uint8_t', var='storeCPP', c_format='%u'), Arg(type='bool', var='hasDepth', c_format='%s', to_prim_type='({} ? "true" : "false")'), - Arg(type='str', var='ubwc', c_format='%s', length_arg='11', copy_func='strncpy'),], + Arg(type='str', var='ubwc', c_format='%s', length_arg='11', copy_func='strncpy'), + Arg(type='const char *', var='cbDisableReason', c_format='%s'),], tp_struct=[Arg(type='uint16_t', name='width', var='fb->width', c_format='%u'), Arg(type='uint16_t', name='height', var='fb->height', c_format='%u'), Arg(type='uint8_t', name='attachment_count', var='fb->attachment_count', c_format='%u'),