[PATCH xf86-video-ati] Update pixmap pitch in radeon_set_pixmap_bo

Michel Dänzer michel at daenzer.net
Thu Mar 31 07:34:16 UTC 2016


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

Stop second guessing it in drmmode_crtc_scanout_create.

Should fix display corruption in some cases with TearFree enabled.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94751
Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/drmmode_display.c | 11 ++---------
 src/radeon.h          | 10 ++++++++--
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 7ed8d6c..7331015 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -97,7 +97,6 @@ RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name)
 static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn,
 					  int width, int height,
 					  int depth, int bpp,
-					  int pitch,
 					  struct radeon_bo *bo, struct radeon_surface *psurf)
 {
 	RADEONInfoPtr info = RADEONPTR(pScrn);
@@ -112,7 +111,7 @@ static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn,
 		return NULL;
 
 	if (!(*pScreen->ModifyPixmapHeader)(pixmap, width, height,
-					    depth, bpp, pitch, NULL)) {
+					    depth, bpp, -1, NULL)) {
 		return NULL;
 	}
 
@@ -401,8 +400,7 @@ create_pixmap_for_fbcon(drmmode_ptr drmmode,
 	}
 
 	pixmap = drmmode_create_bo_pixmap(pScrn, fbcon->width, fbcon->height,
-					  fbcon->depth, fbcon->bpp,
-					  fbcon->pitch, bo, NULL);
+					  fbcon->depth, fbcon->bpp, bo, NULL);
 	info->fbcon_pixmap = pixmap;
 	radeon_bo_unref(bo);
 out_free_fb:
@@ -577,7 +575,6 @@ drmmode_crtc_scanout_create(xf86CrtcPtr crtc, struct drmmode_scanout *scanout,
 	ScrnInfoPtr pScrn = crtc->scrn;
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 	drmmode_ptr drmmode = drmmode_crtc->drmmode;
-	unsigned long rotate_pitch;
 
 	if (scanout->pixmap) {
 		if (scanout->width == width && scanout->height == height)
@@ -591,14 +588,10 @@ drmmode_crtc_scanout_create(xf86CrtcPtr crtc, struct drmmode_scanout *scanout,
 			return NULL;
 	}
 
-	rotate_pitch = RADEON_ALIGN(width, drmmode_get_pitch_align(pScrn, drmmode->cpp, 0))
-		* drmmode->cpp;
-
 	scanout->pixmap = drmmode_create_bo_pixmap(pScrn,
 						 width, height,
 						 pScrn->depth,
 						 pScrn->bitsPerPixel,
-						 rotate_pitch,
 						 scanout->bo, NULL);
 	if (scanout->pixmap == NULL)
 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
diff --git a/src/radeon.h b/src/radeon.h
index 37d5fb6..011b66b 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -656,6 +656,8 @@ uint32_t radeon_get_pixmap_tiling(PixmapPtr pPix);
 
 static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
 {
+    ScreenPtr pScreen = pPix->drawable.pScreen;
+
 #ifdef USE_GLAMOR
     RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
 
@@ -691,7 +693,9 @@ static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
 	    radeon_bo_ref(bo);
 	    priv->bo = bo;
 
-	    radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch);
+	    if (radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch) == 0 &&
+		pitch != pPix->devKind)
+		pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL);
 	}
 out:
 	radeon_set_pixmap_private(pPix, priv);
@@ -710,7 +714,9 @@ out:
 	    radeon_bo_ref(bo);
 	    driver_priv->bo = bo;
 
-	    radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch);
+	    if (radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch) == 0 &&
+		pitch != pPix->devKind)
+		pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL);
 	}
     }
 }
-- 
2.8.0.rc3



More information about the xorg-driver-ati mailing list