xf86-video-ati: Branch 'master' - 2 commits

Michel Dänzer daenzer at kemper.freedesktop.org
Fri Aug 26 02:35:18 UTC 2016


 src/drmmode_display.c |   19 +++++++++++--------
 src/drmmode_display.h |    1 +
 src/radeon_kms.c      |    2 +-
 3 files changed, 13 insertions(+), 9 deletions(-)

New commits:
commit a36fdaff40d5b4795a1400c348a80eee94892212
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Aug 24 22:52:11 2016 +0900

    Don't override crtc parameter value in drmmode_flip_handler/abort
    
    When overriding the crtc parameter value of the last pending CRTC,
    drmmode_clear_pending_flip would work on the wrong CRTC, and the last
    pending CRTC's flip_pending flag might never get cleared. This would
    prevent that CRTC from properly turning off and back on again.
    
    Fixes: 9090309e057d ("Wait for pending flips to complete before turning
    off an output or CRTC")
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97392
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 96a3c3b..cb228da 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2204,9 +2204,9 @@ drmmode_flip_abort(xf86CrtcPtr crtc, void *event_data)
 	drmmode_flipdata_ptr flipdata = event_data;
 
 	if (--flipdata->flip_count == 0) {
-		if (flipdata->fe_crtc)
-			crtc = flipdata->fe_crtc;
-		flipdata->abort(crtc, flipdata->event_data);
+		if (!flipdata->fe_crtc)
+			flipdata->fe_crtc = crtc;
+		flipdata->abort(flipdata->fe_crtc, flipdata->event_data);
 		free(flipdata);
 	}
 
@@ -2227,11 +2227,14 @@ drmmode_flip_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t usec, void *even
 	}
 
 	if (--flipdata->flip_count == 0) {
-		/* Deliver cached msc, ust from reference crtc to flip event handler */
+		/* Deliver MSC & UST from reference/current CRTC to flip event
+		 * handler
+		 */
 		if (flipdata->fe_crtc)
-			crtc = flipdata->fe_crtc;
-		flipdata->handler(crtc, flipdata->fe_frame, flipdata->fe_usec,
-				  flipdata->event_data);
+			flipdata->handler(flipdata->fe_crtc, flipdata->fe_frame,
+					  flipdata->fe_usec, flipdata->event_data);
+		else
+			flipdata->handler(crtc, frame, usec, flipdata->event_data);
 
 		/* Release framebuffer */
 		drmModeRmFB(info->drmmode.fd, flipdata->old_fb_id);
commit e520ce0ec0adf91ddce5c932d4b3f9477fd49304
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Aug 25 18:22:34 2016 +0900

    Also call drmmode_clear_pending_flip from radeon_scanout_flip_abort
    
    Not doing so could break DPMS with TearFree.
    
    Reported-and-Tested-by: furkan on IRC
    Fixes: 9090309e057d ("Wait for pending flips to complete before turning
    off an output or CRTC")
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 14d86c7..96a3c3b 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2174,7 +2174,7 @@ static const xf86CrtcConfigFuncsRec drmmode_xf86crtc_config_funcs = {
 	drmmode_xf86crtc_resize
 };
 
-static void
+void
 drmmode_clear_pending_flip(xf86CrtcPtr crtc)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 24e3efb..53c7926 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -154,6 +154,7 @@ extern int drmmode_get_crtc_id(xf86CrtcPtr crtc);
 extern int drmmode_get_height_align(ScrnInfoPtr scrn, uint32_t tiling);
 extern int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling);
 extern int drmmode_get_base_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling);
+extern void drmmode_clear_pending_flip(xf86CrtcPtr crtc);
 
 Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
 			uint32_t new_front_handle, uint64_t id, void *data,
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index e353d66..c10fb42 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -786,7 +786,7 @@ radeon_scanout_flip_abort(xf86CrtcPtr crtc, void *event_data)
     drmmode_crtc_private_ptr drmmode_crtc = event_data;
 
     drmmode_crtc->scanout_update_pending = FALSE;
-    drmmode_crtc->flip_pending = FALSE;
+    drmmode_clear_pending_flip(crtc);
 }
 
 static void


More information about the xorg-commit mailing list