From dac5bc0ea5b5d2582333a2145f49766f360c6181 Mon Sep 17 00:00:00 2001
From: Jakob Bornecrantz <jakob@collabora.com>
Date: Wed, 10 Mar 2021 13:55:15 +0000
Subject: [PATCH] u/timing: Deal slightly better when timing info appears to
 time travel

---
 src/xrt/auxiliary/util/u_timing_frame.c | 30 ++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/src/xrt/auxiliary/util/u_timing_frame.c b/src/xrt/auxiliary/util/u_timing_frame.c
index 1bc19819c..2fb20ad46 100644
--- a/src/xrt/auxiliary/util/u_timing_frame.c
+++ b/src/xrt/auxiliary/util/u_timing_frame.c
@@ -627,15 +627,33 @@ trace_frame(FILE *file, struct frame *f)
 	}
 
 	if (!is_within_half_ms(f->actual_present_time_ns, f->desired_present_time_ns)) {
-		trace_begin_id(file, TID_ERROR, "slippage", f->frame_id, "slippage", f->desired_present_time_ns);
-		trace_end(file, TID_ERROR, f->actual_present_time_ns);
+		if (f->actual_present_time_ns > f->desired_present_time_ns) {
+			trace_begin_id(file, TID_ERROR, "slippage", f->frame_id, "slippage",
+			               f->desired_present_time_ns);
+			trace_end(file, TID_ERROR, f->actual_present_time_ns);
+		} else {
+			trace_begin_id(file, TID_ERROR, "run-ahead", f->frame_id, "run-ahead",
+			               f->actual_present_time_ns);
+			trace_end(file, TID_ERROR, f->desired_present_time_ns);
+		}
 	}
 
-	trace_begin_id(file, TID_GPU, "gpu", f->frame_id, "gpu", f->when_submitted_ns);
-	trace_end(file, TID_GPU, f->actual_present_time_ns - f->present_margin_ns);
+	uint64_t gpu_end_ns = f->actual_present_time_ns - f->present_margin_ns;
+	if (gpu_end_ns > f->when_submitted_ns) {
+		trace_begin_id(file, TID_GPU, "gpu", f->frame_id, "gpu", f->when_submitted_ns);
+		trace_end(file, TID_GPU, gpu_end_ns);
+	} else {
+		trace_begin_id(file, TID_GPU, "gpu-time-travel", f->frame_id, "gpu-time-travel", gpu_end_ns);
+		trace_end(file, TID_GPU, f->when_submitted_ns);
+	}
 
-	trace_begin_id(file, TID_INFO, "info", f->frame_id, "info", f->actual_present_time_ns);
-	trace_end(file, TID_INFO, f->when_infoed_ns);
+	if (f->when_infoed_ns >= f->actual_present_time_ns) {
+		trace_begin_id(file, TID_INFO, "info", f->frame_id, "info", f->actual_present_time_ns);
+		trace_end(file, TID_INFO, f->when_infoed_ns);
+	} else {
+		trace_begin_id(file, TID_INFO, "info before", f->frame_id, "info", f->when_infoed_ns);
+		trace_end(file, TID_INFO, f->actual_present_time_ns);
+	}
 
 	trace_event_id(file, "vsync", f->frame_id, f->earliest_present_time_ns);
 	if (f->actual_present_time_ns != f->earliest_present_time_ns) {