diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2016-04-12 18:18:43 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2016-05-12 18:52:50 +0900 |
commit | 040a7b80e1fcbaa93ac17f7113d696d9b853cf8a (patch) | |
tree | da6ff385248a8204cb87933da093de5a3b380f41 /src | |
parent | 1181b9c582f10b6c523e4b2988e2ce87ecf3d367 (diff) |
Explicitly set the fbcon pixmap pitch again
The kernel driver returns 0 as the pitch of the fbcon BO via the
DRM_RADEON_GEM_GET_TILING ioctl, so we ended up using an incorrect
pitch in some cases.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94901
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/drmmode_display.c | 16 | ||||
-rw-r--r-- | src/radeon.h | 10 |
2 files changed, 15 insertions, 11 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 84c07c66..4271f042 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -98,6 +98,7 @@ 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); @@ -111,8 +112,16 @@ static PixmapPtr drmmode_create_bo_pixmap(ScrnInfoPtr pScrn, if (!pixmap) return NULL; + if (pitch <= 0 && + (radeon_bo_get_tiling(bo, &tiling, (uint32_t*)&pitch) != 0 || + pitch <= 0)) { + ErrorF("radeon_bo_get_tiling failed to determine pitch\n"); + pScreen->DestroyPixmap(pixmap); + return NULL; + } + if (!(*pScreen->ModifyPixmapHeader)(pixmap, width, height, - depth, bpp, -1, NULL)) { + depth, bpp, pitch, NULL)) { return NULL; } @@ -401,7 +410,8 @@ create_pixmap_for_fbcon(drmmode_ptr drmmode, } pixmap = drmmode_create_bo_pixmap(pScrn, fbcon->width, fbcon->height, - fbcon->depth, fbcon->bpp, bo, NULL); + fbcon->depth, fbcon->bpp, fbcon->pitch, + bo, NULL); info->fbcon_pixmap = pixmap; radeon_bo_unref(bo); out_free_fb: @@ -593,7 +603,7 @@ drmmode_crtc_scanout_create(xf86CrtcPtr crtc, struct drmmode_scanout *scanout, width, height, pScrn->depth, pScrn->bitsPerPixel, - scanout->bo, NULL); + -1, scanout->bo, NULL); if (scanout->pixmap == NULL) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Couldn't allocate scanout pixmap for CRTC\n"); diff --git a/src/radeon.h b/src/radeon.h index 011b66b6..37d5fb60 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -656,8 +656,6 @@ 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)); @@ -693,9 +691,7 @@ static inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo) radeon_bo_ref(bo); priv->bo = bo; - if (radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch) == 0 && - pitch != pPix->devKind) - pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL); + radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch); } out: radeon_set_pixmap_private(pPix, priv); @@ -714,9 +710,7 @@ out: radeon_bo_ref(bo); driver_priv->bo = bo; - if (radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch) == 0 && - pitch != pPix->devKind) - pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL); + radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch); } } } |