Commit 4aa35c46 authored by Adam Jackson's avatar Adam Jackson 🎧

fb: Handle ZPixmap planemask in GetImage the other way around

Formerly we'd zero the image data and then pull out a plane at a time.
It's faster to apply the planemask after the fact, since that turns the
GetImage into a memcpy:

  100000.0  101000.0 (1.010) (copy 0xaaaaaaaa) ShmGetImage 10x10 square
   42400.0   59400.0 (1.401) (copy 0xaaaaaaaa) ShmGetImage 100x100 square
    3040.0    5280.0 (1.737) (copy 0xaaaaaaaa) ShmGetImage 500x500 square
   96100.0   95200.0 (0.991) (0xaaaaaaaa) GetImage 10x10 square
   29600.0   36800.0 (1.243) (0xaaaaaaaa) GetImage 100x100 square
    1850.0    2620.0 (1.416) (0xaaaaaaaa) GetImage 500x500 square

Measured with Xvfb at depth 24 on Skylake i7-6560U.
Reviewed-by: Eric Anholt's avatarEric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson's avatarAdam Jackson <ajax@redhat.com>
parent 368f60d4
......@@ -233,13 +233,16 @@ fbGetImage(DrawablePtr pDrawable,
pm = fbReplicatePixel(planeMask, srcBpp);
dstStride = PixmapBytePad(w, pDrawable->depth);
if (pm != FB_ALLONES)
memset(d, 0, dstStride * h);
dstStride /= sizeof(FbStip);
fbBltStip((FbStip *) (src + (y + srcYoff) * srcStride),
FbBitsStrideToStipStride(srcStride),
(x + srcXoff) * srcBpp,
dst, dstStride, 0, w * srcBpp, h, GXcopy, pm, srcBpp);
dst, dstStride, 0, w * srcBpp, h, GXcopy, FB_ALLONES, srcBpp);
if (pm != FB_ALLONES) {
for (int i = 0; i < dstStride * h; i++)
dst[i] &= pm;
}
}
else {
dstStride = BitmapBytePad(w) / sizeof(FbStip);
......
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