[PATCH xserver v3] glamor: Handle bitplane in glamor_copy_fbo_cpu
Alex Deucher
alexdeucher at gmail.com
Thu Aug 18 14:09:26 UTC 2016
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>
> ---
> 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
More information about the xorg-devel
mailing list