summarylogtreecommitdiffstats
path: root/0004-backend-drm-Gracefully-handle-vblank-and-flip-invali.patch
blob: e2089e965e10ebe5505560b80ea804a5c8755a51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
From 0ed7d25672cf8a2e16f84e336568970e069e0930 Mon Sep 17 00:00:00 2001
From: "Miguel A. Vico" <mvicomoya@nvidia.com>
Date: Tue, 1 Mar 2016 22:19:14 +0100
Subject: [PATCH 4/6] backend-drm: Gracefully handle vblank and flip invalid
 timestamps

Instant query for vblank timestamp may always fail, resulting in
never scheduling a full repaint in drm_output_start_repaint_loop().

Additionally, timestamp provided in page_flip_handler() may also be
invalid.

This change makes both drm_output_start_repaint_loop() and
page_flip_handler() to schedule a full repaint in any of the
situations above.

Signed-off-by: Miguel A Vico Moya <mvicomoya@nvidia.com>
Reviewed-by: Andy Ritger <aritger@nvidia.com>
---
 libweston/backend-drm/drm.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
index e0b1cbd7..bbce70e5 100644
--- a/libweston/backend-drm/drm.c
+++ b/libweston/backend-drm/drm.c
@@ -4,6 +4,7 @@
  * Copyright © 2017, 2018 Collabora, Ltd.
  * Copyright © 2017, 2018 General Electric Company
  * Copyright (c) 2018 DisplayLink (UK) Ltd.
+ * Copyright © 2016-2019 NVIDIA Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
@@ -318,6 +319,19 @@ drm_output_update_complete(struct drm_output *output, uint32_t flags,
 
 	ts.tv_sec = sec;
 	ts.tv_nsec = usec * 1000;
+
+	/* Zero timestamp means failure to get valid timestamp, so
+	 * immediately finish frame
+	 *
+	 * FIXME: Driver should never return an invalid page flip
+	 *        timestamp */
+	if (ts.tv_sec == 0 && ts.tv_nsec == 0) {
+		weston_compositor_read_presentation_clock(
+						output->base.compositor,
+						&ts);
+		flags = WP_PRESENTATION_FEEDBACK_INVALID;
+	}
+
 	weston_output_finish_frame(&output->base, &ts, flags);
 
 	/* We can't call this from frame_notify, because the output's
@@ -525,8 +539,16 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
 	vbl.request.type |= drm_waitvblank_pipe(output);
 	ret = drmWaitVBlank(backend->drm.fd, &vbl);
 
-	/* Error ret or zero timestamp means failure to get valid timestamp */
-	if ((ret == 0) && (vbl.reply.tval_sec > 0 || vbl.reply.tval_usec > 0)) {
+	if (ret) {
+		/* Immediate query failed. It may always fail so we'll never get
+		 * a valid timestamp to update msc and call into finish frame.
+		 * Hence, jump to finish frame here.
+		 */
+		goto finish_frame;
+	}
+
+	/* Zero timestamp means failure to get valid timestamp */
+	if (vbl.reply.tval_sec > 0 || vbl.reply.tval_usec > 0) {
 		ts.tv_sec = vbl.reply.tval_sec;
 		ts.tv_nsec = vbl.reply.tval_usec * 1000;
 
@@ -547,7 +569,7 @@ drm_output_start_repaint_loop(struct weston_output *output_base)
 		}
 	}
 
-	/* Immediate query didn't provide valid timestamp.
+	/* Immediate query succeeded, but didn't provide valid timestamp.
 	 * Use pageflip fallback.
 	 */
 
-- 
2.20.1