[PATCH xf86-video-ati 4/5] Fix build against older versions of xserver

Michel Dänzer michel at daenzer.net
Wed Mar 23 09:52:09 UTC 2016


From: Michel Dänzer <michel.daenzer at amd.com>

Also slightly clean up the error handling in radeon_scanout_do_update.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94614
Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/drmmode_display.c | 21 +++++++++++++++++----
 src/radeon_kms.c      | 22 +++++++++++++++-------
 src/radeon_list.h     |  1 +
 3 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index cb0b0a0..7ed8d6c 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -39,6 +39,7 @@
 #include "radeon.h"
 #include "radeon_bo_helper.h"
 #include "radeon_glamor.h"
+#include "radeon_list.h"
 #include "radeon_reg.h"
 
 #ifdef RADEON_PIXMAP_SHARING
@@ -361,6 +362,8 @@ drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
 					    crtc->x, crtc->y);
 }
 
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10
+
 static PixmapPtr
 create_pixmap_for_fbcon(drmmode_ptr drmmode,
 			ScrnInfoPtr pScrn, int fbcon_id)
@@ -424,8 +427,6 @@ destroy_pixmap_for_fbcon(ScrnInfoPtr pScrn)
 	info->fbcon_pixmap = NULL;
 }
 
-#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10
-
 void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 {
 	xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
@@ -627,16 +628,20 @@ drmmode_can_use_hw_cursor(xf86CrtcPtr crtc)
 	if (crtc->transformPresent)
 		return FALSE;
 
+#if XF86_CRTC_VERSION >= 4
 	/* Xorg doesn't correctly handle cursor position transform in the
 	 * rotation case
 	 */
 	if (crtc->driverIsPerformingTransform &&
 	    (crtc->rotation & 0xf) != RR_Rotate_0)
 		return FALSE;
+#endif
 
+#ifdef RADEON_PIXMAP_SHARING
 	/* HW cursor not supported yet with RandR 1.4 multihead */
 	if (!xorg_list_is_empty(&crtc->scrn->pScreen->pixmap_dirty_list))
 		return FALSE;
+#endif
 
 	return TRUE;
 }
@@ -770,8 +775,11 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 
 			drmmode_crtc_scanout_destroy(drmmode, &drmmode_crtc->scanout[0]);
 			drmmode_crtc_scanout_destroy(drmmode, &drmmode_crtc->scanout[1]);
-		} else if (info->tear_free || info->shadow_primary ||
-			   crtc->driverIsPerformingTransform) {
+		} else if (info->tear_free ||
+#if XF86_CRTC_VERSION >= 4
+			   crtc->driverIsPerformingTransform ||
+#endif
+			   info->shadow_primary) {
 			for (i = 0; i < (info->tear_free ? 2 : 1); i++) {
 				drmmode_crtc_scanout_create(crtc,
 							    &drmmode_crtc->scanout[i],
@@ -2570,7 +2578,12 @@ restart_destroy:
 	}
 
 	if (changed) {
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,14,99,2,0)
 		RRSetChanged(xf86ScrnToScreen(scrn));
+#else
+		rrScrPrivPtr rrScrPriv = rrGetScrPriv(scrn->pScreen);
+		rrScrPriv->changed = TRUE;
+#endif
 		RRTellChanged(xf86ScrnToScreen(scrn));
 	}
 
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index d6a9aa9..3864281 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -393,6 +393,7 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
     force = info->accel_state->force;
     info->accel_state->force = TRUE;
 
+#if XF86_CRTC_VERSION >= 4
     if (xf86_crtc->driverIsPerformingTransform) {
 	SourceValidateProcPtr SourceValidate = pScreen->SourceValidate;
 	PictFormatPtr format = PictureWindowFormat(pScreen->root);
@@ -415,14 +416,14 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
 	if (!dst) {
 	    ErrorF("Failed to create destination picture for transformed scanout "
 		   "update\n");
-	    goto out;
+	    goto free_src;
 	}
 
 	error = SetPictureTransform(src, &xf86_crtc->crtc_to_framebuffer);
 	if (error) {
 	    ErrorF("SetPictureTransform failed for transformed scanout "
 		   "update\n");
-	    goto out;
+	    goto free_dst;
 	}
 
 	if (xf86_crtc->filter)
@@ -443,9 +444,14 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
 			 extents.y2 - extents.y1);
 	pScreen->SourceValidate = SourceValidate;
 
-	FreePicture(src, None);
+ free_dst:
 	FreePicture(dst, None);
-    } else {
+ free_src:
+	FreePicture(src, None);
+    } else
+ out:
+#endif /* XF86_CRTC_VERSION >= 4 */
+    {
 	GCPtr gc = GetScratchGC(pDraw->depth, pScreen);
 
 	ValidateGC(pDraw, gc);
@@ -459,7 +465,6 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
 
     radeon_cs_flush_indirect(scrn);
 
- out:
     info->accel_state->force = force;
 
     return TRUE;
@@ -607,8 +612,11 @@ static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
     for (c = 0; c < xf86_config->num_crtc; c++) {
 	if (info->tear_free)
 	    radeon_scanout_flip(pScreen, info, xf86_config->crtc[c]);
-	else if (info->shadow_primary ||
-		 xf86_config->crtc[c]->driverIsPerformingTransform)
+	else if (info->shadow_primary
+#if XF86_CRTC_VERSION >= 4
+		 || xf86_config->crtc[c]->driverIsPerformingTransform
+#endif
+	    )
 	    radeon_scanout_update(xf86_config->crtc[c]);
     }
 
diff --git a/src/radeon_list.h b/src/radeon_list.h
index 77f74af..a0038c9 100644
--- a/src/radeon_list.h
+++ b/src/radeon_list.h
@@ -30,6 +30,7 @@
 #if !HAVE_XORG_LIST
 #define xorg_list			list
 #define xorg_list_init			list_init
+#define xorg_list_is_empty		list_is_empty
 #define xorg_list_add			list_add
 #define xorg_list_del			list_del
 #define xorg_list_for_each_entry	list_for_each_entry
-- 
2.8.0.rc3



More information about the xorg-driver-ati mailing list