diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index 01690876ec5..236c09b8b3f 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -4374,7 +4374,7 @@ tu_CmdClearAttachments(VkCommandBuffer commandBuffer, if ((pAttachments[j].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) == 0) continue; - tu_lrz_disable_during_renderpass(cmd); + tu_lrz_disable_during_renderpass(cmd, "CmdClearAttachments"); } if (cmd->device->physical_device->info->a7xx.has_generic_clear && diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 511f8588d54..6c509571b26 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -2062,7 +2062,8 @@ tu_trace_end_render_pass(struct tu_cmd_buffer *cmd, bool gmem) trace_end_render_pass(&cmd->trace, &cmd->cs, gmem, cmd->state.rp.drawcall_count, avg_per_sample_bandwidth, cmd->state.lrz.valid, - cmd->state.rp.lrz_disable_reason, addr); + cmd->state.rp.lrz_disable_reason, + cmd->state.rp.lrz_disabled_at_draw, addr); } static void @@ -4260,8 +4261,11 @@ tu_render_pass_state_merge(struct tu_render_pass_state *dst, dst->drawcall_count += src->drawcall_count; dst->drawcall_bandwidth_per_sample_sum += src->drawcall_bandwidth_per_sample_sum; - if (!dst->lrz_disable_reason) + if (!dst->lrz_disable_reason && src->lrz_disable_reason) { dst->lrz_disable_reason = src->lrz_disable_reason; + dst->lrz_disabled_at_draw = + dst->drawcall_count + src->lrz_disabled_at_draw; + } } void diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index d7df362ddf1..7774fdaa858 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -319,6 +319,7 @@ struct tu_render_pass_state uint32_t drawcall_bandwidth_per_sample_sum; const char *lrz_disable_reason; + uint32_t lrz_disabled_at_draw; }; /* These are the states of the suspend/resume state machine. In addition to diff --git a/src/freedreno/vulkan/tu_lrz.cc b/src/freedreno/vulkan/tu_lrz.cc index 4dadb5dd320..da1583b03ae 100644 --- a/src/freedreno/vulkan/tu_lrz.cc +++ b/src/freedreno/vulkan/tu_lrz.cc @@ -55,7 +55,9 @@ static inline void tu_lrz_disable_reason(struct tu_cmd_buffer *cmd, const char *reason) { cmd->state.rp.lrz_disable_reason = reason; - perf_debug(cmd->device, "Disabling LRZ because '%s'", reason); + cmd->state.rp.lrz_disabled_at_draw = cmd->state.rp.drawcall_count; + perf_debug(cmd->device, "Disabling LRZ because '%s' at draw %u", reason, + cmd->state.rp.lrz_disabled_at_draw); } template @@ -274,6 +276,7 @@ tu_lrz_begin_renderpass(struct tu_cmd_buffer *cmd) const struct tu_render_pass *pass = cmd->state.pass; cmd->state.rp.lrz_disable_reason = ""; + cmd->state.rp.lrz_disabled_at_draw = 0; int lrz_img_count = 0; for (unsigned i = 0; i < pass->attachment_count; i++) { @@ -620,10 +623,13 @@ TU_GENX(tu_lrz_clear_depth_image); template void -tu_lrz_disable_during_renderpass(struct tu_cmd_buffer *cmd) +tu_lrz_disable_during_renderpass(struct tu_cmd_buffer *cmd, + const char *reason) { assert(cmd->state.pass); + tu_lrz_disable_reason(cmd, reason); + cmd->state.lrz.valid = false; cmd->state.dirty |= TU_CMD_DIRTY_LRZ; diff --git a/src/freedreno/vulkan/tu_lrz.h b/src/freedreno/vulkan/tu_lrz.h index 58158bcafcc..e58cdaf4a40 100644 --- a/src/freedreno/vulkan/tu_lrz.h +++ b/src/freedreno/vulkan/tu_lrz.h @@ -96,6 +96,7 @@ tu_lrz_sysmem_end(struct tu_cmd_buffer *cmd, struct tu_cs *cs); template void -tu_lrz_disable_during_renderpass(struct tu_cmd_buffer *cmd); +tu_lrz_disable_during_renderpass(struct tu_cmd_buffer *cmd, + const char *reason); #endif /* TU_LRZ_H */ diff --git a/src/freedreno/vulkan/tu_tracepoints.py b/src/freedreno/vulkan/tu_tracepoints.py index 5143a957e94..36f31206897 100644 --- a/src/freedreno/vulkan/tu_tracepoints.py +++ b/src/freedreno/vulkan/tu_tracepoints.py @@ -96,6 +96,7 @@ begin_end_tp('render_pass', Arg(type='uint32_t', var='avgPerSampleBandwidth', c_format='%u'), Arg(type='bool', var='lrz', c_format='%s', to_prim_type='({} ? "true" : "false")'), Arg(type='const char *', var='lrzDisableReason', c_format='%s'), + Arg(type='uint32_t', var='lrzDisabledAtDraw', c_format='%u'), Arg(type='uint32_t', var='lrzStatus', c_format='%s', to_prim_type='(fd_lrz_gpu_dir_to_str((enum fd_lrz_gpu_dir)({} & 0xff)))', is_indirect=True),])