[PATCH xserver 2/2] glamor: Avoid software fallback for planemasked ZPixmap GetImage

Eric Anholt eric at anholt.net
Mon Mar 20 17:42:24 UTC 2017


Adam Jackson <ajax at redhat.com> writes:

> Same trick as in fb: just do a normal GetImage and deal with the
> planemask on the CPU if you have to. Since the software fallback hit for
> glamor is pretty brutal, this is a much more impressive win for glamor
> than it was for fb:
>
>   11100.0  87700.0 (7.901) (copy 0xaaaaaaaa) ShmGetImage 10x10 square
>    9840.0  47800.0 (4.858) (copy 0xaaaaaaaa) ShmGetImage 100x100 square
>    1550.0   4240.0 (2.735) (copy 0xaaaaaaaa) ShmGetImage 500x500 square
>    9450.0  78900.0 (8.349) (0xaaaaaaaa) GetImage 10x10 square
>    6910.0  30900.0 (4.472) (0xaaaaaaaa) GetImage 100x100 square
>     431.0   2020.0 (4.687) (0xaaaaaaaa) GetImage 500x500 square
>
> Measured with Xephyr -glamor on Skylake GT3e.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
>  glamor/glamor_image.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/glamor/glamor_image.c b/glamor/glamor_image.c
> index 3158749..7e17961 100644
> --- a/glamor/glamor_image.c
> +++ b/glamor/glamor_image.c
> @@ -116,7 +116,7 @@ glamor_get_image_gl(DrawablePtr drawable, int x, int y, int w, int h,
>      if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
>          goto bail;
>  
> -    if (format != ZPixmap || !glamor_pm_is_solid(drawable->depth, plane_mask))
> +    if (format != ZPixmap)
>          goto bail;
>  
>      glamor_get_drawable_deltas(drawable, pixmap, &off_x, &off_y);
> @@ -128,6 +128,16 @@ glamor_get_image_gl(DrawablePtr drawable, int x, int y, int w, int h,
>                            drawable->x + off_x, drawable->y + off_y,
>                            -x, -y,
>                            (uint8_t *) d, byte_stride);
> +
> +    if (!glamor_pm_is_solid(drawable->depth, plane_mask)) {
> +        FbStip pm = fbReplicatePixel(plane_mask, drawable->bitsPerPixel);
> +        FbStip *dst = (void *)d;
> +        uint32_t dstStride = byte_stride /= sizeof(FbStip);

I don't think you want the second '=' here.  Harmless, but looked weird.

Other than that, r-b.

> +
> +        for (int i = 0; i < dstStride * h; i++)
> +            dst[i] &= pm;
> +    }
> +
>      return TRUE;
>  bail:
>      return FALSE;
> -- 
> 2.9.3
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.x.org/archives/xorg-devel/attachments/20170320/475dd042/attachment.sig>


More information about the xorg-devel mailing list