Adam Jackson <a...@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 <a...@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@lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel

Attachment: signature.asc
Description: PGP signature

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to