Author: tkreuzer
Date: Thu Mar 22 20:12:50 2012
New Revision: 56212
URL:
http://svn.reactos.org/svn/reactos?rev=56212&view=rev
Log:
[DIBLIB]
- Implement spacial even more optimized versions of SRCCOPY on equal surfaces for 8,16,24
and 32bpp.
- Add the right-to-left versions to the function tables
- Add _CALCSHIFT macro(s) to calculate the shift in the dib functions, instead of
precalculating it in EngBitBlt. This costs us a few bytes per function (yes, with so many
functions, every byte counts!) but since it's only for 1 and 4 bpp and improves the
code by keeping DIB specific code out of the Eng function, it's reasonable to do so.
- Add optional optimization pragmas
Modified:
trunk/reactos/subsystems/win32/win32k/diblib/BitBlt_SRCCOPY.c
trunk/reactos/subsystems/win32/win32k/diblib/DibLib.c
trunk/reactos/subsystems/win32/win32k/diblib/DibLib.h
trunk/reactos/subsystems/win32/win32k/diblib/DibLib_AllSrcBPP.h
trunk/reactos/subsystems/win32/win32k/diblib/DibLib_BitBlt.h
trunk/reactos/subsystems/win32/win32k/diblib/DibLib_interface.h
Modified: trunk/reactos/subsystems/win32/win32k/diblib/BitBlt_SRCCOPY.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/di…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/BitBlt_SRCCOPY.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/BitBlt_SRCCOPY.c [iso-8859-1] Thu Mar 22
20:12:50 2012
@@ -1,5 +1,55 @@
#include "DibLib.h"
+
+VOID
+FASTCALL
+Dib_BitBlt_SRCCOPY_EqSurf(PBLTDATA pBltData)
+{
+ ULONG cLines, cjWidth = pBltData->ulWidth * pBltData->jDstBpp;
+ PBYTE pjDestBase = pBltData->siDst.pjBase;
+ PBYTE pjSrcBase = pBltData->siSrc.pjBase;
+
+ /* Loop all lines */
+ cLines = pBltData->ulHeight;
+ while (cLines--)
+ {
+ memcpy(pjDestBase, pjSrcBase, cjWidth);
+ pjDestBase += pBltData->siDst.lDelta;
+ pjSrcBase += pBltData->siSrc.lDelta;
+ }
+}
+
+#define Dib_BitBlt_SRCCOPY_S8_D8_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
+#define Dib_BitBlt_SRCCOPY_S16_D16_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
+#define Dib_BitBlt_SRCCOPY_S24_D24_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
+
+/* special movsd optimization on x86 */
+#if defined(_M_IX86) || defined(_M_AMD64)
+VOID
+FASTCALL
+Dib_BitBlt_SRCCOPY_S32_D32_EqSurf(PBLTDATA pBltData)
+{
+ ULONG cLines, cRows = pBltData->ulWidth;
+ PBYTE pjDestBase = pBltData->siDst.pjBase;
+ PBYTE pjSrcBase = pBltData->siSrc.pjBase;
+
+ /* Loop all lines */
+ cLines = pBltData->ulHeight;
+ while (cLines--)
+ {
+ __movsd((PULONG)pjDestBase, (PULONG)pjSrcBase, cRows);
+ pjDestBase += pBltData->siDst.lDelta;
+ pjSrcBase += pBltData->siSrc.lDelta;
+ }
+}
+#else
+#define Dib_BitBlt_SRCCOPY_S32_D32_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
+#endif
+
+#define Dib_BitBlt_SRCCOPY_S8_D8_EqSurf_manual 1
+#define Dib_BitBlt_SRCCOPY_S16_D16_EqSurf_manual 1
+#define Dib_BitBlt_SRCCOPY_S24_D24_EqSurf_manual 1
+#define Dib_BitBlt_SRCCOPY_S32_D32_EqSurf_manual 1
#define __USES_SOURCE 1
#define __USES_PATTERN 0
Modified: trunk/reactos/subsystems/win32/win32k/diblib/DibLib.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/di…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/DibLib.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/DibLib.c [iso-8859-1] Thu Mar 22 20:12:50
2012
@@ -1,5 +1,7 @@
#include "DibLib.h"
+
+BYTE ajShift4[2] = {4, 0};
enum
{
Modified: trunk/reactos/subsystems/win32/win32k/diblib/DibLib.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/di…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/DibLib.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/DibLib.h [iso-8859-1] Thu Mar 22 20:12:50
2012
@@ -9,6 +9,21 @@
#include <windef.h>
#include <wingdi.h>
#include <winddi.h>
+
+#ifdef _OPTIMIZE_DIBLIB
+#ifdef _MSC_VER
+#pragma optimize("g", on)
+#else
+#pragma GCC optimize("O3")
+#endif
+#endif
+
+typedef
+ULONG
+(NTAPI *PFN_XLATE)(XLATEOBJ* pxlo, ULONG ulColor);
+
+extern BYTE ajShift4[2];
+
#include "DibLib_interface.h"
#define _DibXlate(pBltData, ulColor) (pBltData->pfnXlate(pBltData->pxlo, ulColor))
@@ -16,51 +31,54 @@
#define __PASTE_(s1,s2) s1##s2
#define __PASTE(s1,s2) __PASTE_(s1,s2)
-#define __DIB_FUNCTION_NAME_SRCDSTEQ2(name, src_bpp, dst_bpp) Dib_ ## name ## _S ##
src_bpp ## _D ## dst_bpp ## _EqSurf
-#define __DIB_FUNCTION_NAME_SRCDSTEQ(name, src_bpp, dst_bpp)
__DIB_FUNCTION_NAME_SRCDSTEQ2(name, src_bpp, dst_bpp)
-
-#define __DIB_FUNCTION_NAME_SRCDSTEQR2L2(name, src_bpp, dst_bpp) Dib_ ## name ## _S ##
src_bpp ## _D ## dst_bpp ## _EqSurfR2L
-#define __DIB_FUNCTION_NAME_SRCDSTEQR2L(name, src_bpp, dst_bpp)
__DIB_FUNCTION_NAME_SRCDSTEQR2L2(name, src_bpp, dst_bpp)
-
#define __DIB_FUNCTION_NAME_SRCDST2(name, src_bpp, dst_bpp) Dib_ ## name ## _S ## src_bpp
## _D ## dst_bpp
#define __DIB_FUNCTION_NAME_SRCDST(name, src_bpp, dst_bpp)
__DIB_FUNCTION_NAME_SRCDST2(name, src_bpp, dst_bpp)
#define __DIB_FUNCTION_NAME_DST2(name, dst_bpp) Dib_ ## name ## _D ## dst_bpp
#define __DIB_FUNCTION_NAME_DST(name, src_bpp, dst_bpp) __DIB_FUNCTION_NAME_DST2(name,
dst_bpp)
+#define __DIB_FUNCTION_NAME_SRCDSTEQ(name, src_bpp, dst_bpp)
__DIB_FUNCTION_NAME_SRCDST2(name, src_bpp, dst_bpp) ## _EqSurf
+#define __DIB_FUNCTION_NAME_SRCDSTEQL2R(name, src_bpp, dst_bpp)
__DIB_FUNCTION_NAME_SRCDST2(name, src_bpp, dst_bpp) ## _EqSurfL2R
+#define __DIB_FUNCTION_NAME_SRCDSTEQR2L(name, src_bpp, dst_bpp)
__DIB_FUNCTION_NAME_SRCDST2(name, src_bpp, dst_bpp) ## _EqSurfR2L
#define _ReadPixel_1(pjSource, jShift) (((*(pjSource)) >> (jShift)) & 1)
#define _WritePixel_1(pjDest, jShift, ulColor) (void)(*(pjDest) = (UCHAR)((*(pjDest)
& ~(1<<(jShift))) | ((ulColor)<<(jShift))))
#define _NextPixel_1(ppj, pjShift) (void)((*(pjShift))--, *(pjShift) &= 7, (*(ppj) +=
(*(pjShift) >> 5)))
#define _NextPixelR2L_1(ppj, pjShift) (void)((*(ppj) -= (*(pjShift) >> 5)),
(*(pjShift))++, *(pjShift) &= 7)
#define _SHIFT_1(x) x
+#define _CALCSHIFT_1(pShift, x) (void)(*(pShift) = (7 - ((x) & 7)))
#define _ReadPixel_4(pjSource, jShift) (((*(pjSource)) >> (jShift)) & 15)
#define _WritePixel_4(pjDest, jShift, ulColor) (void)(*(pjDest) = (UCHAR)((*(pjDest)
& ~(15<<(jShift))) | ((ulColor)<<(jShift))))
#define _NextPixel_4(ppj, pjShift) (void)((*(ppj) += (*(pjShift) & 1)), (*(pjShift))
-= 4, *(pjShift) &= 7)
#define _NextPixelR2L_4(ppj, pjShift) (void)((*(pjShift)) -= 4, *(pjShift) &= 7,
(*(ppj) -= (*(pjShift) & 1)))
#define _SHIFT_4(x) x
+#define _CALCSHIFT_4(pShift, x) (void)(*(pShift) = ajShift4[(x) & 1])
#define _ReadPixel_8(pjSource, x) (*(UCHAR*)(pjSource))
#define _WritePixel_8(pjDest, x, ulColor) (void)(*(UCHAR*)(pjDest) = (UCHAR)(ulColor))
#define _NextPixel_8(ppj, pjShift) (void)(*(ppj) += 1)
#define _NextPixelR2L_8(ppj, pjShift) (void)(*(ppj) -= 1)
#define _SHIFT_8(x)
+#define _CALCSHIFT_8(pShift, x)
#define _ReadPixel_16(pjSource, x) (*(USHORT*)(pjSource))
#define _WritePixel_16(pjDest, x, ulColor) (void)(*(USHORT*)(pjDest) =
(USHORT)(ulColor))
#define _NextPixel_16(ppj, pjShift) (void)(*(ppj) -= 2)
#define _NextPixelR2L_16(ppj, pjShift) (void)(*(ppj) += 2)
#define _SHIFT_16(x)
+#define _CALCSHIFT_16(pShift, x)
#define _ReadPixel_24(pjSource, x) ((pjSource)[0] | ((pjSource)[1] << 8) |
((pjSource)[2] << 16))
#define _WritePixel_24(pjDest, x, ulColor) (void)(((pjDest)[0] =
((ulColor)&0xFF)),((pjDest)[1] = (((ulColor)>>8)&0xFF)),((pjDest)[2] =
(((ulColor)>>16)&0xFF)))
#define _NextPixel_24(ppj, pjShift) (void)(*(ppj) -= 3)
#define _NextPixelR2L_24(ppj, pjShift) (void)(*(ppj) += 3)
#define _SHIFT_24(x)
+#define _CALCSHIFT_24(pShift, x)
#define _ReadPixel_32(pjSource, x) (*(ULONG*)(pjSource))
#define _WritePixel_32(pjDest, x, ulColor) (void)(*(ULONG*)(pjDest) = (ulColor))
#define _NextPixel_32(ppj, pjShift) (void)(*(ppj) += 4)
#define _NextPixelR2L_32(ppj, pjShift) (void)(*(ppj) -= 4)
#define _SHIFT_32(x)
+#define _CALCSHIFT_32(pShift, x)
Modified: trunk/reactos/subsystems/win32/win32k/diblib/DibLib_AllSrcBPP.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/di…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/DibLib_AllSrcBPP.h [iso-8859-1]
(original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/DibLib_AllSrcBPP.h [iso-8859-1] Thu Mar
22 20:12:50 2012
@@ -44,7 +44,15 @@
PFN_DIBFUNCTION
__PASTE(gapfn, __FUNCTIONNAME)[7][7] =
{
- {0, 0, 0, 0, 0, 0},
+ {
+ 0,
+ __DIB_FUNCTION_NAME_SRCDSTEQR2L(__FUNCTIONNAME, 1, 1),
+ __DIB_FUNCTION_NAME_SRCDSTEQR2L(__FUNCTIONNAME, 4, 4),
+ __DIB_FUNCTION_NAME_SRCDSTEQR2L(__FUNCTIONNAME, 8, 8),
+ __DIB_FUNCTION_NAME_SRCDSTEQR2L(__FUNCTIONNAME, 16, 16),
+ __DIB_FUNCTION_NAME_SRCDSTEQR2L(__FUNCTIONNAME, 24, 24),
+ __DIB_FUNCTION_NAME_SRCDSTEQR2L(__FUNCTIONNAME, 32, 32),
+ },
{
__DIB_FUNCTION_NAME_SRCDSTEQ(__FUNCTIONNAME, 1, 1),
__DIB_FUNCTION_NAME_SRCDST(__FUNCTIONNAME, 1, 1),
Modified: trunk/reactos/subsystems/win32/win32k/diblib/DibLib_BitBlt.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/di…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/DibLib_BitBlt.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/DibLib_BitBlt.h [iso-8859-1] Thu Mar 22
20:12:50 2012
@@ -9,6 +9,9 @@
#define _WritePixel(pj, jShift, c) __PASTE(_WritePixel_, _DEST_BPP)(pj, jShift, c)
#define _NextPixel(bpp, ppj, pjShift) __PASTE(_NextPixel_, bpp)(ppj, pjShift)
#define _SHIFT(bpp, x) __PASTE(_SHIFT_, bpp)(x)
+#define _CALCSHIFT(bpp, pshift, x) __PASTE(_CALCSHIFT_, bpp)(pshift, x)
+
+#if (__PASTE(_DibFunction, _manual) != 1)
VOID
FASTCALL
@@ -42,7 +45,7 @@
pjPatBase = pBltData->siPat.pjBase;
pjPatBase += pBltData->siPat.ptOrig.y * pBltData->siPat.lDelta;
pjPattern = pjPatBase + pBltData->siPat.ptOrig.x * _DEST_BPP / 8;
- _SHIFT(_DEST_BPP, jPatShift = pBltData->siPat.jShift0;)
+ _CALCSHIFT(_DEST_BPP, &jPatShift, pBltData->siPat.ptOrig.x);
cPatLines = pBltData->ulPatHeight - pBltData->siPat.ptOrig.y;
cPatRows = pBltData->ulPatWidth - pBltData->siPat.ptOrig.x;
#endif
@@ -57,14 +60,14 @@
{
/* Set current bit pointers and shifts */
pjDest = pjDestBase;
- _SHIFT(_DEST_BPP, jDstShift = pBltData->siDst.jShift0;)
+ _CALCSHIFT(_DEST_BPP, &jDstShift, pBltData->siDst.ptOrig.x);
#if __USES_SOURCE
pjSource = pjSrcBase;
- _SHIFT(_SOURCE_BPP, jSrcShift = pBltData->siSrc.jShift0;)
+ _CALCSHIFT(_SOURCE_BPP, &jSrcShift, pBltData->siSrc.ptOrig.x);
#endif
#if __USES_MASK
pjMask = pjMaskBase;
- jMskShift = pBltData->siMsk.jShift0;
+ _CALCSHIFT_1(&jMskShift, pBltData->siMsk.ptOrig.x);
#endif
/* Loop all rows */
@@ -126,5 +129,7 @@
}
}
+#endif // manual
+
#undef _DibFunction
#undef __FUNCTIONNAME2
Modified: trunk/reactos/subsystems/win32/win32k/diblib/DibLib_interface.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/di…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/DibLib_interface.h [iso-8859-1]
(original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/DibLib_interface.h [iso-8859-1] Thu Mar
22 20:12:50 2012
@@ -1,17 +1,14 @@
#include "RopFunctions.h"
-
-typedef
-ULONG
-(NTAPI *PFN_XLATE)(XLATEOBJ* pxlo, ULONG ulColor);
typedef struct
{
ULONG iFormat;
+ PBYTE pvScan0;
PBYTE pjBase;
LONG lDelta;
POINTL ptOrig;
- BYTE jShift0;
+ BYTE jBpp;
} SURFINFO;
typedef struct
@@ -30,6 +27,7 @@
ULONG rop4;
PFN_DOROP apfnDoRop[2];
ULONG ulSolidColor;
+ BYTE jDstBpp;
} BLTDATA, *PBLTDATA;
typedef