windows-nt/Source/XPSP1/NT/multimedia/opengl/server/generic/genspan.c
2020-09-26 16:20:57 +08:00

1327 lines
34 KiB
C

/******************************Module*Header*******************************\
* Module Name: genspan.c *
* *
* This module accelerates common spans. *
* *
* Created: 24-Feb-1994 *
* Author: Otto Berkes [ottob] *
* *
* Copyright (c) 1994 Microsoft Corporation *
\**************************************************************************/
#include "precomp.h"
#pragma hdrstop
/*******************************************************/
void FASTCALL __fastGenDeltaSpan(__GLcontext *gc, SPANREC *spanDelta)
{
GLuint modeflags = gc->polygon.shader.modeFlags;
GENACCEL *pGenAccel = (GENACCEL *)(((__GLGENcontext *)gc)->pPrivateArea);
if (modeflags & __GL_SHADE_RGB) {
if ((modeflags & __GL_SHADE_TEXTURE) && (pGenAccel->texImage)) {
if (modeflags & __GL_SHADE_SMOOTH) {
pGenAccel->spanDelta.r = spanDelta->r;
pGenAccel->spanDelta.g = spanDelta->g;
pGenAccel->spanDelta.b = spanDelta->b;
} else {
pGenAccel->spanDelta.r = 0;
pGenAccel->spanDelta.g = 0;
pGenAccel->spanDelta.b = 0;
}
pGenAccel->spanDelta.s = spanDelta->s;
pGenAccel->spanDelta.t = spanDelta->t;
pGenAccel->__fastSpanFuncPtr = pGenAccel->__fastTexSpanFuncPtr;
} else if (modeflags & __GL_SHADE_SMOOTH) {
if ( ((spanDelta->r | spanDelta->g | spanDelta->b) == 0)
&& ((pGenAccel->flags & GEN_FASTZBUFFER) == 0)
) {
pGenAccel->spanDelta.r = 0;
pGenAccel->spanDelta.g = 0;
pGenAccel->spanDelta.b = 0;
pGenAccel->__fastSpanFuncPtr =
pGenAccel->__fastFlatSpanFuncPtr;
} else {
pGenAccel->spanDelta.r = spanDelta->r;
pGenAccel->spanDelta.g = spanDelta->g;
pGenAccel->spanDelta.b = spanDelta->b;
pGenAccel->__fastSpanFuncPtr =
pGenAccel->__fastSmoothSpanFuncPtr;
}
} else {
pGenAccel->__fastSpanFuncPtr = pGenAccel->__fastFlatSpanFuncPtr;
}
} else {
if (modeflags & __GL_SHADE_SMOOTH) {
if (spanDelta->r == 0) {
pGenAccel->spanDelta.r = 0;
pGenAccel->__fastSpanFuncPtr =
pGenAccel->__fastFlatSpanFuncPtr;
} else {
pGenAccel->spanDelta.r = spanDelta->r;
pGenAccel->__fastSpanFuncPtr =
pGenAccel->__fastSmoothSpanFuncPtr;
}
} else {
pGenAccel->__fastSpanFuncPtr = pGenAccel->__fastFlatSpanFuncPtr;
}
}
#ifdef LATER
pGenAccel->spanDelta.r = spanDelta->r;
pGenAccel->spanDelta.g = spanDelta->g;
pGenAccel->spanDelta.b = spanDelta->b;
pGenAccel->spanDelta.s = spanDelta->s;
pGenAccel->spanDelta.t = spanDelta->t;
if ( modeflags & (__GL_SHADE_RGB | __GL_SHADE_TEXTURE | __GL_SHADE_SMOOTH) ==
__GL_SHADE_RGB | __GL_SHADE_TEXTURE
) {
pGenAccel->spanDelta.r = 0;
pGenAccel->spanDelta.g = 0;
pGenAccel->spanDelta.b = 0;
} else
if ( modeflags & (__GL_SHADE_RGB | __GL_SHADE_TEXTURE | __GL_SHADE_SMOOTH) ==
__GL_SHADE_RGB | __GL_SHADE_SMOOTH
) {
if ((spanDelta->r | spanDelta->g | spanDelta->b) == 0) {
pGenAccel->__fastSpanFuncPtr =
pGenAccel->__fastFlatSpanFuncPtr;
} else {
pGenAccel->__fastSpanFuncPtr =
pGenAccel->__fastSmoothSpanFuncPtr;
}
}
#endif
}
/*******************************************************/
#define ZBUF_PROC(type, pass_cond) \
GLboolean FASTCALL __fastGenDepthTestSpan##type(__GLcontext *gc)\
{\
register GLuint zAccum = gc->polygon.shader.frag.z;\
register GLint zDelta = gc->polygon.shader.dzdx;\
register GLuint *zbuf = gc->polygon.shader.zbuf;\
register GLuint *pStipple = gc->polygon.shader.stipplePat;\
register GLint cTotalPix = gc->polygon.shader.length;\
register GLuint mask;\
register GLint cPix;\
register GLint zPasses = 0;\
register GLuint maskBit;\
\
for (;cTotalPix > 0; cTotalPix-=32) {\
mask = 0;\
maskBit = 0x80000000;\
cPix = cTotalPix;\
if (cPix > 32)\
cPix = 32;\
\
for (;cPix > 0; cPix --) {\
if ((zAccum) pass_cond (*zbuf)) {\
*zbuf = zAccum;\
zPasses++;\
mask |= maskBit;\
}\
*zbuf++;\
zAccum += zDelta;\
maskBit >>= 1;\
}\
\
*pStipple++ = mask;\
}\
\
if (zPasses == 0) {\
gc->polygon.shader.done = TRUE;\
return 1;\
} else if (zPasses == gc->polygon.shader.length) {\
return 0;\
} else {\
return 2;\
}\
}
#define ZBUF16_PROC(type, pass_cond) \
GLboolean FASTCALL __fastGenDepth16TestSpan##type(__GLcontext *gc)\
{\
register GLuint zAccum = gc->polygon.shader.frag.z;\
register __GLz16Value z16Accum = (__GLz16Value) (zAccum >> Z16_SHIFT); \
register GLint zDelta = gc->polygon.shader.dzdx;\
register __GLz16Value *zbuf = (__GLz16Value *) (gc->polygon.shader.zbuf);\
register GLuint *pStipple = gc->polygon.shader.stipplePat;\
register GLint cTotalPix = gc->polygon.shader.length;\
register GLuint mask;\
register GLint cPix;\
register GLint zPasses = 0;\
register GLuint maskBit;\
\
for (;cTotalPix > 0; cTotalPix-=32) {\
mask = 0;\
maskBit = 0x80000000;\
cPix = cTotalPix;\
if (cPix > 32)\
cPix = 32;\
\
for (;cPix > 0; cPix --) {\
if (((__GLz16Value)(zAccum >> Z16_SHIFT)) pass_cond (*zbuf)) {\
*zbuf = ((__GLz16Value)(zAccum >> Z16_SHIFT));\
zPasses++;\
mask |= maskBit;\
}\
*zbuf++;\
zAccum += zDelta;\
maskBit >>= 1;\
}\
\
*pStipple++ = mask;\
}\
\
if (zPasses == 0) {\
gc->polygon.shader.done = TRUE;\
return 1;\
} else if (zPasses == gc->polygon.shader.length) {\
return 0;\
} else {\
return 2;\
}\
}
ZBUF_PROC(LT, <);
ZBUF_PROC(EQ, ==);
ZBUF_PROC(LE, <=);
ZBUF_PROC(GT, >);
ZBUF_PROC(NE, !=);
ZBUF_PROC(GE, >=);
ZBUF_PROC(ALWAYS, || TRUE ||);
GLboolean FASTCALL __fastGenDepthTestSpanNEVER(__GLcontext *gc)
{
return FALSE;
}
ZBUF16_PROC(LT, <);
ZBUF16_PROC(EQ, ==);
ZBUF16_PROC(LE, <=);
ZBUF16_PROC(GT, >);
ZBUF16_PROC(NE, !=);
ZBUF16_PROC(GE, >=);
ZBUF16_PROC(ALWAYS, || TRUE ||);
/*******************************************************/
__GLspanFunc __fastDepthFuncs[] =
{__fastGenDepthTestSpanNEVER,
__fastGenDepthTestSpanLT,
__fastGenDepthTestSpanEQ,
__fastGenDepthTestSpanLE,
__fastGenDepthTestSpanGT,
__fastGenDepthTestSpanNE,
__fastGenDepthTestSpanGE,
__fastGenDepthTestSpanALWAYS
};
__GLspanFunc __fastDepth16Funcs[] =
{__fastGenDepthTestSpanNEVER,
__fastGenDepth16TestSpanLT,
__fastGenDepth16TestSpanEQ,
__fastGenDepth16TestSpanLE,
__fastGenDepth16TestSpanGT,
__fastGenDepth16TestSpanNE,
__fastGenDepth16TestSpanGE,
__fastGenDepth16TestSpanALWAYS
};
/*******************************************************/
DWORD ditherShade[32] = {
0x0800,
0x8800,
0x2800,
0xa800,
0x0800,
0x8800,
0x2800,
0xa800,
0xc800,
0x4800,
0xe800,
0x6800,
0xc800,
0x4800,
0xe800,
0x6800,
0x3800,
0xb800,
0x1800,
0x9800,
0x3800,
0xb800,
0x1800,
0x9800,
0xf800,
0x7800,
0xd800,
0x5800,
0xf800,
0x7800,
0xd800,
0x5800,
};
DWORD ditherTexture[32] = {
0x08,
0x88,
0x28,
0xa8,
0x08,
0x88,
0x28,
0xa8,
0xc8,
0x48,
0xe8,
0x68,
0xc8,
0x48,
0xe8,
0x68,
0x38,
0xb8,
0x18,
0x98,
0x38,
0xb8,
0x18,
0x98,
0xf8,
0x78,
0xd8,
0x58,
0xf8,
0x78,
0xd8,
0x58,
};
static ULONG Dither_4x4[4] = {0xa8288808, 0x68e848c8, 0x9818b838, 0x58d878f8};
/*******************************************************/
#define STRCAT4R(s1, s2, s3, s4) s1 ## s2 ## s3 ## s4
#define STRCAT4(s1, s2, s3, s4) STRCAT4R(s1, s2, s3, s4)
#define STRCAT3R(s1, s2, s3) s1 ## s2 ## s3
#define STRCAT3(s1, s2, s3) STRCAT3R(s1, s2, s3)
#define STRCAT2R(s1, s2) s1 ## s2
#define STRCAT2(s1, s2) STRCAT2R(s1, s2)
/*******************************************************/
//
// create the generic span routine
//
#define GENERIC 1
#define ZBUFFER 1
#define RGBMODE 1
#define SHADE 1
#define DITHER 1
#define TEXTURE 1
#define BPP bpp
#include "span.h"
#undef GENERIC
#define GENERIC 0
/*******************************************************/
//
// now create the special case span routines
//
//
// first modes that are dithered
//
#undef DITHER
#define DITHER 1
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 332
#undef BPP
#define BPP 8
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 0
#define GSHIFT 3
#define BSHIFT 6
#define RBITS 3
#define GBITS 3
#define BBITS 2
#include "spanset.h"
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 555
#undef BPP
#define BPP 16
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 10
#define GSHIFT 5
#define BSHIFT 0
#define RBITS 5
#define GBITS 5
#define BBITS 5
#include "spanset.h"
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 565
#undef BPP
#define BPP 16
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 11
#define GSHIFT 5
#define BSHIFT 0
#define RBITS 5
#define GBITS 6
#define BBITS 5
#include "spanset.h"
/*******************************************************/
//
// undithered modes
//
#undef DITHER
#define DITHER 0
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 24
#undef BPP
#define BPP 24
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 16
#define GSHIFT 8
#define BSHIFT 0
#define RBITS 8
#define GBITS 8
#define BBITS 8
#include "spanset.h"
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 32
#undef BPP
#define BPP 32
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 16
#define GSHIFT 8
#define BSHIFT 0
#define RBITS 8
#define GBITS 8
#define BBITS 8
#include "spanset.h"
/*******************************************************/
#ifndef _X86_
//
// Create span routines for perspective-corrected textures
//
#undef BPP
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 0
#define GSHIFT 3
#define BSHIFT 6
#define RBITS 3
#define GBITS 3
#define BBITS 2
#define BPP 8
#define FAST_REPLACE 1
#include "texspans.h"
#undef FAST_REPLACE
#define SKIP_FAST_REPLACE 1
#define REPLACE 1
#include "texspans.h"
#undef REPLACE
#undef SKIP_FAST_REPLACE
#define FAST_REPLACE 1
#define PALETTE_ONLY 1
#include "texspans.h"
#undef FAST_REPLACE
#undef PALETTE_ONLY
#define PALETTE_ENABLED 1
#define FLAT_SHADING 1
#include "texspans.h"
#undef FLAT_SHADING
#define SMOOTH_SHADING 1
#include "texspans.h"
#undef SMOOTH_SHADING
#undef PALETTE_ENABLED
#undef BPP
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 10
#define GSHIFT 5
#define BSHIFT 0
#define RBITS 5
#define GBITS 5
#define BBITS 5
#define BPP 16
#define SKIP_FAST_REPLACE 1
#define REPLACE 1
#include "texspans.h"
#undef REPLACE
#undef SKIP_FAST_REPLACE
#define SKIP_FAST_REPLACE 1 // only need routines for alpha modes, since
#define FAST_REPLACE 1 // replace is identical otherwise with 565
#define PALETTE_ONLY 1
#include "texspans.h"
#undef FAST_REPLACE
#undef PALETTE_ONLY
#undef SKIP_FAST_REPLACE
#define PALETTE_ENABLED 1
#define FLAT_SHADING 1
#include "texspans.h"
#undef FLAT_SHADING
#define SMOOTH_SHADING 1
#include "texspans.h"
#undef SMOOTH_SHADING
#undef PALETTE_ENABLED
#undef BPP
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 11
#define GSHIFT 5
#define BSHIFT 0
#define RBITS 5
#define GBITS 6
#define BBITS 5
#define BPP 16
#define FAST_REPLACE 1
#include "texspans.h"
#undef FAST_REPLACE
#define SKIP_FAST_REPLACE 1
#define REPLACE 1
#include "texspans.h"
#undef REPLACE
#undef SKIP_FAST_REPLACE
#define FAST_REPLACE 1
#define PALETTE_ONLY 1
#include "texspans.h"
#undef FAST_REPLACE
#undef PALETTE_ONLY
#define PALETTE_ENABLED 1
#define FLAT_SHADING 1
#include "texspans.h"
#undef FLAT_SHADING
#define SMOOTH_SHADING 1
#include "texspans.h"
#undef SMOOTH_SHADING
#undef PALETTE_ENABLED
#undef BPP
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
#undef RBITS
#undef GBITS
#undef BBITS
#define RSHIFT 16
#define GSHIFT 8
#define BSHIFT 0
#define RBITS 8
#define GBITS 8
#define BBITS 8
#define BPP 32
#define REPLACE 1
#include "texspans.h"
#undef REPLACE
#define REPLACE 1
#define PALETTE_ONLY 1
#include "texspans.h"
#undef REPLACE
#undef PALETTE_ONLY
#define PALETTE_ENABLED 1
#define FLAT_SHADING 1
#include "texspans.h"
#undef FLAT_SHADING
#define SMOOTH_SHADING 1
#include "texspans.h"
#undef SMOOTH_SHADING
#undef PALETTE_ENABLED
#endif // _X86_
/*******************************************************/
//
// finally color index and flat spans
//
#undef TEXTURE
#undef SHADE
#undef RSHIFT
#undef GSHIFT
#undef BSHIFT
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 8
#undef BPP
#define BPP 8
#include "spanci.h"
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 16
#undef BPP
#define BPP 16
#include "spanci.h"
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 24
#undef BPP
#define BPP 24
#include "spanci.h"
/*******************************************************/
#undef COLORFORMAT
#define COLORFORMAT 32
#undef BPP
#define BPP 32
#include "spanci.h"
/*******************************************************/
__genSpanFunc __fastGenRGBFlatFuncs[] =
{
__fastGenRGB24FlatSpan,
__fastGenRGB32FlatSpan,
__fastGenRGB8FlatSpan,
__fastGenRGB16FlatSpan,
__fastGenRGB16FlatSpan,
__fastGenRGB24FlatSpan,
__fastGenRGB32FlatSpan,
__fastGenRGB8DithFlatSpan,
__fastGenRGB16DithFlatSpan,
__fastGenRGB16DithFlatSpan,
__fastGenMaskRGB24FlatSpan,
__fastGenMaskRGB32FlatSpan,
__fastGenMaskRGB8FlatSpan,
__fastGenMaskRGB16FlatSpan,
__fastGenMaskRGB16FlatSpan,
__fastGenMaskRGB24FlatSpan,
__fastGenMaskRGB32FlatSpan,
__fastGenMaskRGB8DithFlatSpan,
__fastGenMaskRGB16DithFlatSpan,
__fastGenMaskRGB16DithFlatSpan,
};
__genSpanFunc __fastGenCIFlatFuncs[] =
{
__fastGenCI24FlatSpan,
__fastGenCI32FlatSpan,
__fastGenCI8FlatSpan,
__fastGenCI16FlatSpan,
__fastGenCI16FlatSpan,
__fastGenCI24DithFlatSpan,
__fastGenCI32DithFlatSpan,
__fastGenCI8DithFlatSpan,
__fastGenCI16DithFlatSpan,
__fastGenCI16DithFlatSpan,
__fastGenMaskCI24FlatSpan,
__fastGenMaskCI32FlatSpan,
__fastGenMaskCI8FlatSpan,
__fastGenMaskCI16FlatSpan,
__fastGenMaskCI16FlatSpan,
__fastGenMaskCI24DithFlatSpan,
__fastGenMaskCI32DithFlatSpan,
__fastGenMaskCI8DithFlatSpan,
__fastGenMaskCI16DithFlatSpan,
__fastGenMaskCI16DithFlatSpan,
};
__genSpanFunc __fastGenCIFuncs[] =
{
__fastGenCI24Span,
__fastGenCI32Span,
__fastGenCI8Span,
__fastGenCI16Span,
__fastGenCI16Span,
__fastGenCI24DithSpan,
__fastGenCI32DithSpan,
__fastGenCI8DithSpan,
__fastGenCI16DithSpan,
__fastGenCI16DithSpan,
__fastGenMaskCI24Span,
__fastGenMaskCI32Span,
__fastGenMaskCI8Span,
__fastGenMaskCI16Span,
__fastGenMaskCI16Span,
__fastGenMaskCI24DithSpan,
__fastGenMaskCI32DithSpan,
__fastGenMaskCI8DithSpan,
__fastGenMaskCI16DithSpan,
__fastGenMaskCI16DithSpan,
};
__genSpanFunc __fastGenRGBFuncs[] =
{
__fastGenRGB24Span,
__fastGenRGB32Span,
__fastGenSpan,
__fastGenSpan,
__fastGenSpan,
__fastGenRGB24Span,
__fastGenRGB32Span,
__fastGenRGB332DithSpan,
__fastGenRGB555DithSpan,
__fastGenRGB565DithSpan,
__fastGenMaskRGB24Span,
__fastGenMaskRGB32Span,
__fastGenSpan,
__fastGenSpan,
__fastGenSpan,
__fastGenMaskRGB24Span,
__fastGenMaskRGB32Span,
__fastGenMaskRGB332DithSpan,
__fastGenMaskRGB555DithSpan,
__fastGenMaskRGB565DithSpan,
};
__genSpanFunc __fastGenTexDecalFuncs[] =
{
__fastGenTexDecal24Span,
__fastGenTexDecal32Span,
__fastGenSpan,
__fastGenSpan,
__fastGenSpan,
__fastGenTexDecal24Span,
__fastGenTexDecal32Span,
__fastGenTexDecal332DithSpan,
__fastGenTexDecal555DithSpan,
__fastGenTexDecal565DithSpan,
__fastGenMaskTexDecal24Span,
__fastGenMaskTexDecal32Span,
__fastGenSpan,
__fastGenSpan,
__fastGenSpan,
__fastGenMaskTexDecal24Span,
__fastGenMaskTexDecal32Span,
__fastGenMaskTexDecal332DithSpan,
__fastGenMaskTexDecal555DithSpan,
__fastGenMaskTexDecal565DithSpan,
};
__genSpanFunc __fastGenTexFuncs[] =
{
__fastGenTex24Span,
__fastGenTex32Span,
__fastGenSpan,
__fastGenSpan,
__fastGenSpan,
__fastGenTex24Span,
__fastGenTex32Span,
__fastGenTex332DithSpan,
__fastGenTex555DithSpan,
__fastGenTex565DithSpan,
__fastGenMaskTex24Span,
__fastGenMaskTex32Span,
__fastGenSpan,
__fastGenSpan,
__fastGenSpan,
__fastGenMaskTex24Span,
__fastGenMaskTex32Span,
__fastGenMaskTex332DithSpan,
__fastGenMaskTex555DithSpan,
__fastGenMaskTex565DithSpan,
};
void FASTCALL __fastFastPerspReplace332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspReplaceZle332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspReplaceZlt332(__GLGENcontext *gc);
// Note the the compressed 555 and 565 formats are equivalent, so
// we'll just use the 565 version:
void FASTCALL __fastFastPerspReplace565(__GLGENcontext *gc);
void FASTCALL __fastFastPerspReplaceZle565(__GLGENcontext *gc);
void FASTCALL __fastFastPerspReplaceZlt565(__GLGENcontext *gc);
//----------------------------------------------------------------------
void FASTCALL __fastPerspReplace332(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlpha332(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspReplace555(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlpha555(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspReplace565(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlpha565(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspReplace888(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceZlt888(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlpha888(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspReplaceAlphaZlt888(__GLGENcontext *gc);
//----------------------------------------------------------------------
void FASTCALL __fastFastPerspPalReplace332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceZle332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceZlt332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlpha332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlphaZle332(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlphaZlt332(__GLGENcontext *gc);
// Note the the compressed 555 and 565 formats are equivalent, so
// we'll just use the 565 version:
void FASTCALL __fastFastPerspPalReplace565(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceZle565(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceZlt565(__GLGENcontext *gc);
// With alpha, we have to provode pixel-format-specific code for 555 and
// 565, since there is a potential read-modify-write for which we will
// have to deal with the pixel format...
void FASTCALL __fastFastPerspPalReplaceAlpha555(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlphaZle555(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlphaZlt555(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlpha565(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlphaZle565(__GLGENcontext *gc);
void FASTCALL __fastFastPerspPalReplaceAlphaZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplace332(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlpha332(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplace555(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlpha555(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplace565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlpha565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplace888(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceZlt888(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlpha888(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspPalReplaceAlphaZlt888(__GLGENcontext *gc);
//----------------------------------------------------------------------
void FASTCALL __fastPerspFlat332(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlpha332(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspFlat555(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlpha555(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspFlat565(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlpha565(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspFlat888(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatZlt888(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlpha888(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspFlatAlphaZlt888(__GLGENcontext *gc);
//----------------------------------------------------------------------
void FASTCALL __fastPerspSmooth332(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlpha332(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZle332(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZlt332(__GLGENcontext *gc);
void FASTCALL __fastPerspSmooth555(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlpha555(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZle555(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZlt555(__GLGENcontext *gc);
void FASTCALL __fastPerspSmooth565(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlpha565(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZle565(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZlt565(__GLGENcontext *gc);
void FASTCALL __fastPerspSmooth888(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothZlt888(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlpha888(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZle888(__GLGENcontext *gc);
void FASTCALL __fastPerspSmoothAlphaZlt888(__GLGENcontext *gc);
__genSpanFunc __fastPerspTexReplaceFuncs[] = {
__fastFastPerspReplace332,
__fastFastPerspReplaceZle332,
__fastFastPerspReplaceZlt332,
__fastPerspReplaceAlpha332,
__fastPerspReplaceAlphaZle332,
__fastPerspReplaceAlphaZlt332,
__fastFastPerspReplace565,
__fastFastPerspReplaceZle565,
__fastFastPerspReplaceZlt565,
__fastPerspReplaceAlpha555,
__fastPerspReplaceAlphaZle555,
__fastPerspReplaceAlphaZlt555,
__fastFastPerspReplace565,
__fastFastPerspReplaceZle565,
__fastFastPerspReplaceZlt565,
__fastPerspReplaceAlpha565,
__fastPerspReplaceAlphaZle565,
__fastPerspReplaceAlphaZlt565,
__fastPerspReplace888,
__fastPerspReplaceZle888,
__fastPerspReplaceZlt888,
__fastPerspReplaceAlpha888,
__fastPerspReplaceAlphaZle888,
__fastPerspReplaceAlphaZlt888,
};
__genSpanFunc __fastPerspTexPalReplaceFuncs[] = {
__fastFastPerspPalReplace332,
__fastFastPerspPalReplaceZle332,
__fastFastPerspPalReplaceZlt332,
__fastFastPerspPalReplaceAlpha332,
__fastFastPerspPalReplaceAlphaZle332,
__fastFastPerspPalReplaceAlphaZlt332,
__fastFastPerspPalReplace565,
__fastFastPerspPalReplaceZle565,
__fastFastPerspPalReplaceZlt565,
__fastFastPerspPalReplaceAlpha555,
__fastFastPerspPalReplaceAlphaZle555,
__fastFastPerspPalReplaceAlphaZlt555,
__fastFastPerspPalReplace565,
__fastFastPerspPalReplaceZle565,
__fastFastPerspPalReplaceZlt565,
__fastFastPerspPalReplaceAlpha565,
__fastFastPerspPalReplaceAlphaZle565,
__fastFastPerspPalReplaceAlphaZlt565,
__fastPerspPalReplace888,
__fastPerspPalReplaceZle888,
__fastPerspPalReplaceZlt888,
__fastPerspPalReplaceAlpha888,
__fastPerspPalReplaceAlphaZle888,
__fastPerspPalReplaceAlphaZlt888,
};
__genSpanFunc __fastPerspTexFlatFuncs[] = {
__fastPerspFlat332,
__fastPerspFlatZle332,
__fastPerspFlatZlt332,
__fastPerspFlatAlpha332,
__fastPerspFlatAlphaZle332,
__fastPerspFlatAlphaZlt332,
__fastPerspFlat555,
__fastPerspFlatZle555,
__fastPerspFlatZlt555,
__fastPerspFlatAlpha555,
__fastPerspFlatAlphaZle555,
__fastPerspFlatAlphaZlt555,
__fastPerspFlat565,
__fastPerspFlatZle565,
__fastPerspFlatZlt565,
__fastPerspFlatAlpha565,
__fastPerspFlatAlphaZle565,
__fastPerspFlatAlphaZlt565,
__fastPerspFlat888,
__fastPerspFlatZle888,
__fastPerspFlatZlt888,
__fastPerspFlatAlpha888,
__fastPerspFlatAlphaZle888,
__fastPerspFlatAlphaZlt888,
};
__genSpanFunc __fastPerspTexSmoothFuncs[] = {
__fastPerspSmooth332,
__fastPerspSmoothZle332,
__fastPerspSmoothZlt332,
__fastPerspSmoothAlpha332,
__fastPerspSmoothAlphaZle332,
__fastPerspSmoothAlphaZlt332,
__fastPerspSmooth555,
__fastPerspSmoothZle555,
__fastPerspSmoothZlt555,
__fastPerspSmoothAlpha555,
__fastPerspSmoothAlphaZle555,
__fastPerspSmoothAlphaZlt555,
__fastPerspSmooth565,
__fastPerspSmoothZle565,
__fastPerspSmoothZlt565,
__fastPerspSmoothAlpha565,
__fastPerspSmoothAlphaZle565,
__fastPerspSmoothAlphaZlt565,
__fastPerspSmooth888,
__fastPerspSmoothZle888,
__fastPerspSmoothZlt888,
__fastPerspSmoothAlpha888,
__fastPerspSmoothAlphaZle888,
__fastPerspSmoothAlphaZlt888,
};
/*******************************************************/
GLboolean FASTCALL __fastGenStippleLt32Span(__GLcontext *gc)
{
register GLuint zAccum = gc->polygon.shader.frag.z;
register GLint zDelta = gc->polygon.shader.dzdx;
register GLuint *zbuf = gc->polygon.shader.zbuf;
register GLuint *pStipple = gc->polygon.shader.stipplePat;
register GLint cTotalPix = gc->polygon.shader.length;
register GLuint mask;
register GLint cPix;
register GLint zPasses = 0;
register GLuint maskBit;
__GLstippleWord stipple;
GLint count;
GLint shift;
if (gc->constants.yInverted) {
stipple = gc->polygon.stipple[(gc->constants.height -
(gc->polygon.shader.frag.y - gc->constants.viewportYAdjust)-1)
& (__GL_STIPPLE_BITS-1)];
} else {
stipple = gc->polygon.stipple[gc->polygon.shader.frag.y &
(__GL_STIPPLE_BITS-1)];
}
shift = gc->polygon.shader.frag.x & (__GL_STIPPLE_BITS - 1);
#ifdef __GL_STIPPLE_MSB
stipple = (stipple << shift) | (stipple >> (__GL_STIPPLE_BITS - shift));
#else
stipple = (stipple >> shift) | (stipple << (__GL_STIPPLE_BITS - shift));
#endif
if (stipple == 0) {
/* No point in continuing */
return GL_FALSE;
}
for (;cTotalPix > 0; cTotalPix-=32) {
mask = stipple;
maskBit = 0x80000000;
cPix = cTotalPix;
if (cPix > 32)
cPix = 32;
for (;cPix > 0; cPix --)
{
if (mask & maskBit)
{
if ((zAccum) < (*zbuf))
{
*zbuf = zAccum;
zPasses++;
}
else
{
mask &= ~maskBit;
}
}
zbuf++;
zAccum += zDelta;
maskBit >>= 1;
}
*pStipple++ = mask;
}
if (zPasses == 0) {
return GL_FALSE;
} else {
return GL_TRUE;
}
}
GLboolean FASTCALL __fastGenStippleLt16Span(__GLcontext *gc)
{
register GLuint zAccum = gc->polygon.shader.frag.z;
register __GLz16Value z16Accum = (__GLz16Value) (zAccum >> Z16_SHIFT);
register GLint zDelta = gc->polygon.shader.dzdx;
register __GLz16Value *zbuf = (__GLz16Value *) (gc->polygon.shader.zbuf);
register GLuint *pStipple = gc->polygon.shader.stipplePat;
register GLint cTotalPix = gc->polygon.shader.length;
register GLuint mask;
register GLint cPix;
register GLint zPasses = 0;
register GLuint maskBit;
__GLstippleWord stipple;
GLint count;
GLint shift;
if (gc->constants.yInverted) {
stipple = gc->polygon.stipple[(gc->constants.height -
(gc->polygon.shader.frag.y - gc->constants.viewportYAdjust)-1)
& (__GL_STIPPLE_BITS-1)];
} else {
stipple = gc->polygon.stipple[gc->polygon.shader.frag.y &
(__GL_STIPPLE_BITS-1)];
}
shift = gc->polygon.shader.frag.x & (__GL_STIPPLE_BITS - 1);
#ifdef __GL_STIPPLE_MSB
stipple = (stipple << shift) | (stipple >> (__GL_STIPPLE_BITS - shift));
#else
stipple = (stipple >> shift) | (stipple << (__GL_STIPPLE_BITS - shift));
#endif
if (stipple == 0) {
/* No point in continuing */
return GL_FALSE;
}
for (;cTotalPix > 0; cTotalPix-=32) {
mask = stipple;
maskBit = 0x80000000;
cPix = cTotalPix;
if (cPix > 32)
cPix = 32;
for (;cPix > 0; cPix --)
{
if (mask & maskBit)
{
if (((__GLz16Value)(zAccum >> Z16_SHIFT)) < (*zbuf))
{
*zbuf = ((__GLz16Value)(zAccum >> Z16_SHIFT));
zPasses++;
}
else
{
mask &= ~maskBit;
}
}
zbuf++;
zAccum += zDelta;
maskBit >>= 1;
}
*pStipple++ = mask;
}
if (zPasses == 0) {
return GL_FALSE;
} else {
return GL_TRUE;
}
}
GLboolean FASTCALL __fastGenStippleAnyDepthTestSpan(__GLcontext *gc)
{
// If the shader is done after this routine then
// the stipple pattern is all zeroes so we can
// skip the span
__glStippleSpan(gc);
if (gc->polygon.shader.done)
{
return GL_FALSE;
}
// If this returns true then all bits are off so
// we can skip the span
return !__glDepthTestStippledSpan(gc);
}