1327 lines
34 KiB
C
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);
|
|
}
|