[PATCH xserver 2/2] glamor: Avoid software fallback for planemasked ZPixmap GetImage
Adam Jackson
ajax at redhat.com
Wed Sep 28 17:05:44 UTC 2016
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);
+
+ for (int i = 0; i < dstStride * h; i++)
+ dst[i] &= pm;
+ }
+
return TRUE;
bail:
return FALSE;
--
2.9.3
More information about the xorg-devel
mailing list