From 1ad230682338a9d2fc6eca6966a5bebb007df32c Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 26 Sep 2016 13:28:42 -0400 Subject: [PATCH] glamor: Avoid software fallback for planemasked ZPixmap GetImage 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. Reviewed-by: Eric Anholt Signed-off-by: Adam Jackson --- 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 315874995..453ef79ba 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;