mirror of
https://github.com/X11Libre/xf86-video-ati.git
synced 2026-03-24 09:34:47 +00:00
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>
This commit is contained in:
committed by
Michel Dänzer
parent
1181b9c582
commit
040a7b80e1
@@ -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");
|
||||
|
||||
10
src/radeon.h
10
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user