[PATCH xf86-video-ati] Pass pitch from drmmode_crtc_scanout_allocate to drmmode_create_bo_pixmap
Deucher, Alexander
Alexander.Deucher at amd.com
Fri Jan 6 14:56:41 UTC 2017
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Michel Dänzer
> Sent: Friday, January 06, 2017 3:37 AM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH xf86-video-ati] Pass pitch from
> drmmode_crtc_scanout_allocate to drmmode_create_bo_pixmap
>
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> radeon_bo_get_tiling can fail, e.g. for linear BOs.
>
> Fixes TearFree not working in those cases.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97873
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> src/drmmode_display.c | 24 +++++++++---------------
> 1 file changed, 9 insertions(+), 15 deletions(-)
>
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index ce8064644..0fb0d7700 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -116,14 +116,6 @@ 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, pitch, NULL)) {
> goto fail;
> @@ -561,7 +553,7 @@ drmmode_scanout_free(ScrnInfoPtr scrn)
> static void *
> drmmode_crtc_scanout_allocate(xf86CrtcPtr crtc,
> struct drmmode_scanout *scanout,
> - int width, int height)
> + int width, int height, int *pitch)
> {
> ScrnInfoPtr pScrn = crtc->scrn;
> RADEONInfoPtr info = RADEONPTR(pScrn);
> @@ -570,7 +562,6 @@ drmmode_crtc_scanout_allocate(xf86CrtcPtr crtc,
> struct radeon_surface surface;
> uint32_t tiling = RADEON_CREATE_PIXMAP_TILING_MACRO;
> int ret;
> - int pitch;
>
> if (scanout->bo) {
> if (scanout->width == width && scanout->height == height)
> @@ -583,14 +574,14 @@ drmmode_crtc_scanout_allocate(xf86CrtcPtr crtc,
> tiling |= RADEON_CREATE_PIXMAP_TILING_MICRO;
> scanout->bo = radeon_alloc_pixmap_bo(pScrn, width, height, pScrn-
> >depth,
> tiling, pScrn->bitsPerPixel,
> - &pitch, &surface, &tiling);
> + pitch, &surface, &tiling);
> if (scanout->bo == NULL)
> return NULL;
>
> radeon_bo_map(scanout->bo, 1);
>
> ret = drmModeAddFB(drmmode->fd, width, height, pScrn->depth,
> - pScrn->bitsPerPixel, pitch,
> + pScrn->bitsPerPixel, *pitch,
> scanout->bo->handle,
> &scanout->fb_id);
> if (ret) {
> @@ -612,6 +603,7 @@ 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;
> + int pitch;
>
> if (scanout->pixmap) {
> if (scanout->width == width && scanout->height == height)
> @@ -621,7 +613,8 @@ drmmode_crtc_scanout_create(xf86CrtcPtr crtc,
> struct drmmode_scanout *scanout,
> }
>
> if (!scanout->bo) {
> - if (!drmmode_crtc_scanout_allocate(crtc, scanout, width,
> height))
> + if (!drmmode_crtc_scanout_allocate(crtc, scanout, width,
> height,
> + &pitch))
> return NULL;
> }
>
> @@ -629,7 +622,7 @@ drmmode_crtc_scanout_create(xf86CrtcPtr crtc,
> struct drmmode_scanout *scanout,
> width, height,
> pScrn->depth,
> pScrn->bitsPerPixel,
> - -1, scanout->bo, NULL);
> + pitch, scanout->bo, NULL);
> if (scanout->pixmap == NULL)
> xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
> "Couldn't allocate scanout pixmap for CRTC\n");
> @@ -1092,9 +1085,10 @@ static void *
> drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
> {
> drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> + int pitch;
>
> return drmmode_crtc_scanout_allocate(crtc, &drmmode_crtc-
> >rotate,
> - width, height);
> + width, height, &pitch);
> }
>
> static PixmapPtr
> --
> 2.11.0
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list