mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-16 03:45:24 +00:00
u/pacing: Refactor out tracing writing to own function
This commit is contained in:
parent
5ed13c6cc2
commit
1cafa92c3b
|
@ -393,6 +393,128 @@ adjust_comp_time(struct pacing_compositor *pc, struct frame *f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Metrics and tracing.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_tracing(struct pacing_compositor *pc, struct frame *f)
|
||||||
|
{
|
||||||
|
if (!U_TRACE_CATEGORY_IS_ENABLED(timing)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TE_BEG(TRACK, TIME, NAME) U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(timing, TRACK, TIME, NAME, PERCETTO_I(f->frame_id))
|
||||||
|
#define TE_END(TRACK, TIME) U_TRACE_EVENT_END_ON_TRACK(timing, TRACK, TIME)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* CPU
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
TE_BEG(pc_cpu, f->when_predict_ns, "sleep");
|
||||||
|
TE_END(pc_cpu, f->wake_up_time_ns);
|
||||||
|
|
||||||
|
uint64_t oversleep_start_ns = f->wake_up_time_ns + 1;
|
||||||
|
if (f->when_woke_ns > oversleep_start_ns) {
|
||||||
|
TE_BEG(pc_cpu, oversleep_start_ns, "oversleep");
|
||||||
|
TE_END(pc_cpu, f->when_woke_ns);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* GPU
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint64_t gpu_end_ns = f->actual_present_time_ns - f->present_margin_ns;
|
||||||
|
if (gpu_end_ns > f->when_submitted_ns) {
|
||||||
|
TE_BEG(pc_gpu, f->when_submitted_ns, "gpu");
|
||||||
|
TE_END(pc_gpu, gpu_end_ns);
|
||||||
|
} else {
|
||||||
|
TE_BEG(pc_gpu, gpu_end_ns, "gpu-time-travel");
|
||||||
|
TE_END(pc_gpu, f->when_submitted_ns);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Margin
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (gpu_end_ns < f->desired_present_time_ns) {
|
||||||
|
TE_BEG(pc_margin, gpu_end_ns, "margin");
|
||||||
|
TE_END(pc_margin, f->desired_present_time_ns);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* ERROR
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!is_within_half_ms(f->actual_present_time_ns, f->desired_present_time_ns)) {
|
||||||
|
if (f->actual_present_time_ns > f->desired_present_time_ns) {
|
||||||
|
TE_BEG(pc_error, f->desired_present_time_ns, "slippage");
|
||||||
|
TE_END(pc_error, f->actual_present_time_ns);
|
||||||
|
} else {
|
||||||
|
TE_BEG(pc_error, f->actual_present_time_ns, "run-ahead");
|
||||||
|
TE_END(pc_error, f->desired_present_time_ns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Info
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (f->when_infoed_ns >= f->actual_present_time_ns) {
|
||||||
|
TE_BEG(pc_info, f->actual_present_time_ns, "info");
|
||||||
|
TE_END(pc_info, f->when_infoed_ns);
|
||||||
|
} else {
|
||||||
|
TE_BEG(pc_info, f->when_infoed_ns, "info_before");
|
||||||
|
TE_END(pc_info, f->actual_present_time_ns);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Present
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (f->actual_present_time_ns != f->earliest_present_time_ns) {
|
||||||
|
U_TRACE_INSTANT_ON_TRACK(timing, pc_present, f->earliest_present_time_ns, "earliest");
|
||||||
|
}
|
||||||
|
if (!is_within_half_ms(f->desired_present_time_ns, f->earliest_present_time_ns)) {
|
||||||
|
U_TRACE_INSTANT_ON_TRACK(timing, pc_present, f->desired_present_time_ns, "predicted");
|
||||||
|
}
|
||||||
|
U_TRACE_INSTANT_ON_TRACK(timing, pc_present, f->actual_present_time_ns, "vsync");
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Compositor time
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
TE_BEG(pc_allotted, f->wake_up_time_ns, "allotted");
|
||||||
|
TE_END(pc_allotted, f->wake_up_time_ns + f->current_comp_time_ns);
|
||||||
|
|
||||||
|
#undef TE_BEG
|
||||||
|
#undef TE_END
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Member functions.
|
* Member functions.
|
||||||
|
@ -533,117 +655,8 @@ pc_info(struct u_pacing_compositor *upc,
|
||||||
f->present_margin_ns, //
|
f->present_margin_ns, //
|
||||||
present_margin_ms); //
|
present_margin_ms); //
|
||||||
|
|
||||||
|
// Write out tracing data.
|
||||||
if (!U_TRACE_CATEGORY_IS_ENABLED(timing)) {
|
do_tracing(pc, f);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TE_BEG(TRACK, TIME, NAME) U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(timing, TRACK, TIME, NAME, PERCETTO_I(f->frame_id))
|
|
||||||
#define TE_END(TRACK, TIME) U_TRACE_EVENT_END_ON_TRACK(timing, TRACK, TIME)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* CPU
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
TE_BEG(pc_cpu, f->when_predict_ns, "sleep");
|
|
||||||
TE_END(pc_cpu, f->wake_up_time_ns);
|
|
||||||
|
|
||||||
uint64_t oversleep_start_ns = f->wake_up_time_ns + 1;
|
|
||||||
if (f->when_woke_ns > oversleep_start_ns) {
|
|
||||||
TE_BEG(pc_cpu, oversleep_start_ns, "oversleep");
|
|
||||||
TE_END(pc_cpu, f->when_woke_ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* GPU
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
uint64_t gpu_end_ns = f->actual_present_time_ns - f->present_margin_ns;
|
|
||||||
if (gpu_end_ns > f->when_submitted_ns) {
|
|
||||||
TE_BEG(pc_gpu, f->when_submitted_ns, "gpu");
|
|
||||||
TE_END(pc_gpu, gpu_end_ns);
|
|
||||||
} else {
|
|
||||||
TE_BEG(pc_gpu, gpu_end_ns, "gpu-time-travel");
|
|
||||||
TE_END(pc_gpu, f->when_submitted_ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Margin
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (gpu_end_ns < f->desired_present_time_ns) {
|
|
||||||
TE_BEG(pc_margin, gpu_end_ns, "margin");
|
|
||||||
TE_END(pc_margin, f->desired_present_time_ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* ERROR
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!is_within_half_ms(f->actual_present_time_ns, f->desired_present_time_ns)) {
|
|
||||||
if (f->actual_present_time_ns > f->desired_present_time_ns) {
|
|
||||||
TE_BEG(pc_error, f->desired_present_time_ns, "slippage");
|
|
||||||
TE_END(pc_error, f->actual_present_time_ns);
|
|
||||||
} else {
|
|
||||||
TE_BEG(pc_error, f->actual_present_time_ns, "run-ahead");
|
|
||||||
TE_END(pc_error, f->desired_present_time_ns);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Info
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (f->when_infoed_ns >= f->actual_present_time_ns) {
|
|
||||||
TE_BEG(pc_info, f->actual_present_time_ns, "info");
|
|
||||||
TE_END(pc_info, f->when_infoed_ns);
|
|
||||||
} else {
|
|
||||||
TE_BEG(pc_info, f->when_infoed_ns, "info_before");
|
|
||||||
TE_END(pc_info, f->actual_present_time_ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Present
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (f->actual_present_time_ns != f->earliest_present_time_ns) {
|
|
||||||
U_TRACE_INSTANT_ON_TRACK(timing, pc_present, f->earliest_present_time_ns, "earliest");
|
|
||||||
}
|
|
||||||
if (!is_within_half_ms(f->desired_present_time_ns, f->earliest_present_time_ns)) {
|
|
||||||
U_TRACE_INSTANT_ON_TRACK(timing, pc_present, f->desired_present_time_ns, "predicted");
|
|
||||||
}
|
|
||||||
U_TRACE_INSTANT_ON_TRACK(timing, pc_present, f->actual_present_time_ns, "vsync");
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Compositor time
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
TE_BEG(pc_allotted, f->wake_up_time_ns, "allotted");
|
|
||||||
TE_END(pc_allotted, f->wake_up_time_ns + f->current_comp_time_ns);
|
|
||||||
|
|
||||||
#undef TE_BEG
|
|
||||||
#undef TE_END
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue