Module Name: xsrc Committed By: macallan Date: Mon Oct 30 22:09:54 UTC 2017
Modified Files: xsrc/external/mit/xf86-video-suncg14/dist/src: cg14.h cg14_accel.c cg14_render.c Log Message: support PictOpAdd with A8 source and ARGB/ABGR destination now labels in windowmaker look right again To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 \ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h \ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_accel.c cvs rdiff -u -r1.9 -r1.10 \ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_render.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h diff -u xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h:1.11 xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h:1.12 --- xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h:1.11 Tue Apr 29 08:40:58 2014 +++ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14.h Mon Oct 30 22:09:54 2017 @@ -144,6 +144,8 @@ void CG14Comp_Over32Mask32_noalpha(Cg14P uint32_t, uint32_t, uint32_t, int, int); void CG14Comp_Add8(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, int, int); +void CG14Comp_Add8_32(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, + int, int); void CG14Comp_Add32(Cg14Ptr, uint32_t, uint32_t, uint32_t, uint32_t, int, int); Index: xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_accel.c diff -u xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_accel.c:1.11 xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_accel.c:1.12 --- xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_accel.c:1.11 Sat Jan 14 00:20:16 2017 +++ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_accel.c Mon Oct 30 22:09:54 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cg14_accel.c,v 1.11 2017/01/14 00:20:16 macallan Exp $ */ +/* $NetBSD: cg14_accel.c,v 1.12 2017/10/30 22:09:54 macallan Exp $ */ /* * Copyright (c) 2013 Michael Lorenz * All rights reserved. @@ -995,9 +995,22 @@ CG14Composite(PixmapPtr pDst, int srcX, case PICT_a8: src = p->srcoff + (srcY * p->srcpitch) + srcX; - dst = dstoff + (dstY * dstpitch) + dstX; - CG14Comp_Add8(p, src, p->srcpitch, - dst, dstpitch, width, height); + if (p->dstformat == PICT_a8) { + dst = dstoff + + (dstY * dstpitch) + dstX; + CG14Comp_Add8(p, + src, p->srcpitch, + dst, dstpitch, + width, height); + } else { + dst = dstoff + + (dstY * dstpitch) + + (dstX << 2); + CG14Comp_Add8_32(p, + src, p->srcpitch, + dst, dstpitch, + width, height); + } break; case PICT_a8r8g8b8: case PICT_x8r8g8b8: Index: xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_render.c diff -u xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_render.c:1.9 xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_render.c:1.10 --- xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_render.c:1.9 Fri Sep 16 22:07:25 2016 +++ xsrc/external/mit/xf86-video-suncg14/dist/src/cg14_render.c Mon Oct 30 22:09:54 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cg14_render.c,v 1.9 2016/09/16 22:07:25 macallan Exp $ */ +/* $NetBSD: cg14_render.c,v 1.10 2017/10/30 22:09:54 macallan Exp $ */ /* * Copyright (c) 2013 Michael Lorenz * All rights reserved. @@ -395,6 +395,77 @@ void CG14Comp_Add8(Cg14Ptr p, } } +void CG14Comp_Add8_32(Cg14Ptr p, + uint32_t src, uint32_t srcpitch, + uint32_t dst, uint32_t dstpitch, + int width, int height) +{ + int line; + uint32_t srcx, dstx, srcoff, dstoff; + int pre, full, part, x; + uint8_t *d; + char buffer[256]; + ENTER; + + srcoff = src & 7; + src &= ~7; + dstoff = dst & 7; + dst &= ~7; + full = width >> 5; /* chunks of 32 */ + part = width & 31; /* leftovers */ + +#ifdef SX_DEBUG + xf86Msg(X_ERROR, "%d %d, %d x %d, %d %d\n", srcpitch, dstpitch, + width, height, full, part); +#endif + /* we do this up to 32 pixels at a time */ + for (line = 0; line < height; line++) { + srcx = src; + dstx = dst; + for (x = 0; x < full; x++) { + /* load source bytes */ + write_sx_io(p, srcx, SX_LDB(8, 31, srcoff)); + /* load alpha from destination */ + write_sx_io(p, dstx, SX_LDUC0(40, 31, dstoff)); + write_sx_reg(p, SX_INSTRUCTIONS, + SX_ADDV(8, 40, 72, 15)); + write_sx_reg(p, SX_INSTRUCTIONS, + SX_ADDV(24, 56, 88, 15)); + /* write clamped values back into dest alpha */ + write_sx_io(p, dstx, SX_STUC0C(72, 31, dstoff)); + srcx += 32; + dstx += 128; + } + + if (part > 0) { + /* do leftovers */ + write_sx_io(p, srcx, SX_LDB(8, part - 1, srcoff)); + write_sx_io(p, dstx, SX_LDUC0(40, part - 1, dstoff)); + if (part > 16) { + write_sx_reg(p, SX_INSTRUCTIONS, + SX_ADDV(8, 40, 72, 15)); + write_sx_reg(p, SX_INSTRUCTIONS, + SX_ADDV(24, 56, 88, part - 17)); + } else { + write_sx_reg(p, SX_INSTRUCTIONS, + SX_ADDV(8, 40, 72, part - 1)); + } + write_sx_io(p, dstx, SX_STUC0C(72, part - 1, dstoff)); + } +#ifdef SX_DEBUG + d = (uint8_t *)(p->fb + src + srcoff); + for (x = 0; x < width; x++) { + buffer[x] = c[d[x]>>5]; + } + buffer[x] = 0; + xf86Msg(X_ERROR, "%s\n", buffer); +#endif + /* next line */ + src += srcpitch; + dst += dstpitch; + } +} + void CG14Comp_Over32(Cg14Ptr p, uint32_t src, uint32_t srcpitch, uint32_t dst, uint32_t dstpitch,