[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