On 18/08/16 11:09 PM, Alex Deucher wrote: > On Thu, Aug 18, 2016 at 5:42 AM, Michel Dänzer <mic...@daenzer.net> wrote: >> From: Michel Dänzer <michel.daen...@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.raghu...@amd.com> >> Signed-off-by: Michel Dänzer <michel.daen...@amd.com> > > Reviewed-by: Alex Deucher <alexander.deuc...@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@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 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel