[Spice-devel] [PATCH] uxa: port over tiled fill code from EXA

Alon Levy alevy at redhat.com
Tue Feb 26 06:25:08 PST 2013


On Mon, Feb 25, 2013 at 03:39:00PM +1000, airlied at gmail.com wrote:
> From: Dave Airlie <airlied at gmail.com>
> 
> This makes X -retro actually render fast, as opposed to glacially slow.

Works with xspice. Didn't grok it otherwise.
Tested-by ...

> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/uxa/uxa-accel.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 68 insertions(+), 10 deletions(-)
> 
> diff --git a/src/uxa/uxa-accel.c b/src/uxa/uxa-accel.c
> index e456e6c..f7c32b7 100644
> --- a/src/uxa/uxa-accel.c
> +++ b/src/uxa/uxa-accel.c
> @@ -1137,7 +1137,7 @@ uxa_fill_region_tiled(DrawablePtr pDrawable,
>  	int nbox = REGION_NUM_RECTS(pRegion);
>  	BoxPtr pBox = REGION_RECTS(pRegion);
>  	Bool ret = FALSE;
> -
> +	int i;
>  	tileWidth = pTile->drawable.width;
>  	tileHeight = pTile->drawable.height;
>  
> @@ -1157,24 +1157,31 @@ uxa_fill_region_tiled(DrawablePtr pDrawable,
>  	    !uxa_screen->info->check_copy(pTile, pPixmap, alu, planemask))
>  		return FALSE;
>  
> -	REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
>  
>  	if ((*uxa_screen->info->prepare_copy) (pTile, pPixmap, 1, 1, alu,
>  					       planemask)) {
> -		while (nbox--) {
> -			int height = pBox->y2 - pBox->y1;
> -			int dstY = pBox->y1;
> +		if (xoff || yoff)
> +			REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
> +
> +		  for (i = 0; i < nbox; i++) {
> +			int height = pBox[i].y2 - pBox[i].y1;
> +			int dstY = pBox[i].y1;
>  			int tileY;
>  
> +			if (alu == GXcopy)
> +			    height = min(height, tileHeight);
> +
>  			modulus(dstY - yoff - pDrawable->y - pPatOrg->y,
>  				tileHeight, tileY);
>  
>  			while (height > 0) {
> -				int width = pBox->x2 - pBox->x1;
> -				int dstX = pBox->x1;
> +				int width = pBox[i].x2 - pBox[i].x1;
> +				int dstX = pBox[i].x1;
>  				int tileX;
>  				int h = tileHeight - tileY;
>  
> +				if (alu == GXcopy)
> +				    width = min(width, tileWidth);
>  				if (h > height)
>  					h = height;
>  				height -= h;
> @@ -1198,15 +1205,66 @@ uxa_fill_region_tiled(DrawablePtr pDrawable,
>  				dstY += h;
>  				tileY = 0;
>  			}
> -			pBox++;
>  		}
>  		(*uxa_screen->info->done_copy) (pPixmap);
>  
> -		ret = TRUE;
> +		if (alu != GXcopy)
> +			ret = TRUE;
> +		else {
> +			Bool more_copy = FALSE;
> +
> +			for (i = 0; i < nbox; i++) {
> +				int dstX = pBox[i].x1 + tileWidth;
> +				int dstY = pBox[i].y1 + tileHeight;
> +
> +				if ((dstX < pBox[i].x2) || (dstY < pBox[i].y2)) {
> +					more_copy = TRUE;
> +					break;
> +				}
> +			}
> +
> +			if (more_copy == FALSE)
> +				ret = TRUE;
> +
> +			if (more_copy && (*uxa_screen->info->prepare_copy) (pPixmap, pPixmap, 1, 1, alu, planemask)) {
> +				for (i = 0; i < nbox; i++) {
> +					int dstX = pBox[i].x1 + tileWidth;
> +					int dstY = pBox[i].y1 + tileHeight;
> +					int width = min(pBox[i].x2 - dstX, tileWidth);
> +					int height = min(pBox[i].y2 - pBox[i].y1, tileHeight);
> +
> +					while (dstX < pBox[i].x2) {
> +						(*uxa_screen->info->copy) (pPixmap,
> +									   pBox[i].x1, pBox[i].y1,
> +									   dstX, pBox[i].y1, 
> +									   width, height);
> +						dstX += width;
> +						width = min(pBox[i].x2 - dstX, width * 2);
> +					}
> +
> +					width = pBox[i].x2 - pBox[i].x1;
> +					height = min(pBox[i].y2 - dstY, tileHeight);
> +
> +					while (dstY < pBox[i].y2) {
> +						(*uxa_screen->info->copy) (pPixmap,
> +									   pBox[i].x1, pBox[i].y1,
> +									   pBox[i].x1, dstY, 
> +									   width, height);
> +						dstY += height;
> +						height = min(pBox[i].y2 - dstY, height * 2);
> +					}
> +				}
> +				(*uxa_screen->info->done_copy) (pPixmap);
> +				ret = TRUE;
> +			}
> +		}
> +
> +		if (xoff || yoff)
> +			REGION_TRANSLATE(pScreen, pRegion, -xoff, -yoff);
> +
>  	}
>  
>  out:
> -	REGION_TRANSLATE(pScreen, pRegion, -xoff, -yoff);
>  
>  	return ret;
>  }
> -- 
> 1.8.1.2
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list