[PATCH xserver v3] glamor: Handle bitplane in glamor_copy_fbo_cpu
Michel Dänzer
michel at daenzer.net
Fri Aug 19 07:34:07 UTC 2016
On 18/08/16 11:09 PM, Alex Deucher wrote:
> On Thu, Aug 18, 2016 at 5:42 AM, Michel Dänzer <michel at daenzer.net> wrote:
>> From: Michel Dänzer <michel.daenzer at amd.com>
>>
>> This can significantly speed up at least some CopyPlane cases, e.g.
>> indirectly for stippled fills.
>>
>> v2:
>> * Make temporary pixmap the same size as the destination pixmap
>> (instead of the destination drawable size), and fix coordinate
>> parameters passed to fbCopyXtoX and glamor_upload_boxes. Fixes
>> incorrect rendering rendering with x11perf -copyplane* and crashes
>> with the xscreensaver phosphor hack.
>> v3:
>> * Make the change a bit more compact and hopefully more readable by
>> re-using the existing src_* locals in the bitplane case as well.
>>
>> Reported-by: Keith Raghubar <keith.raghubar at amd.com>
>> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
>
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
Thanks, Alex.
Eric, what do you think about this patch? It can speed up clients
hitting this path by more than an order of magnitude, but it's not
exercised by XTS, and I currently don't have the bandwidth to change that.
>> ---
>> glamor/glamor_copy.c | 40 +++++++++++++++++++++++++++++++++-------
>> 1 file changed, 33 insertions(+), 7 deletions(-)
>>
>> diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c
>> index 3501a0d..5b5f0e6 100644
>> --- a/glamor/glamor_copy.c
>> +++ b/glamor/glamor_copy.c
>> @@ -220,11 +220,37 @@ glamor_copy_cpu_fbo(DrawablePtr src,
>>
>> glamor_get_drawable_deltas(dst, dst_pixmap, &dst_xoff, &dst_yoff);
>>
>> - fbGetDrawable(src, src_bits, src_stride, src_bpp, src_xoff, src_yoff);
>> + if (bitplane) {
>> + PixmapPtr src_pix = fbCreatePixmap(screen, dst_pixmap->drawable.width,
>> + dst_pixmap->drawable.height,
>> + dst->depth, 0);
>> +
>> + if (!src_pix) {
>> + glamor_finish_access(src);
>> + goto bail;
>> + }
>>
>> - glamor_upload_boxes(dst_pixmap, box, nbox, src_xoff + dx, src_yoff + dy,
>> - dst_xoff, dst_yoff,
>> - (uint8_t *) src_bits, src_stride * sizeof (FbBits));
>> + fbGetDrawable(&src_pix->drawable, src_bits, src_stride, src_bpp, src_xoff,
>> + src_yoff);
>> +
>> + if (src->bitsPerPixel > 1)
>> + fbCopyNto1(src, &src_pix->drawable, gc, box, nbox,
>> + dst_xoff + dx, dst_yoff + dy, reverse, upsidedown,
>> + bitplane, closure);
>> + else
>> + fbCopy1toN(src, &src_pix->drawable, gc, box, nbox,
>> + dst_xoff + dx, dst_yoff + dy, reverse, upsidedown,
>> + bitplane, closure);
>> +
>> + glamor_upload_boxes(dst_pixmap, box, nbox, 0, 0, 0, 0,
>> + (uint8_t *) src_bits, src_stride * sizeof(FbBits));
>> + fbDestroyPixmap(src_pix);
>> + } else {
>> + fbGetDrawable(src, src_bits, src_stride, src_bpp, src_xoff, src_yoff);
>> + glamor_upload_boxes(dst_pixmap, box, nbox, src_xoff + dx, src_yoff + dy,
>> + dst_xoff, dst_yoff,
>> + (uint8_t *) src_bits, src_stride * sizeof (FbBits));
>> + }
>> glamor_finish_access(src);
>>
>> return TRUE;
>> @@ -616,9 +642,9 @@ glamor_copy_gl(DrawablePtr src,
>> return glamor_copy_fbo_fbo_draw(src, dst, gc, box, nbox, dx, dy,
>> reverse, upsidedown, bitplane, closure);
>> }
>> - if (bitplane == 0)
>> - return glamor_copy_cpu_fbo(src, dst, gc, box, nbox, dx, dy,
>> - reverse, upsidedown, bitplane, closure);
>> +
>> + return glamor_copy_cpu_fbo(src, dst, gc, box, nbox, dx, dy,
>> + reverse, upsidedown, bitplane, closure);
>> } else if (GLAMOR_PIXMAP_PRIV_HAS_FBO(src_priv) &&
>> dst_priv->type != GLAMOR_DRM_ONLY &&
>> bitplane == 0) {
>> --
>> 2.9.3
>>
>> _______________________________________________
>> xorg-devel at lists.x.org: X.Org development
>> Archives: http://lists.x.org/archives/xorg-devel
>> Info: https://lists.x.org/mailman/listinfo/xorg-devel
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
More information about the xorg-devel
mailing list