/******************************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); }