mirror of
https://github.com/X11Libre/xserver.git
synced 2026-11-04 03:36:00 +00:00
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:
parent
3d35bd6b79
commit
a198373685
9 changed files with 9 additions and 723 deletions
271
fb/fbblt.c
271
fb/fbblt.c
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue