tu: Track at which draw call LRZ is disabled

Aside from displaying in a tracepoint, it would be useful in order
to decide whether to disable LRZ for the whole renderpass.

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32868>
This commit is contained in:
Danylo Piliaiev 2025-01-04 22:47:38 +01:00 committed by Marge Bot
parent 33083d580a
commit d6684aedf4
6 changed files with 19 additions and 6 deletions

View file

@ -4374,7 +4374,7 @@ tu_CmdClearAttachments(VkCommandBuffer commandBuffer,
if ((pAttachments[j].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) == 0)
continue;
tu_lrz_disable_during_renderpass<CHIP>(cmd);
tu_lrz_disable_during_renderpass<CHIP>(cmd, "CmdClearAttachments");
}
if (cmd->device->physical_device->info->a7xx.has_generic_clear &&

View file

@ -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

View file

@ -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

View file

@ -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 <chip CHIP>
@ -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 <chip CHIP>
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;

View file

@ -96,6 +96,7 @@ tu_lrz_sysmem_end(struct tu_cmd_buffer *cmd, struct tu_cs *cs);
template <chip CHIP>
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 */

View file

@ -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),])