[Glamor] [PATCH 2/2] glamor_render: Convert 1bpp to 8bpp before uploading.

He Junyan junyan.he at linux.intel.com
Tue Mar 27 00:48:06 PDT 2012


On My IvyBridge, result is:
./cairo/perf/cairo-perf-trace -i 5 
./cairo-trace/benchmark/grads-heat-map.trace
[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]     null               grads-heat-map    0.083    0.084   0.06%    4/5
[  0]     xlib               grads-heat-map  423.886  471.529   5.32%    2/2

./cairo/perf/cairo-perf-trace -i 5 
./cairo-trace/benchmark/grads-heat-map.trace
[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]     null               grads-heat-map    0.084    0.084   0.06%    4/5
[  0]     xlib               grads-heat-map    3.440    3.539   5.27%    5/5



> From: Zhigang Gong<zhigang.gong at linux.intel.com>
>
> Then we can avoid the extremely fallback path.
>
> Signed-off-by: Zhigang Gong<zhigang.gong at linux.intel.com>
> ---
>   src/glamor_render.c |   71 +++++++++++++++++++++++++++++++++++++++++----------
>   1 files changed, 57 insertions(+), 14 deletions(-)
>
> diff --git a/src/glamor_render.c b/src/glamor_render.c
> index 042fabe..ee087e2 100644
> --- a/src/glamor_render.c
> +++ b/src/glamor_render.c
> @@ -872,6 +872,11 @@ combine_pict_format(PictFormatShort * des, const PictFormatShort src,
>   	}
>   	return FALSE;
>   }
> +static PicturePtr glamor_convert_picture(ScreenPtr screen,
> +					 PicturePtr source,
> +					 int x_source,
> +					 int y_source, int width, int height,
> +					 PictFormatShort new_format);
>
>   static Bool
>   glamor_composite_with_shader(CARD8 op,
> @@ -907,6 +912,8 @@ glamor_composite_with_shader(CARD8 op,
>   	dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
>   	int vert_stride = 4;
>   	int nrect_max;
> +	PicturePtr saved_mask = NULL;
> +	PicturePtr saved_source = NULL;
>   	Bool ret = FALSE;
>
>   	if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
> @@ -1032,6 +1039,33 @@ glamor_composite_with_shader(CARD8 op,
>   		}
>   	}
>   #ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
> +
> +	if (source_status == GLAMOR_UPLOAD_PENDING) {
> +		if (source->pDrawable->depth == 1) {
> +			saved_source = source;
> +			source = glamor_convert_picture(screen, source, 0, 0,
> +							saved_source->pDrawable->width,
> +							saved_source->pDrawable->height,
> +							PICT_a8);
> +
> +			source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
> +			source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
> +		}
> +	}
> +
> +	if (mask_status == GLAMOR_UPLOAD_PENDING) {
> +		if (mask->pDrawable->depth == 1) {
> +			saved_mask = mask;
> +			mask = glamor_convert_picture(screen, mask, 0, 0,
> +							saved_mask->pDrawable->width,
> +							saved_mask->pDrawable->height,
> +							PICT_a8);
> +
> +			mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
> +			mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
> +		}
> +	}
> +
>   	if (source_status == GLAMOR_UPLOAD_PENDING
>   	&&  mask_status == GLAMOR_UPLOAD_PENDING
>   	&&  source_pixmap == mask_pixmap) {
> @@ -1272,6 +1306,11 @@ fail:
>   	if (saved_source_format)
>   		source->format = saved_source_format;
>   done:
> +	if (saved_source)
> +		FreePicture(source, 0);
> +	if (saved_mask)
> +		FreePicture(mask, 0);
> +
>   	return ret;
>   }
>
> @@ -2730,19 +2769,23 @@ GRADIENT_FAIL:
>   #undef LINEAR_DEFAULT_STOPS
>
>   static PicturePtr
> -glamor_convert_gradient_picture(ScreenPtr screen,
> -                                PicturePtr source,
> -                                int x_source,
> -                                int y_source, int width, int height)
> +glamor_convert_picture(ScreenPtr screen,
> +                       PicturePtr source,
> +                       int x_source,
> +                       int y_source, int width, int height,
> +		       PictFormatShort new_format)
>   {
>   	PixmapPtr pixmap;
>   	PicturePtr dst = NULL;
>   	int error;
>   	PictFormatShort format;
> -	if (!source->pDrawable)
> -		format = PICT_a8r8g8b8;
> -	else
> -		format = source->format;
> +	if (new_format == 0) {
> +		if (!source->pDrawable)
> +			format = PICT_a8r8g8b8;
> +		else
> +			format = source->format;
> +	} else
> +		format = new_format;
>
>   	if (!source->pDrawable) {
>   		if (source->pSourcePict->type == SourcePictTypeLinear) {
> @@ -2857,9 +2900,9 @@ _glamor_composite(CARD8 op,
>   		   (glamor_priv, source_pixmap->drawable.width,
>   		    source_pixmap->drawable.height))))) {
>   		temp_src =
> -		    glamor_convert_gradient_picture(screen, source,
> -						    x_source, y_source,
> -						    width, height);
> +		    glamor_convert_picture(screen, source,
> +					   x_source, y_source,
> +					   width, height, 0);
>   		if (!temp_src) {
>   			temp_src = source;
>   			goto fail;
> @@ -2884,9 +2927,9 @@ _glamor_composite(CARD8 op,
>   		/* XXX if mask->pDrawable is the same as source->pDrawable, we have an opportunity
>   		 * to do reduce one convertion. */
>   		temp_mask =
> -		    glamor_convert_gradient_picture(screen, mask,
> -						    x_mask, y_mask,
> -						    width, height);
> +		    glamor_convert_picture(screen, mask,
> +					   x_mask, y_mask,
> +					   width, height, 0);
>   		if (!temp_mask) {
>   			temp_mask = mask;
>   			goto fail;


More information about the Glamor mailing list