[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