diff options
Diffstat (limited to '0004-compositor-drm-Gracefully-handle-vblank-and-flip-inv.patch')
-rw-r--r-- | 0004-compositor-drm-Gracefully-handle-vblank-and-flip-inv.patch | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/0004-compositor-drm-Gracefully-handle-vblank-and-flip-inv.patch b/0004-compositor-drm-Gracefully-handle-vblank-and-flip-inv.patch new file mode 100644 index 000000000000..0b4a62b47b40 --- /dev/null +++ b/0004-compositor-drm-Gracefully-handle-vblank-and-flip-inv.patch @@ -0,0 +1,86 @@ +From e207c4f2bf1e359e329b73974184ac4f8ef3a7f3 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/8] compositor-drm: Gracefully handle vblank and flip invalid + timestamps +X-NVConfidentiality: public + +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/compositor-drm.c | 28 +++++++++++++++++++++++++--- + 1 file changed, 25 insertions(+), 3 deletions(-) + +diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c +index c09c49bf..24573f48 100644 +--- a/libweston/compositor-drm.c ++++ b/libweston/compositor-drm.c +@@ -1,6 +1,7 @@ + /* + * Copyright © 2008-2011 Kristian Høgsberg + * Copyright © 2011 Intel Corporation ++ * Copyright © 2016 NVIDIA Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the +@@ -1433,6 +1434,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 +@@ -2434,8 +2448,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; + +@@ -2456,7 +2478,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.15.1 + |