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

Michel Dänzer daenzer at kemper.freedesktop.org
Thu Jul 13 08:34:45 UTC 2017


 src/drmmode_display.c |   12 +++++++-----
 src/drmmode_display.h |    2 ++
 src/radeon_dri2.c     |    5 +++--
 src/radeon_kms.c      |   23 ++++++++++++++---------
 src/radeon_present.c  |    2 +-
 5 files changed, 27 insertions(+), 17 deletions(-)

New commits:
commit 94dc2b80f3ef0b2c17c20501d824fb0447d52e7a
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Tue Mar 14 16:57:17 2017 +0900

    If a TearFree flip fails, fall back to non-TearFree operation
    
    In order to avoid possible freeze / log file spam in that case.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99769
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 4b964b7b..840071fe 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -496,7 +496,7 @@ void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 	return;
 }
 
-static void
+void
 drmmode_crtc_scanout_destroy(drmmode_ptr drmmode,
 			     struct drmmode_scanout *scanout)
 {
@@ -770,15 +770,17 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode,
 	ScreenPtr screen = scrn->pScreen;
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
-	drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0],
+	drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[scanout_id],
 				    mode->HDisplay, mode->VDisplay);
 	if (drmmode_crtc->tear_free) {
-		drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[1],
+		drmmode_crtc_scanout_create(crtc,
+					    &drmmode_crtc->scanout[scanout_id ^ 1],
 					    mode->HDisplay, mode->VDisplay);
 	}
 
-	if (drmmode_crtc->scanout[0].pixmap &&
-	    (!drmmode_crtc->tear_free || drmmode_crtc->scanout[1].pixmap)) {
+	if (drmmode_crtc->scanout[scanout_id].pixmap &&
+	    (!drmmode_crtc->tear_free ||
+	     drmmode_crtc->scanout[scanout_id ^ 1].pixmap)) {
 		RegionPtr region;
 		BoxPtr box;
 
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index ba1a7bc8..b9bc8fd8 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -192,6 +192,8 @@ extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
 extern void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
 extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
 
+extern void drmmode_crtc_scanout_destroy(drmmode_ptr drmmode,
+					 struct drmmode_scanout *scanout);
 extern void drmmode_scanout_free(ScrnInfoPtr scrn);
 
 extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 955efc62..b22c9840 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -1008,7 +1008,9 @@ static void
 radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame, uint64_t usec,
 			      void *event_data)
 {
-    radeon_scanout_do_update(crtc, 0);
+    drmmode_crtc_private_ptr drmmode_crtc = event_data;
+
+    radeon_scanout_do_update(crtc, drmmode_crtc->scanout_id);
 
     radeon_scanout_update_abort(crtc, event_data);
 }
@@ -1027,7 +1029,6 @@ radeon_scanout_update(xf86CrtcPtr xf86_crtc)
 
     if (!xf86_crtc->enabled ||
 	drmmode_crtc->scanout_update_pending ||
-	!drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap ||
 	drmmode_crtc->pending_dpms_mode != DPMSModeOn)
 	return;
 
@@ -1128,9 +1129,17 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info,
     if (drmmode_page_flip_target_relative(pRADEONEnt, drmmode_crtc,
 					  drmmode_crtc->flip_pending->handle,
 					  0, drm_queue_seq, 0) != 0) {
-	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "flip queue failed in %s: %s\n",
+	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "flip queue failed in %s: %s, "
+		   "TearFree inactive until next modeset\n",
 		   __func__, strerror(errno));
 	radeon_drm_abort_entry(drm_queue_seq);
+	RegionCopy(DamageRegion(drmmode_crtc->scanout_damage),
+		   &drmmode_crtc->scanout_last_region);
+	RegionEmpty(&drmmode_crtc->scanout_last_region);
+	radeon_scanout_update(xf86_crtc);
+	drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode,
+				     &drmmode_crtc->scanout[scanout_id]);
+	drmmode_crtc->tear_free = FALSE;
 	return;
     }
 
@@ -1172,11 +1181,7 @@ static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
 
 	    if (drmmode_crtc->tear_free)
 		radeon_scanout_flip(pScreen, info, crtc);
-	    else if (info->shadow_primary
-#if XF86_CRTC_VERSION >= 4
-		     || crtc->driverIsPerformingTransform
-#endif
-		)
+	    else if (drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap)
 		radeon_scanout_update(crtc);
 	}
     }
commit aff267ee36cc6a703a532f91f82adc1ba1425ff3
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Tue Mar 14 16:23:45 2017 +0900

    Use drmmode_crtc->scanout_id instead of 0 to check for scanout buffer
    
    Preparation for following change, no functional change intended.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 435bf539..35fb60d9 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -728,7 +728,8 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw,
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
 	if (crtc->enabled &&
-	    (crtc->rotatedData || drmmode_crtc->scanout[0].bo))
+	    (crtc->rotatedData ||
+	     drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo))
 	    return FALSE;
     }
 
@@ -777,7 +778,7 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
 	    continue;
 
 	if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
-	    drmmode_crtc->scanout[0].bo)
+	    drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
 	    return FALSE;
 
 	if (drmmode_crtc->pending_dpms_mode == DPMSModeOn)
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 3f14b462..955efc62 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -733,7 +733,7 @@ radeon_prime_scanout_update(PixmapDirtyUpdatePtr dirty)
 
     drmmode_crtc = xf86_crtc->driver_private;
     if (drmmode_crtc->scanout_update_pending ||
-	!drmmode_crtc->scanout[0].pixmap ||
+	!drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap ||
 	drmmode_crtc->pending_dpms_mode != DPMSModeOn)
 	return;
 
@@ -1027,7 +1027,7 @@ radeon_scanout_update(xf86CrtcPtr xf86_crtc)
 
     if (!xf86_crtc->enabled ||
 	drmmode_crtc->scanout_update_pending ||
-	!drmmode_crtc->scanout[0].pixmap ||
+	!drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap ||
 	drmmode_crtc->pending_dpms_mode != DPMSModeOn)
 	return;
 
diff --git a/src/radeon_present.c b/src/radeon_present.c
index e637d786..e3a8f7e2 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -249,7 +249,7 @@ radeon_present_check_unflip(ScrnInfoPtr scrn)
 	    continue;
 
 	if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
-	    drmmode_crtc->scanout[0].bo)
+	    drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo)
 	    return FALSE;
 
 	if (drmmode_crtc->pending_dpms_mode == DPMSModeOn)


More information about the xorg-commit mailing list