Commit 1ad23068 authored by Adam Jackson's avatar Adam Jackson 🎧

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's avatarEric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson's avatarAdam Jackson <ajax@redhat.com>
parent 4aa35c46
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment