fb: FB_SHIFT is 5 (and FB_UNIT is 32)

The other paths don't build or work, PCI and other buses are almost
always 32 bit data paths, and X doesn't really support pixels bigger
than that anyway.

Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Adam Jackson 2014-06-17 11:24:06 -04:00
commit a198373685
9 changed files with 9 additions and 723 deletions

View file

@ -520,277 +520,12 @@ fbBlt24(FbBits * srcLine,
#endif
}
#if FB_SHIFT == FB_STIP_SHIFT + 1
/*
* Could be generalized to FB_SHIFT > FB_STIP_SHIFT + 1 by
* creating an ring of values stepped through for each line
*/
void
fbBltOdd(FbBits * srcLine,
FbStride srcStrideEven,
FbStride srcStrideOdd,
int srcXEven,
int srcXOdd,
FbBits * dstLine,
FbStride dstStrideEven,
FbStride dstStrideOdd,
int dstXEven,
int dstXOdd, int width, int height, int alu, FbBits pm, int bpp)
{
FbBits *src;
int leftShiftEven, rightShiftEven;
FbBits startmaskEven, endmaskEven;
int nmiddleEven;
FbBits *dst;
int leftShiftOdd, rightShiftOdd;
FbBits startmaskOdd, endmaskOdd;
int nmiddleOdd;
int leftShift, rightShift;
FbBits startmask, endmask;
int nmiddle;
int srcX, dstX;
FbBits bits, bits1;
int n;
Bool destInvarient;
Bool even;
FbDeclareMergeRop();
FbInitializeMergeRop(alu, pm);
destInvarient = FbDestInvarientMergeRop();
srcLine += srcXEven >> FB_SHIFT;
dstLine += dstXEven >> FB_SHIFT;
srcXEven &= FB_MASK;
dstXEven &= FB_MASK;
srcXOdd &= FB_MASK;
dstXOdd &= FB_MASK;
FbMaskBits(dstXEven, width, startmaskEven, nmiddleEven, endmaskEven);
FbMaskBits(dstXOdd, width, startmaskOdd, nmiddleOdd, endmaskOdd);
even = TRUE;
InitializeShifts(srcXEven, dstXEven, leftShiftEven, rightShiftEven);
InitializeShifts(srcXOdd, dstXOdd, leftShiftOdd, rightShiftOdd);
while (height--) {
src = srcLine;
dst = dstLine;
if (even) {
srcX = srcXEven;
dstX = dstXEven;
startmask = startmaskEven;
endmask = endmaskEven;
nmiddle = nmiddleEven;
leftShift = leftShiftEven;
rightShift = rightShiftEven;
srcLine += srcStrideEven;
dstLine += dstStrideEven;
even = FALSE;
}
else {
srcX = srcXOdd;
dstX = dstXOdd;
startmask = startmaskOdd;
endmask = endmaskOdd;
nmiddle = nmiddleOdd;
leftShift = leftShiftOdd;
rightShift = rightShiftOdd;
srcLine += srcStrideOdd;
dstLine += dstStrideOdd;
even = TRUE;
}
if (srcX == dstX) {
if (startmask) {
bits = READ(src++);
WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), startmask));
dst++;
}
n = nmiddle;
if (destInvarient) {
while (n--) {
bits = READ(src++);
WRITE(dst, FbDoDestInvarientMergeRop(bits));
dst++;
}
}
else {
while (n--) {
bits = READ(src++);
WRITE(dst, FbDoMergeRop(bits, READ(dst)));
dst++;
}
}
if (endmask) {
bits = READ(src);
WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), endmask));
}
}
else {
bits = 0;
if (srcX > dstX)
bits = READ(src++);
if (startmask) {
bits1 = FbScrLeft(bits, leftShift);
bits = READ(src++);
bits1 |= FbScrRight(bits, rightShift);
WRITE(dst, FbDoMaskMergeRop(bits1, READ(dst), startmask));
dst++;
}
n = nmiddle;
if (destInvarient) {
while (n--) {
bits1 = FbScrLeft(bits, leftShift);
bits = READ(src++);
bits1 |= FbScrRight(bits, rightShift);
WRITE(dst, FbDoDestInvarientMergeRop(bits1));
dst++;
}
}
else {
while (n--) {
bits1 = FbScrLeft(bits, leftShift);
bits = READ(src++);
bits1 |= FbScrRight(bits, rightShift);
WRITE(dst, FbDoMergeRop(bits1, READ(dst)));
dst++;
}
}
if (endmask) {
bits1 = FbScrLeft(bits, leftShift);
if (FbScrLeft(endmask, rightShift)) {
bits = READ(src);
bits1 |= FbScrRight(bits, rightShift);
}
WRITE(dst, FbDoMaskMergeRop(bits1, READ(dst), endmask));
}
}
}
}
void
fbBltOdd24(FbBits * srcLine,
FbStride srcStrideEven,
FbStride srcStrideOdd,
int srcXEven,
int srcXOdd,
FbBits * dstLine,
FbStride dstStrideEven,
FbStride dstStrideOdd,
int dstXEven, int dstXOdd, int width, int height, int alu, FbBits pm)
{
Bool even = TRUE;
while (height--) {
if (even) {
fbBlt24Line(srcLine, srcXEven, dstLine, dstXEven,
width, alu, pm, FALSE);
srcLine += srcStrideEven;
dstLine += dstStrideEven;
even = FALSE;
}
else {
fbBlt24Line(srcLine, srcXOdd, dstLine, dstXOdd,
width, alu, pm, FALSE);
srcLine += srcStrideOdd;
dstLine += dstStrideOdd;
even = TRUE;
}
}
}
#endif
#if FB_STIP_SHIFT != FB_SHIFT
void
fbSetBltOdd(FbStip * stip,
FbStride stipStride,
int srcX,
FbBits ** bits,
FbStride * strideEven,
FbStride * strideOdd, int *srcXEven, int *srcXOdd)
{
int srcAdjust;
int strideAdjust;
/*
* bytes needed to align source
*/
srcAdjust = (((int) stip) & (FB_MASK >> 3));
/*
* FbStip units needed to align stride
*/
strideAdjust = stipStride & (FB_MASK >> FB_STIP_SHIFT);
*bits = (FbBits *) ((char *) stip - srcAdjust);
if (srcAdjust) {
*strideEven = FbStipStrideToBitsStride(stipStride + 1);
*strideOdd = FbStipStrideToBitsStride(stipStride);
*srcXEven = srcX + (srcAdjust << 3);
*srcXOdd = srcX + (srcAdjust << 3) - (strideAdjust << FB_STIP_SHIFT);
}
else {
*strideEven = FbStipStrideToBitsStride(stipStride);
*strideOdd = FbStipStrideToBitsStride(stipStride + 1);
*srcXEven = srcX;
*srcXOdd = srcX + (strideAdjust << FB_STIP_SHIFT);
}
}
#endif
void
fbBltStip(FbStip * src, FbStride srcStride, /* in FbStip units, not FbBits units */
int srcX, FbStip * dst, FbStride dstStride, /* in FbStip units, not FbBits units */
int dstX, int width, int height, int alu, FbBits pm, int bpp)
{
#if FB_STIP_SHIFT != FB_SHIFT
if (FB_STIP_ODDSTRIDE(srcStride) || FB_STIP_ODDPTR(src) ||
FB_STIP_ODDSTRIDE(dstStride) || FB_STIP_ODDPTR(dst)) {
FbStride srcStrideEven, srcStrideOdd;
FbStride dstStrideEven, dstStrideOdd;
int srcXEven, srcXOdd;
int dstXEven, dstXOdd;
FbBits *s, *d;
int sx, dx;
src += srcX >> FB_STIP_SHIFT;
srcX &= FB_STIP_MASK;
dst += dstX >> FB_STIP_SHIFT;
dstX &= FB_STIP_MASK;
fbSetBltOdd(src, srcStride, srcX,
&s, &srcStrideEven, &srcStrideOdd, &srcXEven, &srcXOdd);
fbSetBltOdd(dst, dstStride, dstX,
&d, &dstStrideEven, &dstStrideOdd, &dstXEven, &dstXOdd);
if (bpp == 24 && !FbCheck24Pix(pm)) {
fbBltOdd24(s, srcStrideEven, srcStrideOdd,
srcXEven, srcXOdd,
d, dstStrideEven, dstStrideOdd,
dstXEven, dstXOdd, width, height, alu, pm);
}
else {
fbBltOdd(s, srcStrideEven, srcStrideOdd,
srcXEven, srcXOdd,
d, dstStrideEven, dstStrideOdd,
dstXEven, dstXOdd, width, height, alu, pm, bpp);
}
}
else
#endif
{
fbBlt((FbBits *) src, FbStipStrideToBitsStride(srcStride),
srcX,
(FbBits *) dst, FbStipStrideToBitsStride(dstStride),
dstX, width, height, alu, pm, bpp, FALSE, FALSE);
}
fbBlt((FbBits *) src, FbStipStrideToBitsStride(srcStride), srcX,
(FbBits *) dst, FbStipStrideToBitsStride(dstStride), dstX,
width, height, alu, pm, bpp, FALSE, FALSE);
}