[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