mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-01-25 07:04:06 +08:00
Reorganized combiners. Added optimized span functions.
This commit is contained in:
parent
bcb3957b6c
commit
d9f1e453ea
39
src/mesa/drivers/glide/fx.rc
Normal file
39
src/mesa/drivers/glide/fx.rc
Normal file
@ -0,0 +1,39 @@
|
||||
#include <windows.h>
|
||||
|
||||
#define PRODNAME "Mesa 5.1"
|
||||
#define CONTACTSTR "http://www.mesa3d.org"
|
||||
#define HWSTR "3dfx Voodoo Banshee, Velocity 100/200, Voodoo3, Voodoo4, Voodoo5"
|
||||
#define COPYRIGHTSTR "Copyright \251 Brian E. Paul"
|
||||
|
||||
#define VERSIONSTR "5.1.0.1"
|
||||
#define MANVERSION 5
|
||||
#define MANREVISION 1
|
||||
#define BUILD_NUMBER 1
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER
|
||||
PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER
|
||||
FILEFLAGSMASK 0x0030003FL
|
||||
|
||||
FILEOS VOS_DOS_WINDOWS32
|
||||
FILETYPE VFT_DRV
|
||||
FILESUBTYPE VFT2_DRV_INSTALLABLE
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "FileDescription", PRODNAME
|
||||
VALUE "FileVersion", VERSIONSTR
|
||||
VALUE "LegalCopyright", COPYRIGHTSTR
|
||||
VALUE "ProductName", PRODNAME
|
||||
VALUE "Graphics Subsystem", HWSTR
|
||||
VALUE "Contact", CONTACTSTR
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
/* the following line should be extended for localized versions */
|
||||
VALUE "Translation", 0x409, 1252
|
||||
END
|
||||
END
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxapi.c,v 1.38 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxapi.c,v 1.39 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -520,17 +520,20 @@ fxMesaCreateContext(GLuint win,
|
||||
|
||||
fxInitPixelTables(fxMesa, useBGR);
|
||||
|
||||
fxMesa->width = FX_grSstScreenWidth();
|
||||
fxMesa->height = FX_grSstScreenHeight();
|
||||
/* screen */
|
||||
fxMesa->screen_width = FX_grSstScreenWidth();
|
||||
fxMesa->screen_height = FX_grSstScreenHeight();
|
||||
|
||||
/* window inside screen */
|
||||
fxMesa->width = fxMesa->screen_width;
|
||||
fxMesa->height = fxMesa->screen_height;
|
||||
|
||||
/* scissor inside window */
|
||||
fxMesa->clipMinX = 0;
|
||||
fxMesa->clipMaxX = fxMesa->width;
|
||||
fxMesa->clipMinY = 0;
|
||||
fxMesa->clipMaxY = fxMesa->height;
|
||||
|
||||
fxMesa->screen_width = fxMesa->width;
|
||||
fxMesa->screen_height = fxMesa->height;
|
||||
|
||||
if (verbose) {
|
||||
char buf[80];
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
* fxDDReadPixels888 does not convert 8A8R8G8B into 5R5G5B
|
||||
*/
|
||||
|
||||
/* $Id: fxdd.c,v 1.100 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxdd.c,v 1.101 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -130,6 +130,21 @@ fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Disable color by masking out R, G, B, A
|
||||
*/
|
||||
static void fxDisableColor (fxMesaContext fxMesa)
|
||||
{
|
||||
if (fxMesa->colDepth != 16) {
|
||||
/* 32bpp mode or 15bpp mode */
|
||||
fxMesa->Glide.grColorMaskExt(FXFALSE, FXFALSE, FXFALSE, FXFALSE);
|
||||
} else {
|
||||
/* 16 bpp mode */
|
||||
grColorMask(FXFALSE, FXFALSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/***** Miscellaneous functions *****/
|
||||
/**********************************************************************/
|
||||
@ -190,25 +205,31 @@ static void fxDDClear( GLcontext *ctx,
|
||||
__FUNCTION__, (int) x, (int) y, (int) width, (int) height );
|
||||
}
|
||||
|
||||
/*jejeje*/
|
||||
/* Need this check to respond to glScissor and clipping updates */
|
||||
/* should also take care of FX_NEW_COLOR_MASK, FX_NEW_STENCIL, depth? */
|
||||
if (fxMesa->new_state & FX_NEW_SCISSOR) {
|
||||
extern void fxSetupScissor(GLcontext * ctx);
|
||||
fxSetupScissor(ctx);
|
||||
fxMesa->new_state &= ~FX_NEW_SCISSOR;
|
||||
}
|
||||
|
||||
/* we can't clear accum buffers */
|
||||
mask &= ~(DD_ACCUM_BIT);
|
||||
|
||||
/*
|
||||
* As per GL spec, stencil masking should be obeyed when clearing
|
||||
*/
|
||||
if (mask & DD_STENCIL_BIT) {
|
||||
if (!fxMesa->haveHwStencil || fxMesa->unitsState.stencilWriteMask != 0xff) {
|
||||
/* Napalm seems to have trouble with stencil write masks != 0xff */
|
||||
/* do stencil clear in software */
|
||||
mask &= ~(DD_STENCIL_BIT);
|
||||
softwareMask |= DD_STENCIL_BIT;
|
||||
mask &= ~(DD_STENCIL_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* As per GL spec, color masking should be obeyed when clearing
|
||||
*/
|
||||
if (ctx->Visual.greenBits != 8 && ctx->Visual.greenBits != 5) {
|
||||
/* can only do color masking if running in 24/32bpp on Napalm */
|
||||
if (ctx->Color.ColorMask[RCOMP] != ctx->Color.ColorMask[GCOMP] ||
|
||||
@ -252,7 +273,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
switch (mask & ~DD_STENCIL_BIT) {
|
||||
case DD_BACK_LEFT_BIT | DD_DEPTH_BIT:
|
||||
/* back buffer & depth */
|
||||
fxColorMask(fxMesa, GL_TRUE); /* work around Voodoo3 bug */
|
||||
/* FX_grColorMaskv_NoLock(ctx, true4); */ /* work around Voodoo3 bug */
|
||||
grDepthMask(FXTRUE);
|
||||
grRenderBuffer(GR_BUFFER_BACKBUFFER);
|
||||
if (stencil_size > 0) {
|
||||
@ -264,7 +285,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
if (!ctx->Depth.Mask || !ctx->Depth.Test) {
|
||||
if (!fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXFALSE);
|
||||
}
|
||||
break;
|
||||
@ -276,7 +297,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
/* clear depth */
|
||||
grDepthMask(FXTRUE);
|
||||
grRenderBuffer(GR_BUFFER_BACKBUFFER);
|
||||
fxColorMask(fxMesa, GL_FALSE);
|
||||
fxDisableColor(fxMesa);
|
||||
if (stencil_size > 0)
|
||||
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
@ -286,7 +307,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
/* clear front */
|
||||
fxColorMask(fxMesa, GL_TRUE);
|
||||
fxSetupColorMask(ctx);
|
||||
grRenderBuffer(GR_BUFFER_FRONTBUFFER);
|
||||
if (stencil_size > 0)
|
||||
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
|
||||
@ -296,7 +317,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
if (!ctx->Depth.Mask || !ctx->Depth.Test) {
|
||||
if (!fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXFALSE);
|
||||
}
|
||||
break;
|
||||
@ -312,7 +333,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
if (ctx->Depth.Mask && ctx->Depth.Test) {
|
||||
if (fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXTRUE);
|
||||
}
|
||||
break;
|
||||
@ -328,7 +349,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
if (ctx->Depth.Mask && ctx->Depth.Test) {
|
||||
if (fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXTRUE);
|
||||
}
|
||||
break;
|
||||
@ -353,7 +374,7 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
if (ctx->Depth.Mask && ctx->Depth.Test) {
|
||||
if (fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXTRUE);
|
||||
}
|
||||
break;
|
||||
@ -380,14 +401,14 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
if (!ctx->Depth.Mask || !ctx->Depth.Mask) {
|
||||
if (!fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXFALSE);
|
||||
}
|
||||
break;
|
||||
case DD_DEPTH_BIT:
|
||||
/* just the depth buffer */
|
||||
grRenderBuffer(GR_BUFFER_BACKBUFFER);
|
||||
fxColorMask(fxMesa, GL_FALSE);
|
||||
fxDisableColor(fxMesa);
|
||||
grDepthMask(FXTRUE);
|
||||
if (stencil_size > 0)
|
||||
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
|
||||
@ -397,11 +418,13 @@ static void fxDDClear( GLcontext *ctx,
|
||||
grBufferClear(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD);
|
||||
fxColorMask(fxMesa, GL_TRUE);
|
||||
if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT)
|
||||
fxSetupColorMask(ctx);
|
||||
if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT) {
|
||||
grRenderBuffer(GR_BUFFER_FRONTBUFFER);
|
||||
if (!ctx->Depth.Test || !ctx->Depth.Mask)
|
||||
}
|
||||
if (!fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXFALSE);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* clear no color buffers or depth buffer but might clear stencil */
|
||||
@ -409,16 +432,17 @@ static void fxDDClear( GLcontext *ctx,
|
||||
/* XXX need this RenderBuffer call to work around Glide bug */
|
||||
grRenderBuffer(GR_BUFFER_BACKBUFFER);
|
||||
grDepthMask(FXFALSE);
|
||||
fxColorMask(fxMesa, GL_FALSE);
|
||||
fxDisableColor(fxMesa);
|
||||
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
|
||||
fxMesa->clearA,
|
||||
clearD, clearS);
|
||||
if (ctx->Depth.Mask && ctx->Depth.Test) {
|
||||
if (fxMesa->unitsState.depthTestEnabled) {
|
||||
grDepthMask(FXTRUE);
|
||||
}
|
||||
fxColorMask(fxMesa, GL_TRUE);
|
||||
if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT)
|
||||
fxSetupColorMask(ctx);
|
||||
if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT) {
|
||||
grRenderBuffer(GR_BUFFER_FRONTBUFFER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -456,7 +480,7 @@ fxDDSetDrawBuffer(GLcontext * ctx, GLenum mode)
|
||||
grRenderBuffer(fxMesa->currentFB);
|
||||
}
|
||||
else if (mode == GL_NONE) {
|
||||
fxColorMask(fxMesa, GL_FALSE);
|
||||
fxDisableColor(fxMesa);
|
||||
}
|
||||
else {
|
||||
/* we'll need a software fallback */
|
||||
@ -1015,16 +1039,17 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa)
|
||||
|
||||
fxMesa->unitsState.stencilWriteMask = 0xff;
|
||||
|
||||
fxColorMask(fxMesa, GL_TRUE);
|
||||
if (fxMesa->haveDoubleBuffer) {
|
||||
fxMesa->currentFB = GR_BUFFER_BACKBUFFER;
|
||||
grRenderBuffer(GR_BUFFER_BACKBUFFER);
|
||||
}
|
||||
else {
|
||||
fxMesa->currentFB = GR_BUFFER_FRONTBUFFER;
|
||||
grRenderBuffer(GR_BUFFER_FRONTBUFFER);
|
||||
if (fxMesa->colDepth != 16) {
|
||||
/* 32bpp mode or 15bpp mode */
|
||||
fxMesa->Glide.grColorMaskExt(FXTRUE, FXTRUE, FXTRUE, fxMesa->haveHwAlpha);
|
||||
} else {
|
||||
/* 16 bpp mode */
|
||||
grColorMask(FXTRUE, fxMesa->haveHwAlpha);
|
||||
}
|
||||
|
||||
fxMesa->currentFB = fxMesa->haveDoubleBuffer ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER;
|
||||
grRenderBuffer(fxMesa->currentFB);
|
||||
|
||||
fxMesa->state = MALLOC(FX_grGetInteger(GR_GLIDE_STATE_SIZE));
|
||||
fxMesa->fogTable = (GrFog_t *) MALLOC(FX_grGetInteger(GR_FOG_TABLE_ENTRIES) *
|
||||
sizeof(GrFog_t));
|
||||
@ -1212,6 +1237,7 @@ fx_check_IsInHardware(GLcontext * ctx)
|
||||
return FX_FALLBACK_TEXTURE_1D_3D;
|
||||
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled & TEXTURE_2D_BIT) {
|
||||
#if 0
|
||||
if (ctx->Texture.Unit[0].EnvMode == GL_BLEND &&
|
||||
(ctx->Texture.Unit[1]._ReallyEnabled & TEXTURE_2D_BIT ||
|
||||
ctx->Texture.Unit[0].EnvColor[0] != 0 ||
|
||||
@ -1220,13 +1246,16 @@ fx_check_IsInHardware(GLcontext * ctx)
|
||||
ctx->Texture.Unit[0].EnvColor[3] != 1)) {
|
||||
return FX_FALLBACK_TEXTURE_ENV;
|
||||
}
|
||||
#endif
|
||||
if (ctx->Texture.Unit[0]._Current->Image[0]->Border > 0)
|
||||
return FX_FALLBACK_TEXTURE_BORDER;
|
||||
}
|
||||
|
||||
if (ctx->Texture.Unit[1]._ReallyEnabled & TEXTURE_2D_BIT) {
|
||||
#if 0
|
||||
if (ctx->Texture.Unit[1].EnvMode == GL_BLEND)
|
||||
return FX_FALLBACK_TEXTURE_ENV;
|
||||
#endif
|
||||
if (ctx->Texture.Unit[1]._Current->Image[0]->Border > 0)
|
||||
return FX_FALLBACK_TEXTURE_BORDER;
|
||||
}
|
||||
@ -1264,10 +1293,12 @@ fx_check_IsInHardware(GLcontext * ctx)
|
||||
return FX_FALLBACK_TEXTURE_MULTI;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ((ctx->Texture.Unit[0]._ReallyEnabled & TEXTURE_2D_BIT) &&
|
||||
(ctx->Texture.Unit[0].EnvMode == GL_BLEND)) {
|
||||
return FX_FALLBACK_TEXTURE_ENV;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1,11 +1,4 @@
|
||||
/* Hack alert:
|
||||
* The performance hit is disastruous for SPAN functions.
|
||||
* Should we use SpanRenderStart / SpanRenderFinish in `swrast.h'
|
||||
* for locking / unlocking the LFB?
|
||||
* Optimize and check endianess for `read_R8G8B8_pixels'
|
||||
*/
|
||||
|
||||
/* $Id: fxddspan.c,v 1.25 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxddspan.c,v 1.26 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -54,16 +47,6 @@
|
||||
#include "fxglidew.h"
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _WIN32
|
||||
#pragma warning( disable : 4090 4022 )
|
||||
/* 4101 : "different 'const' qualifier"
|
||||
* 4022 : "pointer mistmatch for actual parameter 'n'
|
||||
*/
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#define writeRegionClipped(fxm,dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data) \
|
||||
FX_grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data)
|
||||
@ -91,435 +74,316 @@
|
||||
/************************************************************************/
|
||||
/***** Span functions *****/
|
||||
/************************************************************************/
|
||||
#define TDFXPACKCOLOR1555( r, g, b, a ) \
|
||||
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
|
||||
((a) ? 0x8000 : 0))
|
||||
#define TDFXPACKCOLOR565( r, g, b ) \
|
||||
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
|
||||
#define TDFXPACKCOLOR8888( r, g, b, a ) \
|
||||
(((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
|
||||
/************************************************************************/
|
||||
|
||||
|
||||
static void
|
||||
fxDDWriteRGBASpan(const GLcontext * ctx,
|
||||
GLuint n, GLint x, GLint y,
|
||||
const GLubyte rgba[][4], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLuint i;
|
||||
GLint bottom = fxMesa->height - 1;
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(...)\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
if (mask) {
|
||||
int span = 0;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
if (mask[i]) {
|
||||
++span;
|
||||
}
|
||||
else {
|
||||
if (span > 0) {
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + i - span,
|
||||
bottom - y,
|
||||
/* GR_LFB_SRC_FMT_8888, */ span, /*1, */ 0,
|
||||
(void *) rgba[i - span]);
|
||||
span = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (span > 0)
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + n - span, bottom - y,
|
||||
/* GR_LFB_SRC_FMT_8888, */ span, /*1, */ 0,
|
||||
(void *) rgba[n - span]);
|
||||
}
|
||||
else
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x, bottom - y, /* GR_LFB_SRC_FMT_8888, */
|
||||
n, /* 1, */ 0, (void *) rgba);
|
||||
}
|
||||
#define DBG 0
|
||||
|
||||
|
||||
static void
|
||||
fxDDWriteRGBSpan(const GLcontext * ctx,
|
||||
GLuint n, GLint x, GLint y,
|
||||
const GLubyte rgb[][3], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLuint i;
|
||||
GLint bottom = fxMesa->height - 1;
|
||||
GLubyte rgba[MAX_WIDTH][4];
|
||||
#define LOCAL_VARS \
|
||||
GLuint pitch = info.strideInBytes; \
|
||||
GLuint height = fxMesa->height; \
|
||||
char *buf = (char *)((char *)info.lfbPtr + 0 /* x, y offset */); \
|
||||
GLuint p; \
|
||||
(void) buf; (void) p;
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(...)\n", __FUNCTION__);
|
||||
}
|
||||
#define CLIPPIXEL( _x, _y ) ( _x >= minx && _x < maxx && \
|
||||
_y >= miny && _y < maxy )
|
||||
|
||||
if (mask) {
|
||||
int span = 0;
|
||||
#define CLIPSPAN( _x, _y, _n, _x1, _n1, _i ) \
|
||||
if ( _y < miny || _y >= maxy ) { \
|
||||
_n1 = 0, _x1 = x; \
|
||||
} else { \
|
||||
_n1 = _n; \
|
||||
_x1 = _x; \
|
||||
if ( _x1 < minx ) _i += (minx-_x1), n1 -= (minx-_x1), _x1 = minx;\
|
||||
if ( _x1 + _n1 >= maxx ) n1 -= (_x1 + n1 - maxx); \
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
if (mask[i]) {
|
||||
rgba[span][RCOMP] = rgb[i][0];
|
||||
rgba[span][GCOMP] = rgb[i][1];
|
||||
rgba[span][BCOMP] = rgb[i][2];
|
||||
rgba[span][ACOMP] = 255;
|
||||
++span;
|
||||
}
|
||||
else {
|
||||
if (span > 0) {
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + i - span,
|
||||
bottom - y,
|
||||
/*GR_LFB_SRC_FMT_8888, */ span, /* 1, */ 0,
|
||||
(void *) rgba);
|
||||
span = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#define Y_FLIP(_y) (height - _y - 1)
|
||||
|
||||
if (span > 0)
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + n - span, bottom - y,
|
||||
/*GR_LFB_SRC_FMT_8888, */ span, /* 1, */ 0,
|
||||
(void *) rgba);
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][RCOMP] = rgb[i][0];
|
||||
rgba[i][GCOMP] = rgb[i][1];
|
||||
rgba[i][BCOMP] = rgb[i][2];
|
||||
rgba[i][ACOMP] = 255;
|
||||
}
|
||||
#define HW_WRITE_LOCK() \
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx); \
|
||||
GrLfbInfo_t info; \
|
||||
info.size = sizeof(GrLfbInfo_t); \
|
||||
if ( grLfbLock( GR_LFB_WRITE_ONLY, \
|
||||
fxMesa->currentFB, LFB_MODE, \
|
||||
GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) {
|
||||
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x, bottom - y, /* GR_LFB_SRC_FMT_8888, */
|
||||
n, /* 1, */ 0, (void *) rgba);
|
||||
}
|
||||
}
|
||||
#define HW_WRITE_UNLOCK() \
|
||||
grLfbUnlock( GR_LFB_WRITE_ONLY, fxMesa->currentFB ); \
|
||||
}
|
||||
|
||||
#define HW_READ_LOCK() \
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx); \
|
||||
GrLfbInfo_t info; \
|
||||
info.size = sizeof(GrLfbInfo_t); \
|
||||
if ( grLfbLock( GR_LFB_READ_ONLY, fxMesa->currentFB, \
|
||||
LFB_MODE, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) {
|
||||
|
||||
#define HW_READ_UNLOCK() \
|
||||
grLfbUnlock( GR_LFB_READ_ONLY, fxMesa->currentFB ); \
|
||||
}
|
||||
|
||||
#define HW_WRITE_CLIPLOOP() \
|
||||
do { \
|
||||
int _nc = 1; /* numcliprects */ \
|
||||
while (_nc--) { \
|
||||
const int minx = fxMesa->clipMinX; \
|
||||
const int miny = fxMesa->clipMinY; \
|
||||
const int maxx = fxMesa->clipMaxX; \
|
||||
const int maxy = fxMesa->clipMaxY;
|
||||
|
||||
#define HW_READ_CLIPLOOP() \
|
||||
do { \
|
||||
int _nc = 1; /* numcliprects */ \
|
||||
while (_nc--) { \
|
||||
const int minx = fxMesa->clipMinX; \
|
||||
const int miny = fxMesa->clipMinY; \
|
||||
const int maxx = fxMesa->clipMaxX; \
|
||||
const int maxy = fxMesa->clipMaxY;
|
||||
|
||||
#define HW_ENDCLIPLOOP() \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
static void
|
||||
fxDDWriteMonoRGBASpan(const GLcontext * ctx,
|
||||
GLuint n, GLint x, GLint y,
|
||||
const GLchan color[4], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLuint i;
|
||||
GLint bottom = fxMesa->height - 1;
|
||||
GLuint data[MAX_WIDTH];
|
||||
GrColor_t gColor = FXCOLOR4(color);
|
||||
/* 16 bit, ARGB1555 color spanline and pixel functions */
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(...)\n", __FUNCTION__);
|
||||
}
|
||||
#undef LFB_MODE
|
||||
#define LFB_MODE GR_LFBWRITEMODE_1555
|
||||
|
||||
if (mask) {
|
||||
int span = 0;
|
||||
#undef BYTESPERPIXEL
|
||||
#define BYTESPERPIXEL 2
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
if (mask[i]) {
|
||||
data[span] = (GLuint) gColor;
|
||||
++span;
|
||||
}
|
||||
else {
|
||||
if (span > 0) {
|
||||
writeRegionClipped(fxMesa, fxMesa->currentFB, x + i - span,
|
||||
bottom - y, GR_LFB_SRC_FMT_8888, span, 1, 0,
|
||||
(void *) data);
|
||||
span = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#undef INIT_MONO_PIXEL
|
||||
#define INIT_MONO_PIXEL(p, color) \
|
||||
p = TDFXPACKCOLOR1555( color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP] )
|
||||
|
||||
if (span > 0)
|
||||
writeRegionClipped(fxMesa, fxMesa->currentFB, x + n - span,
|
||||
bottom - y, GR_LFB_SRC_FMT_8888, span, 1, 0,
|
||||
(void *) data);
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
data[i] = (GLuint) gColor;
|
||||
}
|
||||
#define WRITE_RGBA( _x, _y, r, g, b, a ) \
|
||||
*(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = \
|
||||
TDFXPACKCOLOR1555( r, g, b, a )
|
||||
|
||||
writeRegionClipped(fxMesa, fxMesa->currentFB, x, bottom - y,
|
||||
GR_LFB_SRC_FMT_8888, n, 1, 0, (void *) data);
|
||||
}
|
||||
}
|
||||
#define WRITE_PIXEL( _x, _y, p ) \
|
||||
*(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = p
|
||||
|
||||
#define READ_RGBA( rgba, _x, _y ) \
|
||||
do { \
|
||||
GLushort p = *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch); \
|
||||
rgba[0] = FX_rgb_scale_5[(p >> 10) & 0x1F]; \
|
||||
rgba[1] = FX_rgb_scale_5[(p >> 5) & 0x1F]; \
|
||||
rgba[2] = FX_rgb_scale_5[ p & 0x1F]; \
|
||||
rgba[3] = (p & 0x8000) ? 255 : 0; \
|
||||
} while (0)
|
||||
|
||||
#define TAG(x) tdfx##x##_ARGB1555
|
||||
#include "../dri/common/spantmp.h"
|
||||
|
||||
|
||||
#if 0
|
||||
static void
|
||||
fxDDReadRGBASpan(const GLcontext * ctx,
|
||||
GLuint n, GLint x, GLint y, GLubyte rgba[][4])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLushort data[MAX_WIDTH];
|
||||
GLuint i;
|
||||
GLint bottom = fxMesa->height - 1;
|
||||
/* 16 bit, RGB565 color spanline and pixel functions */
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(...)\n", __FUNCTION__);
|
||||
}
|
||||
#undef LFB_MODE
|
||||
#define LFB_MODE GR_LFBWRITEMODE_565
|
||||
|
||||
assert(n < MAX_WIDTH);
|
||||
#undef BYTESPERPIXEL
|
||||
#define BYTESPERPIXEL 2
|
||||
|
||||
FX_grLfbReadRegion(fxMesa->currentFB, x, bottom - y, n, 1, 0, data);
|
||||
#undef INIT_MONO_PIXEL
|
||||
#define INIT_MONO_PIXEL(p, color) \
|
||||
p = TDFXPACKCOLOR565( color[RCOMP], color[GCOMP], color[BCOMP] )
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
GLushort pixel = data[i];
|
||||
rgba[i][RCOMP] = FX_PixelToR[pixel];
|
||||
rgba[i][GCOMP] = FX_PixelToG[pixel];
|
||||
rgba[i][BCOMP] = FX_PixelToB[pixel];
|
||||
rgba[i][ACOMP] = 255;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#define WRITE_RGBA( _x, _y, r, g, b, a ) \
|
||||
*(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = \
|
||||
TDFXPACKCOLOR565( r, g, b )
|
||||
|
||||
#define WRITE_PIXEL( _x, _y, p ) \
|
||||
*(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = p
|
||||
|
||||
#define READ_RGBA( rgba, _x, _y ) \
|
||||
do { \
|
||||
GLushort p = *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch); \
|
||||
rgba[0] = FX_rgb_scale_5[(p >> 11) & 0x1F]; \
|
||||
rgba[1] = FX_rgb_scale_6[(p >> 5) & 0x3F]; \
|
||||
rgba[2] = FX_rgb_scale_5[ p & 0x1F]; \
|
||||
rgba[3] = 0xff; \
|
||||
} while (0)
|
||||
|
||||
#define TAG(x) tdfx##x##_RGB565
|
||||
#include "../dri/common/spantmp.h"
|
||||
|
||||
|
||||
/*
|
||||
* Read a span of 16-bit RGB pixels. Note, we don't worry about cliprects
|
||||
* since OpenGL says obscured pixels have undefined values.
|
||||
*/
|
||||
static void
|
||||
read_R5G6B5_span(const GLcontext * ctx,
|
||||
GLuint n, GLint x, GLint y, GLubyte rgba[][4])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
BEGIN_BOARD_LOCK();
|
||||
if (grLfbLock(GR_LFB_READ_ONLY,
|
||||
fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
|
||||
const GLushort *data16 = (const GLushort *) info.lfbPtr
|
||||
+ (winY - y) * srcStride + (winX + x);
|
||||
const GLuint *data32 = (const GLuint *) data16;
|
||||
GLuint i, j;
|
||||
GLuint extraPixel = (n & 1);
|
||||
n -= extraPixel;
|
||||
for (i = j = 0; i < n; i += 2, j++) {
|
||||
GLuint pixel = data32[j];
|
||||
GLuint pixel0 = pixel & 0xffff;
|
||||
GLuint pixel1 = pixel >> 16;
|
||||
rgba[i][RCOMP] = FX_PixelToR[pixel0];
|
||||
rgba[i][GCOMP] = FX_PixelToG[pixel0];
|
||||
rgba[i][BCOMP] = FX_PixelToB[pixel0];
|
||||
rgba[i][ACOMP] = 255;
|
||||
rgba[i + 1][RCOMP] = FX_PixelToR[pixel1];
|
||||
rgba[i + 1][GCOMP] = FX_PixelToG[pixel1];
|
||||
rgba[i + 1][BCOMP] = FX_PixelToB[pixel1];
|
||||
rgba[i + 1][ACOMP] = 255;
|
||||
}
|
||||
if (extraPixel) {
|
||||
GLushort pixel = data16[n];
|
||||
rgba[n][RCOMP] = FX_PixelToR[pixel];
|
||||
rgba[n][GCOMP] = FX_PixelToG[pixel];
|
||||
rgba[n][BCOMP] = FX_PixelToB[pixel];
|
||||
rgba[n][ACOMP] = 255;
|
||||
}
|
||||
/* 32 bit, ARGB8888 color spanline and pixel functions */
|
||||
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
END_BOARD_LOCK();
|
||||
}
|
||||
#undef LFB_MODE
|
||||
#define LFB_MODE GR_LFBWRITEMODE_8888
|
||||
|
||||
#undef BYTESPERPIXEL
|
||||
#define BYTESPERPIXEL 4
|
||||
|
||||
#undef INIT_MONO_PIXEL
|
||||
#define INIT_MONO_PIXEL(p, color) \
|
||||
p = TDFXPACKCOLOR8888( color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP] )
|
||||
|
||||
#define WRITE_RGBA( _x, _y, r, g, b, a ) \
|
||||
*(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch) = \
|
||||
TDFXPACKCOLOR8888( r, g, b, a )
|
||||
|
||||
#define WRITE_PIXEL( _x, _y, p ) \
|
||||
*(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch) = p
|
||||
|
||||
#define READ_RGBA( rgba, _x, _y ) \
|
||||
do { \
|
||||
GLuint p = *(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch); \
|
||||
rgba[0] = (p >> 16) & 0xff; \
|
||||
rgba[1] = (p >> 8) & 0xff; \
|
||||
rgba[2] = (p >> 0) & 0xff; \
|
||||
rgba[3] = (p >> 24) & 0xff; \
|
||||
} while (0)
|
||||
|
||||
#define TAG(x) tdfx##x##_ARGB8888
|
||||
#include "../dri/common/spantmp.h"
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/***** Span functions (optimized) *****/
|
||||
/************************************************************************/
|
||||
|
||||
/*
|
||||
* Read a span of 15-bit RGB pixels. Note, we don't worry about cliprects
|
||||
* since OpenGL says obscured pixels have undefined values.
|
||||
*/
|
||||
static void read_R5G5B5_span (const GLcontext * ctx,
|
||||
GLuint n,
|
||||
GLint x, GLint y,
|
||||
GLubyte rgba[][4])
|
||||
static void fxReadRGBASpan_ARGB1555 (const GLcontext * ctx,
|
||||
GLuint n,
|
||||
GLint x, GLint y,
|
||||
GLubyte rgba[][4])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
BEGIN_BOARD_LOCK();
|
||||
if (grLfbLock(GR_LFB_READ_ONLY,
|
||||
fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
|
||||
const GLushort *data16 = (const GLushort *) info.lfbPtr
|
||||
+ (winY - y) * srcStride + (winX + x);
|
||||
const GLuint *data32 = (const GLuint *) data16;
|
||||
GLuint i, j;
|
||||
GLuint extraPixel = (n & 1);
|
||||
n -= extraPixel;
|
||||
for (i = j = 0; i < n; i += 2, j++) {
|
||||
GLuint pixel = data32[j];
|
||||
rgba[i][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f];
|
||||
rgba[i][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
|
||||
rgba[i][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
|
||||
rgba[i][ACOMP] = (pixel & 0x8000) ? 255 : 0;
|
||||
rgba[i + 1][RCOMP] = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
|
||||
rgba[i + 1][GCOMP] = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
|
||||
rgba[i + 1][BCOMP] = FX_rgb_scale_5[(pixel >> 26) & 0x1f];
|
||||
rgba[i + 1][ACOMP] = (pixel & 0x80000000) ? 255 : 0;
|
||||
}
|
||||
if (extraPixel) {
|
||||
GLushort pixel = data16[n];
|
||||
rgba[n][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f];
|
||||
rgba[n][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
|
||||
rgba[n][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
|
||||
rgba[n][ACOMP] = (pixel & 0x8000) ? 255 : 0;
|
||||
}
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
info.size = sizeof(GrLfbInfo_t);
|
||||
if (grLfbLock(GR_LFB_READ_ONLY, fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
const GLushort *data16 = (const GLushort *)((const GLubyte *)info.lfbPtr +
|
||||
(winY - y) * info.strideInBytes +
|
||||
(winX + x) * 2);
|
||||
const GLuint *data32 = (const GLuint *) data16;
|
||||
GLuint i, j;
|
||||
GLuint extraPixel = (n & 1);
|
||||
n -= extraPixel;
|
||||
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
END_BOARD_LOCK();
|
||||
for (i = j = 0; i < n; i += 2, j++) {
|
||||
GLuint pixel = data32[j];
|
||||
rgba[i][0] = FX_rgb_scale_5[(pixel >> 10) & 0x1F];
|
||||
rgba[i][1] = FX_rgb_scale_5[(pixel >> 5) & 0x1F];
|
||||
rgba[i][2] = FX_rgb_scale_5[ pixel & 0x1F];
|
||||
rgba[i][3] = (pixel & 0x8000) ? 255 : 0;
|
||||
rgba[i+1][0] = FX_rgb_scale_5[(pixel >> 26) & 0x1F];
|
||||
rgba[i+1][1] = FX_rgb_scale_5[(pixel >> 21) & 0x1F];
|
||||
rgba[i+1][2] = FX_rgb_scale_5[(pixel >> 16) & 0x1F];
|
||||
rgba[i+1][3] = (pixel & 0x80000000) ? 255 : 0;
|
||||
}
|
||||
if (extraPixel) {
|
||||
GLushort pixel = data16[n];
|
||||
rgba[n][0] = FX_rgb_scale_5[(pixel >> 10) & 0x1F];
|
||||
rgba[n][1] = FX_rgb_scale_5[(pixel >> 5) & 0x1F];
|
||||
rgba[n][2] = FX_rgb_scale_5[ pixel & 0x1F];
|
||||
rgba[n][3] = (pixel & 0x8000) ? 255 : 0;
|
||||
}
|
||||
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a span of 16-bit RGB pixels. Note, we don't worry about cliprects
|
||||
* since OpenGL says obscured pixels have undefined values.
|
||||
*/
|
||||
static void fxReadRGBASpan_RGB565 (const GLcontext * ctx,
|
||||
GLuint n,
|
||||
GLint x, GLint y,
|
||||
GLubyte rgba[][4])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
info.size = sizeof(GrLfbInfo_t);
|
||||
if (grLfbLock(GR_LFB_READ_ONLY, fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
const GLushort *data16 = (const GLushort *)((const GLubyte *)info.lfbPtr +
|
||||
(winY - y) * info.strideInBytes +
|
||||
(winX + x) * 2);
|
||||
const GLuint *data32 = (const GLuint *) data16;
|
||||
GLuint i, j;
|
||||
GLuint extraPixel = (n & 1);
|
||||
n -= extraPixel;
|
||||
|
||||
for (i = j = 0; i < n; i += 2, j++) {
|
||||
GLuint pixel = data32[j];
|
||||
#if 0
|
||||
GLuint pixel0 = pixel & 0xffff;
|
||||
GLuint pixel1 = pixel >> 16;
|
||||
rgba[i][RCOMP] = FX_PixelToR[pixel0];
|
||||
rgba[i][GCOMP] = FX_PixelToG[pixel0];
|
||||
rgba[i][BCOMP] = FX_PixelToB[pixel0];
|
||||
rgba[i][ACOMP] = 255;
|
||||
rgba[i + 1][RCOMP] = FX_PixelToR[pixel1];
|
||||
rgba[i + 1][GCOMP] = FX_PixelToG[pixel1];
|
||||
rgba[i + 1][BCOMP] = FX_PixelToB[pixel1];
|
||||
rgba[i + 1][ACOMP] = 255;
|
||||
#else
|
||||
rgba[i][0] = FX_rgb_scale_5[(pixel >> 11) & 0x1F];
|
||||
rgba[i][1] = FX_rgb_scale_6[(pixel >> 5) & 0x3F];
|
||||
rgba[i][2] = FX_rgb_scale_5[ pixel & 0x1F];
|
||||
rgba[i][3] = 255;
|
||||
rgba[i+1][0] = FX_rgb_scale_5[(pixel >> 27) & 0x1F];
|
||||
rgba[i+1][1] = FX_rgb_scale_6[(pixel >> 21) & 0x3F];
|
||||
rgba[i+1][2] = FX_rgb_scale_5[(pixel >> 16) & 0x1F];
|
||||
rgba[i+1][3] = 255;
|
||||
#endif
|
||||
}
|
||||
if (extraPixel) {
|
||||
GLushort pixel = data16[n];
|
||||
#if 0
|
||||
rgba[n][RCOMP] = FX_PixelToR[pixel];
|
||||
rgba[n][GCOMP] = FX_PixelToG[pixel];
|
||||
rgba[n][BCOMP] = FX_PixelToB[pixel];
|
||||
rgba[n][ACOMP] = 255;
|
||||
#else
|
||||
rgba[n][0] = FX_rgb_scale_5[(pixel >> 11) & 0x1F];
|
||||
rgba[n][1] = FX_rgb_scale_6[(pixel >> 5) & 0x3F];
|
||||
rgba[n][2] = FX_rgb_scale_5[ pixel & 0x1F];
|
||||
rgba[n][3] = 255;
|
||||
#endif
|
||||
}
|
||||
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a span of 32-bit RGB pixels. Note, we don't worry about cliprects
|
||||
* since OpenGL says obscured pixels have undefined values.
|
||||
*/
|
||||
static void read_R8G8B8_span (const GLcontext * ctx,
|
||||
GLuint n,
|
||||
GLint x, GLint y,
|
||||
GLubyte rgba[][4])
|
||||
static void fxReadRGBASpan_ARGB8888 (const GLcontext * ctx,
|
||||
GLuint n,
|
||||
GLint x, GLint y,
|
||||
GLubyte rgba[][4])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
BEGIN_BOARD_LOCK();
|
||||
grLfbReadRegion(fxMesa->currentFB, x, fxMesa->height - 1 - y, n, 1, n * 4, rgba);
|
||||
END_BOARD_LOCK();
|
||||
/* Hack alert: WRONG! */
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
grLfbReadRegion(fxMesa->currentFB, x, fxMesa->height - 1 - y, n, 1, n * 4, rgba);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/***** Pixel functions *****/
|
||||
/************************************************************************/
|
||||
|
||||
static void
|
||||
fxDDWriteRGBAPixels(const GLcontext * ctx,
|
||||
GLuint n, const GLint x[], const GLint y[],
|
||||
CONST GLubyte rgba[][4], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLuint i;
|
||||
GLint bottom = fxMesa->height - 1;
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(...)\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
if (mask[i])
|
||||
LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x[i], bottom - y[i],
|
||||
1, 1, (void *) rgba[i]);
|
||||
}
|
||||
|
||||
static void
|
||||
fxDDWriteMonoRGBAPixels(const GLcontext * ctx,
|
||||
GLuint n, const GLint x[], const GLint y[],
|
||||
const GLchan color[4], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLuint i;
|
||||
GLint bottom = fxMesa->height - 1;
|
||||
GrColor_t gColor = FXCOLOR4(color);
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(...)\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
if (mask[i])
|
||||
writeRegionClipped(fxMesa, fxMesa->currentFB, x[i], bottom - y[i],
|
||||
GR_LFB_SRC_FMT_8888, 1, 1, 0, (void *) &gColor);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_R5G6B5_pixels(const GLcontext * ctx,
|
||||
GLuint n, const GLint x[], const GLint y[],
|
||||
GLubyte rgba[][4], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
BEGIN_BOARD_LOCK();
|
||||
if (grLfbLock(GR_LFB_READ_ONLY,
|
||||
fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (mask[i]) {
|
||||
const GLushort *data16 = (const GLushort *) info.lfbPtr
|
||||
+ (winY - y[i]) * srcStride + (winX + x[i]);
|
||||
const GLushort pixel = *data16;
|
||||
rgba[i][RCOMP] = FX_PixelToR[pixel];
|
||||
rgba[i][GCOMP] = FX_PixelToG[pixel];
|
||||
rgba[i][BCOMP] = FX_PixelToB[pixel];
|
||||
rgba[i][ACOMP] = 255;
|
||||
}
|
||||
}
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
END_BOARD_LOCK();
|
||||
}
|
||||
|
||||
|
||||
static void read_R5G5B5_pixels (const GLcontext * ctx,
|
||||
GLuint n,
|
||||
const GLint x[], const GLint y[],
|
||||
GLubyte rgba[][4],
|
||||
const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
BEGIN_BOARD_LOCK();
|
||||
if (grLfbLock(GR_LFB_READ_ONLY,
|
||||
fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (mask[i]) {
|
||||
const GLushort *data16 = (const GLushort *) info.lfbPtr
|
||||
+ (winY - y[i]) * srcStride + (winX + x[i]);
|
||||
const GLushort pixel = *data16;
|
||||
rgba[i][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f];
|
||||
rgba[i][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
|
||||
rgba[i][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
|
||||
rgba[i][ACOMP] = (pixel & 0x8000) ? 255 : 0;
|
||||
}
|
||||
}
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
END_BOARD_LOCK();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
read_R8G8B8_pixels(const GLcontext * ctx,
|
||||
GLuint n, const GLint x[], const GLint y[],
|
||||
GLubyte rgba[][4], const GLubyte mask[])
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GrLfbInfo_t info;
|
||||
BEGIN_BOARD_LOCK();
|
||||
if (grLfbLock(GR_LFB_READ_ONLY,
|
||||
fxMesa->currentFB,
|
||||
GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
|
||||
const GLint srcStride = info.strideInBytes / 4; /* stride in GLuints */
|
||||
const GLint winX = 0;
|
||||
const GLint winY = fxMesa->height - 1;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (mask[i]) {
|
||||
const GLuint *data32 = (const GLuint *) info.lfbPtr
|
||||
+ (winY - y[i]) * srcStride + (winX + x[i]);
|
||||
const GLuint pixel = *data32;
|
||||
*(GLuint *)&rgba[i][0] = pixel;
|
||||
}
|
||||
}
|
||||
grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
|
||||
}
|
||||
END_BOARD_LOCK();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/***** Depth functions *****/
|
||||
/************************************************************************/
|
||||
@ -753,45 +617,79 @@ void
|
||||
fxSetupDDSpanPointers(GLcontext * ctx)
|
||||
{
|
||||
struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx );
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
|
||||
swdd->SetBuffer = fxDDSetBuffer;
|
||||
|
||||
swdd->WriteRGBASpan = fxDDWriteRGBASpan;
|
||||
swdd->WriteRGBSpan = fxDDWriteRGBSpan;
|
||||
swdd->WriteMonoRGBASpan = fxDDWriteMonoRGBASpan;
|
||||
swdd->WriteRGBAPixels = fxDDWriteRGBAPixels;
|
||||
swdd->WriteMonoRGBAPixels = fxDDWriteMonoRGBAPixels;
|
||||
|
||||
/* swdd->ReadRGBASpan =fxDDReadRGBASpan; */
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
switch (fxMesa->colDepth) {
|
||||
case 15:
|
||||
swdd->ReadRGBASpan = read_R5G5B5_span;
|
||||
swdd->ReadRGBAPixels = read_R5G5B5_pixels;
|
||||
swdd->WriteRGBASpan = tdfxWriteRGBASpan_ARGB1555;
|
||||
swdd->WriteRGBSpan = tdfxWriteRGBSpan_ARGB1555;
|
||||
swdd->WriteRGBAPixels = tdfxWriteRGBAPixels_ARGB1555;
|
||||
swdd->WriteMonoRGBASpan = tdfxWriteMonoRGBASpan_ARGB1555;
|
||||
swdd->WriteMonoRGBAPixels = tdfxWriteMonoRGBAPixels_ARGB1555;
|
||||
swdd->ReadRGBASpan = /*td*/fxReadRGBASpan_ARGB1555;
|
||||
swdd->ReadRGBAPixels = tdfxReadRGBAPixels_ARGB1555;
|
||||
|
||||
swdd->WriteDepthSpan = fxDDWriteDepthSpan;
|
||||
swdd->WriteDepthPixels = fxDDWriteDepthPixels;
|
||||
swdd->ReadDepthSpan = fxDDReadDepthSpan;
|
||||
swdd->ReadDepthPixels = fxDDReadDepthPixels;
|
||||
break;
|
||||
case 16:
|
||||
swdd->ReadRGBASpan = read_R5G6B5_span;
|
||||
swdd->ReadRGBAPixels = read_R5G6B5_pixels;
|
||||
swdd->WriteRGBASpan = tdfxWriteRGBASpan_RGB565;
|
||||
swdd->WriteRGBSpan = tdfxWriteRGBSpan_RGB565;
|
||||
swdd->WriteRGBAPixels = tdfxWriteRGBAPixels_RGB565;
|
||||
swdd->WriteMonoRGBASpan = tdfxWriteMonoRGBASpan_RGB565;
|
||||
swdd->WriteMonoRGBAPixels = tdfxWriteMonoRGBAPixels_RGB565;
|
||||
swdd->ReadRGBASpan = /*td*/fxReadRGBASpan_RGB565;
|
||||
swdd->ReadRGBAPixels = tdfxReadRGBAPixels_RGB565;
|
||||
|
||||
swdd->WriteDepthSpan = fxDDWriteDepthSpan;
|
||||
swdd->WriteDepthPixels = fxDDWriteDepthPixels;
|
||||
swdd->ReadDepthSpan = fxDDReadDepthSpan;
|
||||
swdd->ReadDepthPixels = fxDDReadDepthPixels;
|
||||
break;
|
||||
case 32:
|
||||
swdd->ReadRGBASpan = read_R8G8B8_span;
|
||||
swdd->ReadRGBAPixels = read_R8G8B8_pixels;
|
||||
swdd->WriteRGBASpan = tdfxWriteRGBASpan_ARGB8888;
|
||||
swdd->WriteRGBSpan = tdfxWriteRGBSpan_ARGB8888;
|
||||
swdd->WriteRGBAPixels = tdfxWriteRGBAPixels_ARGB8888;
|
||||
swdd->WriteMonoRGBASpan = tdfxWriteMonoRGBASpan_ARGB8888;
|
||||
swdd->WriteMonoRGBAPixels = tdfxWriteMonoRGBAPixels_ARGB8888;
|
||||
swdd->ReadRGBASpan = tdfxReadRGBASpan_ARGB8888;
|
||||
swdd->ReadRGBAPixels = tdfxReadRGBAPixels_ARGB8888;
|
||||
|
||||
swdd->WriteDepthSpan = fxDDWriteDepth32Span;
|
||||
swdd->WriteDepthPixels = fxDDWriteDepth32Pixels;
|
||||
swdd->ReadDepthSpan = fxDDReadDepth32Span;
|
||||
swdd->ReadDepthPixels = fxDDReadDepth32Pixels;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ( fxMesa->haveHwStencil ) {
|
||||
swdd->WriteStencilSpan = write_stencil_span;
|
||||
swdd->ReadStencilSpan = read_stencil_span;
|
||||
swdd->WriteStencilPixels = write_stencil_pixels;
|
||||
swdd->ReadStencilPixels = read_stencil_pixels;
|
||||
}
|
||||
|
||||
swdd->WriteDepthSpan = tdfxDDWriteDepthSpan;
|
||||
swdd->WriteDepthPixels = tdfxDDWriteDepthPixels;
|
||||
swdd->ReadDepthSpan = tdfxDDReadDepthSpan;
|
||||
swdd->ReadDepthPixels = tdfxDDReadDepthPixels;
|
||||
|
||||
swdd->WriteCI8Span = NULL;
|
||||
swdd->WriteCI32Span = NULL;
|
||||
swdd->WriteMonoCISpan = NULL;
|
||||
swdd->WriteCI32Pixels = NULL;
|
||||
swdd->WriteMonoCIPixels = NULL;
|
||||
swdd->ReadCI32Span = NULL;
|
||||
swdd->ReadCI32Pixels = NULL;
|
||||
|
||||
swdd->SpanRenderStart = tdfxSpanRenderStart; /* BEGIN_BOARD_LOCK */
|
||||
swdd->SpanRenderFinish = tdfxSpanRenderFinish; /* END_BOARD_LOCK */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxddtex.c,v 1.48 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxddtex.c,v 1.49 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -41,6 +41,7 @@
|
||||
#if defined(FX)
|
||||
|
||||
#include "fxdrv.h"
|
||||
#include "enums.h"
|
||||
#include "image.h"
|
||||
#include "teximage.h"
|
||||
#include "texformat.h"
|
||||
@ -192,8 +193,10 @@ fxDDTexParam(GLcontext * ctx, GLenum target, struct gl_texture_object *tObj,
|
||||
tfxTexInfo *ti;
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(%d, %x, %x, %x)\n", __FUNCTION__,
|
||||
tObj->Name, (GLuint) tObj->DriverData, pname, param);
|
||||
fprintf(stderr, "fxDDTexParam(%d, %x, %s, %s)\n",
|
||||
tObj->Name, (GLuint) tObj->DriverData,
|
||||
_mesa_lookup_enum_by_nr(pname),
|
||||
_mesa_lookup_enum_by_nr(param));
|
||||
}
|
||||
|
||||
if (target != GL_TEXTURE_2D)
|
||||
@ -279,6 +282,7 @@ fxDDTexParam(GLcontext * ctx, GLenum target, struct gl_texture_object *tObj,
|
||||
case GL_MIRRORED_REPEAT:
|
||||
ti->sClamp = GR_TEXTURECLAMP_MIRROR_EXT;
|
||||
break;
|
||||
case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */
|
||||
case GL_CLAMP:
|
||||
ti->sClamp = GR_TEXTURECLAMP_CLAMP;
|
||||
break;
|
||||
@ -296,6 +300,7 @@ fxDDTexParam(GLcontext * ctx, GLenum target, struct gl_texture_object *tObj,
|
||||
case GL_MIRRORED_REPEAT:
|
||||
ti->tClamp = GR_TEXTURECLAMP_MIRROR_EXT;
|
||||
break;
|
||||
case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */
|
||||
case GL_CLAMP:
|
||||
ti->tClamp = GR_TEXTURECLAMP_CLAMP;
|
||||
break;
|
||||
@ -625,125 +630,6 @@ fxTexGetInfo(int w, int h, GrLOD_t * lodlevel, GrAspectRatio_t * ar,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given an OpenGL internal texture format, return the corresponding
|
||||
* Glide internal texture format and base texture format.
|
||||
*/
|
||||
void
|
||||
fxTexGetFormat(GLcontext *ctx, GLenum glformat, GrTextureFormat_t * tfmt, GLint * ifmt) /* [koolsmoky] */
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
GLboolean allow32bpt = fxMesa->HaveTexFmt;
|
||||
|
||||
switch (glformat) {
|
||||
case 1:
|
||||
case GL_LUMINANCE:
|
||||
case GL_LUMINANCE4:
|
||||
case GL_LUMINANCE8:
|
||||
case GL_LUMINANCE12:
|
||||
case GL_LUMINANCE16:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_INTENSITY_8;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_LUMINANCE;
|
||||
break;
|
||||
case 2:
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
case GL_LUMINANCE4_ALPHA4:
|
||||
case GL_LUMINANCE6_ALPHA2:
|
||||
case GL_LUMINANCE8_ALPHA8:
|
||||
case GL_LUMINANCE12_ALPHA4:
|
||||
case GL_LUMINANCE12_ALPHA12:
|
||||
case GL_LUMINANCE16_ALPHA16:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_ALPHA_INTENSITY_88;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_LUMINANCE_ALPHA;
|
||||
break;
|
||||
case GL_INTENSITY:
|
||||
case GL_INTENSITY4:
|
||||
case GL_INTENSITY8:
|
||||
case GL_INTENSITY12:
|
||||
case GL_INTENSITY16:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_ALPHA_8;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_INTENSITY;
|
||||
break;
|
||||
case GL_ALPHA:
|
||||
case GL_ALPHA4:
|
||||
case GL_ALPHA8:
|
||||
case GL_ALPHA12:
|
||||
case GL_ALPHA16:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_ALPHA_8;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_ALPHA;
|
||||
break;
|
||||
case GL_R3_G3_B2:
|
||||
case GL_RGB4:
|
||||
case GL_RGB5:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_RGB_565;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_RGB;
|
||||
break;
|
||||
case 3:
|
||||
case GL_RGB:
|
||||
case GL_RGB8:
|
||||
case GL_RGB10:
|
||||
case GL_RGB12:
|
||||
case GL_RGB16:
|
||||
if (tfmt)
|
||||
(*tfmt) = allow32bpt ? GR_TEXFMT_ARGB_8888 : GR_TEXFMT_RGB_565;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_RGB;
|
||||
break;
|
||||
case GL_RGBA2:
|
||||
case GL_RGBA4:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_ARGB_4444;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_RGBA;
|
||||
break;
|
||||
case 4:
|
||||
case GL_RGBA:
|
||||
case GL_RGBA8:
|
||||
case GL_RGB10_A2:
|
||||
case GL_RGBA12:
|
||||
case GL_RGBA16:
|
||||
if (tfmt)
|
||||
(*tfmt) = allow32bpt ? GR_TEXFMT_ARGB_8888 : GR_TEXFMT_ARGB_4444;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_RGBA;
|
||||
break;
|
||||
case GL_RGB5_A1:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_ARGB_1555;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_RGBA;
|
||||
break;
|
||||
case GL_COLOR_INDEX:
|
||||
case GL_COLOR_INDEX1_EXT:
|
||||
case GL_COLOR_INDEX2_EXT:
|
||||
case GL_COLOR_INDEX4_EXT:
|
||||
case GL_COLOR_INDEX8_EXT:
|
||||
case GL_COLOR_INDEX12_EXT:
|
||||
case GL_COLOR_INDEX16_EXT:
|
||||
if (tfmt)
|
||||
(*tfmt) = GR_TEXFMT_P_8;
|
||||
if (ifmt)
|
||||
(*ifmt) = GL_RGBA; /* XXX why is this RGBA? */
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "%s: ERROR: unsupported internalFormat (0x%x)\n",
|
||||
__FUNCTION__, glformat);
|
||||
fxCloseHardware();
|
||||
exit(-1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
fxIsTexSupported(GLenum target, GLint internalFormat,
|
||||
const struct gl_texture_image *image)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxdrv.h,v 1.59 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxdrv.h,v 1.60 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -147,6 +147,90 @@
|
||||
#define FX_UM_ALPHA_CONSTANT 0x08000000
|
||||
|
||||
|
||||
/* for Voodoo3/Banshee's grColorCombine() and grAlphaCombine() */
|
||||
struct tdfx_combine {
|
||||
GrCombineFunction_t Function; /* Combine function */
|
||||
GrCombineFactor_t Factor; /* Combine scale factor */
|
||||
GrCombineLocal_t Local; /* Local combine source */
|
||||
GrCombineOther_t Other; /* Other combine source */
|
||||
FxBool Invert; /* Combine result inversion flag */
|
||||
};
|
||||
|
||||
/* for Voodoo3's grTexCombine() */
|
||||
struct tdfx_texcombine {
|
||||
GrCombineFunction_t FunctionRGB;
|
||||
GrCombineFactor_t FactorRGB;
|
||||
GrCombineFunction_t FunctionAlpha;
|
||||
GrCombineFactor_t FactorAlpha;
|
||||
FxBool InvertRGB;
|
||||
FxBool InvertAlpha;
|
||||
};
|
||||
|
||||
|
||||
/* for Voodoo5's grColorCombineExt() */
|
||||
struct tdfx_combine_color_ext {
|
||||
GrCCUColor_t SourceA;
|
||||
GrCombineMode_t ModeA;
|
||||
GrCCUColor_t SourceB;
|
||||
GrCombineMode_t ModeB;
|
||||
GrCCUColor_t SourceC;
|
||||
FxBool InvertC;
|
||||
GrCCUColor_t SourceD;
|
||||
FxBool InvertD;
|
||||
FxU32 Shift;
|
||||
FxBool Invert;
|
||||
};
|
||||
|
||||
/* for Voodoo5's grAlphaCombineExt() */
|
||||
struct tdfx_combine_alpha_ext {
|
||||
GrACUColor_t SourceA;
|
||||
GrCombineMode_t ModeA;
|
||||
GrACUColor_t SourceB;
|
||||
GrCombineMode_t ModeB;
|
||||
GrACUColor_t SourceC;
|
||||
FxBool InvertC;
|
||||
GrACUColor_t SourceD;
|
||||
FxBool InvertD;
|
||||
FxU32 Shift;
|
||||
FxBool Invert;
|
||||
};
|
||||
|
||||
/* for Voodoo5's grTexColorCombineExt() */
|
||||
struct tdfx_color_texenv {
|
||||
GrTCCUColor_t SourceA;
|
||||
GrCombineMode_t ModeA;
|
||||
GrTCCUColor_t SourceB;
|
||||
GrCombineMode_t ModeB;
|
||||
GrTCCUColor_t SourceC;
|
||||
FxBool InvertC;
|
||||
GrTCCUColor_t SourceD;
|
||||
FxBool InvertD;
|
||||
FxU32 Shift;
|
||||
FxBool Invert;
|
||||
};
|
||||
|
||||
/* for Voodoo5's grTexAlphaCombineExt() */
|
||||
struct tdfx_alpha_texenv {
|
||||
GrTACUColor_t SourceA;
|
||||
GrCombineMode_t ModeA;
|
||||
GrTACUColor_t SourceB;
|
||||
GrCombineMode_t ModeB;
|
||||
GrTACUColor_t SourceC;
|
||||
FxBool InvertC;
|
||||
GrTCCUColor_t SourceD;
|
||||
FxBool InvertD;
|
||||
FxU32 Shift;
|
||||
FxBool Invert;
|
||||
};
|
||||
|
||||
/* Voodoo5's texture combine environment */
|
||||
struct tdfx_texcombine_ext {
|
||||
struct tdfx_alpha_texenv Alpha;
|
||||
struct tdfx_color_texenv Color;
|
||||
GrColor_t EnvColor;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Memory range from startAddr to endAddr-1
|
||||
*/
|
||||
@ -570,9 +654,6 @@ extern int fxDDInitFxMesaContext(fxMesaContext fxMesa);
|
||||
extern void fxDDDestroyFxMesaContext(fxMesaContext fxMesa);
|
||||
|
||||
|
||||
void fxColorMask (fxMesaContext fxMesa, GLboolean enable);
|
||||
|
||||
|
||||
extern void fxSetScissorValues(GLcontext * ctx);
|
||||
extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa,
|
||||
struct gl_texture_object *tObj, GLint where);
|
||||
@ -580,6 +661,12 @@ extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder);
|
||||
|
||||
extern void fxCheckIsInHardware(GLcontext *ctx);
|
||||
|
||||
/* fxsetup:
|
||||
* semi-private functions
|
||||
*/
|
||||
void fxSetupScissor (GLcontext * ctx);
|
||||
void fxSetupColorMask (GLcontext * ctx);
|
||||
|
||||
/* Flags for software fallback cases */
|
||||
#define FX_FALLBACK_TEXTURE_1D_3D 0x0001
|
||||
#define FX_FALLBACK_DRAW_BUFFER 0x0002
|
||||
@ -595,4 +682,11 @@ extern void fxCheckIsInHardware(GLcontext *ctx);
|
||||
|
||||
extern GLuint fx_check_IsInHardware(GLcontext *ctx);
|
||||
|
||||
/* run-time debugging */
|
||||
#if FX_DEBUG
|
||||
extern int TDFX_DEBUG;
|
||||
#else
|
||||
#define TDFX_DEBUG 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxglidew.h,v 1.16 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxglidew.h,v 1.17 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -216,12 +216,4 @@ extern FxBool FX_grSstControl(FxU32 code);
|
||||
|
||||
|
||||
|
||||
#if FX_DEBUG
|
||||
extern int TDFX_DEBUG;
|
||||
#else
|
||||
#define TDFX_DEBUG 0
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* __FX_GLIDE_WARPER__ */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxsetup.c,v 1.40 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxsetup.c,v 1.41 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -79,19 +79,13 @@ fxTexValidate(GLcontext * ctx, struct gl_texture_object *tObj)
|
||||
else
|
||||
FX_smallLodLog2(ti->info) = FX_largeLodLog2(ti->info);
|
||||
|
||||
/*jejeje*/
|
||||
ti->baseLevelInternalFormat = tObj->Image[minl]->Format;
|
||||
#if 0
|
||||
fxTexGetFormat(ctx, tObj->Image[minl]->TexFormat->BaseFormat, &(ti->info.format),
|
||||
&(ti->baseLevelInternalFormat)); /* [koolsmoky] */
|
||||
#endif
|
||||
ti->baseLevelInternalFormat = tObj->Image[minl]->Format;
|
||||
|
||||
switch (tObj->WrapS) {
|
||||
case GL_MIRRORED_REPEAT:
|
||||
ti->sClamp = GR_TEXTURECLAMP_MIRROR_EXT;
|
||||
break;
|
||||
case GL_CLAMP_TO_EDGE:
|
||||
/* What's this really mean compared to GL_CLAMP? */
|
||||
case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */
|
||||
case GL_CLAMP:
|
||||
ti->sClamp = GR_TEXTURECLAMP_CLAMP;
|
||||
break;
|
||||
@ -105,8 +99,7 @@ ti->baseLevelInternalFormat = tObj->Image[minl]->Format;
|
||||
case GL_MIRRORED_REPEAT:
|
||||
ti->tClamp = GR_TEXTURECLAMP_MIRROR_EXT;
|
||||
break;
|
||||
case GL_CLAMP_TO_EDGE:
|
||||
/* What's this really mean compared to GL_CLAMP? */
|
||||
case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */
|
||||
case GL_CLAMP:
|
||||
ti->tClamp = GR_TEXTURECLAMP_CLAMP;
|
||||
break;
|
||||
@ -301,6 +294,10 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj)
|
||||
fprintf(stderr, "%s(%p (%d))\n", __FUNCTION__, (void *)tObj, tObj->Name);
|
||||
}
|
||||
|
||||
#if 1 /* [dBorca] Good... bad... I'm the guy with the gun! */
|
||||
ti->lastTimeUsed = fxMesa->texBindNumber;
|
||||
#endif
|
||||
|
||||
/* Make sure we're not loaded incorrectly */
|
||||
if (ti->isInTM) {
|
||||
if (ti->LODblend) {
|
||||
@ -390,66 +387,84 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj)
|
||||
static void
|
||||
fxSelectSingleTMUSrc_NoLock(fxMesaContext fxMesa, GLint tmu, FxBool LODblend)
|
||||
{
|
||||
struct tdfx_texcombine tex0, tex1;
|
||||
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s(%d, %d)\n", __FUNCTION__, tmu, LODblend);
|
||||
}
|
||||
|
||||
if (LODblend) {
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND,
|
||||
GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION,
|
||||
GR_COMBINE_FUNCTION_BLEND,
|
||||
GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION,
|
||||
FXFALSE, FXFALSE);
|
||||
tex0.InvertRGB = FXFALSE;
|
||||
tex0.InvertAlpha = FXFALSE;
|
||||
tex1.InvertRGB = FXFALSE;
|
||||
tex1.InvertAlpha = FXFALSE;
|
||||
|
||||
if (LODblend) {
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION;
|
||||
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
|
||||
if (fxMesa->haveTwoTMUs)
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
fxMesa->tmuSrc = FX_TMU_SPLIT;
|
||||
}
|
||||
else {
|
||||
if (tmu != FX_TMU1) {
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
if (fxMesa->haveTwoTMUs) {
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_ZERO,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_ZERO,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
}
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_ZERO;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
|
||||
fxMesa->tmuSrc = FX_TMU0;
|
||||
}
|
||||
else {
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
|
||||
/* GR_COMBINE_FUNCTION_SCALE_OTHER doesn't work ?!? */
|
||||
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
GR_COMBINE_FUNCTION_BLEND,
|
||||
GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE);
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_ONE;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE;
|
||||
|
||||
fxMesa->tmuSrc = FX_TMU1;
|
||||
}
|
||||
}
|
||||
|
||||
grTexCombine(GR_TMU0,
|
||||
tex0.FunctionRGB,
|
||||
tex0.FactorRGB,
|
||||
tex0.FunctionAlpha,
|
||||
tex0.FactorAlpha,
|
||||
tex0.InvertRGB,
|
||||
tex0.InvertAlpha);
|
||||
if (fxMesa->haveTwoTMUs) {
|
||||
grTexCombine(GR_TMU1,
|
||||
tex1.FunctionRGB,
|
||||
tex1.FactorRGB,
|
||||
tex1.FunctionAlpha,
|
||||
tex1.FactorAlpha,
|
||||
tex1.InvertRGB,
|
||||
tex1.InvertAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
fxSetupTextureSingleTMU_NoLock(GLcontext * ctx, GLuint textureset)
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
struct tdfx_combine alphaComb, colorComb;
|
||||
GrCombineLocal_t localc, locala;
|
||||
GLuint unitsmode;
|
||||
GLint ifmt;
|
||||
@ -503,59 +518,115 @@ fxSetupTextureSingleTMU_NoLock(GLcontext * ctx, GLuint textureset)
|
||||
fprintf(stderr, "%s: envmode is %s\n", __FUNCTION__,
|
||||
_mesa_lookup_enum_by_nr(ctx->Texture.Unit[textureset].EnvMode));
|
||||
|
||||
alphaComb.Local = locala;
|
||||
alphaComb.Invert = FXFALSE;
|
||||
colorComb.Local = localc;
|
||||
colorComb.Invert = FXFALSE;
|
||||
|
||||
switch (ctx->Texture.Unit[textureset].EnvMode) {
|
||||
case GL_DECAL:
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
locala, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
|
||||
grColorCombine(GR_COMBINE_FUNCTION_BLEND,
|
||||
GR_COMBINE_FACTOR_TEXTURE_ALPHA,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_BLEND;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_TEXTURE_ALPHA;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
|
||||
if (ifmt == GL_ALPHA)
|
||||
grColorCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
localc, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
else
|
||||
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
if (ifmt == GL_ALPHA) {
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
} else {
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
}
|
||||
break;
|
||||
case GL_BLEND:
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER)
|
||||
fprintf(stderr, "%s: GL_BLEND not yet supported\n", __FUNCTION__);
|
||||
/*
|
||||
* XXX we can't do real GL_BLEND mode. These settings assume that
|
||||
* the TexEnv color is black and incoming fragment color is white.
|
||||
*/
|
||||
if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) {
|
||||
/* Av = Af */
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
}
|
||||
else if (ifmt == GL_INTENSITY) {
|
||||
/* Av = Af * (1 - It) + Ac * It */
|
||||
/* XXX this is wrong */
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
}
|
||||
else {
|
||||
/* Av = Af * At */
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
}
|
||||
if (ifmt == GL_ALPHA) {
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
}
|
||||
else {
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_ONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
colorComb.Invert = FXTRUE;
|
||||
}
|
||||
/* XXX return GL_FALSE for modes we don't support */
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s: GL_BLEND not quite supported\n", __FUNCTION__);
|
||||
}
|
||||
break;
|
||||
case GL_REPLACE:
|
||||
if ((ifmt == GL_RGB) || (ifmt == GL_LUMINANCE))
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
locala, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
else
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
if ((ifmt == GL_RGB) || (ifmt == GL_LUMINANCE)) {
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
} else {
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_ONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
}
|
||||
|
||||
if (ifmt == GL_ALPHA)
|
||||
grColorCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
localc, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
else
|
||||
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
if (ifmt == GL_ALPHA) {
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
} else {
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_ONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER)
|
||||
if (TDFX_DEBUG & VERBOSE_DRIVER) {
|
||||
fprintf(stderr, "%s: %x Texture.EnvMode not yet supported\n", __FUNCTION__,
|
||||
ctx->Texture.Unit[textureset].EnvMode);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
grAlphaCombine(alphaComb.Function,
|
||||
alphaComb.Factor,
|
||||
alphaComb.Local,
|
||||
alphaComb.Other,
|
||||
alphaComb.Invert);
|
||||
grColorCombine(colorComb.Function,
|
||||
colorComb.Factor,
|
||||
colorComb.Local,
|
||||
colorComb.Other,
|
||||
colorComb.Invert);
|
||||
}
|
||||
|
||||
#if 00
|
||||
@ -715,6 +786,8 @@ static void
|
||||
fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx)
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
struct tdfx_combine alphaComb, colorComb;
|
||||
struct tdfx_texcombine tex0, tex1;
|
||||
GrCombineLocal_t localc, locala;
|
||||
tfxTexInfo *ti0, *ti1;
|
||||
struct gl_texture_object *tObj0 = ctx->Texture.Unit[0].Current2D;
|
||||
@ -769,6 +842,16 @@ fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx)
|
||||
tmu1 = 0;
|
||||
}
|
||||
fxMesa->tmuSrc = FX_TMU_BOTH;
|
||||
|
||||
tex0.InvertRGB = FXFALSE;
|
||||
tex0.InvertAlpha = FXFALSE;
|
||||
tex1.InvertRGB = FXFALSE;
|
||||
tex1.InvertAlpha = FXFALSE;
|
||||
alphaComb.Local = locala;
|
||||
alphaComb.Invert = FXFALSE;
|
||||
colorComb.Local = localc;
|
||||
colorComb.Invert = FXFALSE;
|
||||
|
||||
switch (envmode) {
|
||||
case (FX_UM_E0_MODULATE | FX_UM_E1_MODULATE):
|
||||
{
|
||||
@ -777,120 +860,111 @@ fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx)
|
||||
isalpha[tmu0] = (ti0->baseLevelInternalFormat == GL_ALPHA);
|
||||
isalpha[tmu1] = (ti1->baseLevelInternalFormat == GL_ALPHA);
|
||||
|
||||
if (isalpha[FX_TMU1])
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_ZERO,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXTRUE, FXFALSE);
|
||||
else
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
if (isalpha[FX_TMU1]) {
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.InvertRGB = FXTRUE;
|
||||
} else {
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
}
|
||||
|
||||
if (isalpha[FX_TMU0])
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE);
|
||||
else
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE);
|
||||
if (isalpha[FX_TMU0]) {
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_ONE;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
|
||||
} else {
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
|
||||
}
|
||||
|
||||
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
break;
|
||||
}
|
||||
case (FX_UM_E0_REPLACE | FX_UM_E1_BLEND): /* Only for GLQuake */
|
||||
if (tmu1 == FX_TMU1) {
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXTRUE, FXFALSE);
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.InvertRGB = FXTRUE;
|
||||
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE);
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
|
||||
}
|
||||
else {
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE_MINUS_LOCAL,
|
||||
FXFALSE, FXFALSE);
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;
|
||||
}
|
||||
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
locala, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
|
||||
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_ONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
break;
|
||||
case (FX_UM_E0_REPLACE | FX_UM_E1_MODULATE): /* Quake 2 and 3 */
|
||||
if (tmu1 == FX_TMU1) {
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_ZERO,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXTRUE);
|
||||
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE);
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_ZERO;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.InvertAlpha = FXTRUE;
|
||||
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL;
|
||||
}
|
||||
else {
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
GR_COMBINE_FUNCTION_BLEND_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE);
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE;
|
||||
}
|
||||
|
||||
if (ti0->baseLevelInternalFormat == GL_RGB)
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
locala, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
else
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
locala, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
if (ti0->baseLevelInternalFormat == GL_RGB) {
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_NONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
} else {
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_ONE;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_NONE;
|
||||
}
|
||||
|
||||
|
||||
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_ONE;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
break;
|
||||
|
||||
|
||||
@ -901,45 +975,69 @@ fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx)
|
||||
isalpha[tmu0] = (ti0->baseLevelInternalFormat == GL_ALPHA);
|
||||
isalpha[tmu1] = (ti1->baseLevelInternalFormat == GL_ALPHA);
|
||||
|
||||
if (isalpha[FX_TMU1])
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_ZERO,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXTRUE, FXFALSE);
|
||||
else
|
||||
grTexCombine(GR_TMU1,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE);
|
||||
if (isalpha[FX_TMU1]) {
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_ZERO;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.InvertRGB = FXTRUE;
|
||||
} else {
|
||||
tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorRGB = GR_COMBINE_FACTOR_NONE;
|
||||
tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;
|
||||
tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE;
|
||||
}
|
||||
|
||||
if (isalpha[FX_TMU0])
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
|
||||
GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE);
|
||||
else
|
||||
grTexCombine(GR_TMU0,
|
||||
GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
|
||||
GR_COMBINE_FACTOR_ONE,
|
||||
GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,
|
||||
GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE);
|
||||
if (isalpha[FX_TMU0]) {
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_ONE;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE;
|
||||
} else {
|
||||
tex0.FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
|
||||
tex0.FactorRGB = GR_COMBINE_FACTOR_ONE;
|
||||
tex0.FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL;
|
||||
tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE;
|
||||
}
|
||||
|
||||
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
colorComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
colorComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
|
||||
GR_COMBINE_FACTOR_LOCAL,
|
||||
locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE);
|
||||
alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;
|
||||
alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;
|
||||
alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
fprintf(stderr, "%s: Unexpected dual texture mode encountered\n", __FUNCTION__);
|
||||
break;
|
||||
return;
|
||||
}
|
||||
|
||||
grAlphaCombine(alphaComb.Function,
|
||||
alphaComb.Factor,
|
||||
alphaComb.Local,
|
||||
alphaComb.Other,
|
||||
alphaComb.Invert);
|
||||
grColorCombine(colorComb.Function,
|
||||
colorComb.Factor,
|
||||
colorComb.Local,
|
||||
colorComb.Other,
|
||||
colorComb.Invert);
|
||||
grTexCombine(GR_TMU0,
|
||||
tex0.FunctionRGB,
|
||||
tex0.FactorRGB,
|
||||
tex0.FunctionAlpha,
|
||||
tex0.FactorAlpha,
|
||||
tex0.InvertRGB,
|
||||
tex0.InvertAlpha);
|
||||
grTexCombine(GR_TMU1,
|
||||
tex1.FunctionRGB,
|
||||
tex1.FactorRGB,
|
||||
tex1.FunctionAlpha,
|
||||
tex1.FactorAlpha,
|
||||
tex1.InvertRGB,
|
||||
tex1.InvertAlpha);
|
||||
}
|
||||
|
||||
/************************* No Texture ***************************/
|
||||
@ -967,12 +1065,16 @@ fxSetupTextureNone_NoLock(GLcontext * ctx)
|
||||
localc = GR_COMBINE_LOCAL_CONSTANT;
|
||||
|
||||
grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
locala, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
locala,
|
||||
GR_COMBINE_OTHER_NONE,
|
||||
FXFALSE);
|
||||
|
||||
grColorCombine(GR_COMBINE_FUNCTION_LOCAL,
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
localc, GR_COMBINE_OTHER_NONE, FXFALSE);
|
||||
GR_COMBINE_FACTOR_NONE,
|
||||
localc,
|
||||
GR_COMBINE_OTHER_NONE,
|
||||
FXFALSE);
|
||||
|
||||
fxMesa->lastUnitsMode = FX_UM_NONE;
|
||||
}
|
||||
@ -1336,25 +1438,6 @@ fxSetupStencil (GLcontext * ctx)
|
||||
/**************************** Color Mask SetUp **************************/
|
||||
/************************************************************************/
|
||||
|
||||
void fxColorMask (fxMesaContext fxMesa, GLboolean enable)
|
||||
{
|
||||
/* These are used in calls to FX_grColorMask() */
|
||||
static const FxBool false4[4] = { FXFALSE, FXFALSE, FXFALSE, FXFALSE };
|
||||
static const FxBool true4[4] = { FXTRUE, FXTRUE, FXTRUE, FXTRUE };
|
||||
|
||||
const FxBool *rgba = enable ? true4 : false4;
|
||||
|
||||
if (fxMesa->colDepth != 16) {
|
||||
/* 32bpp mode or 15bpp mode */
|
||||
fxMesa->Glide.grColorMaskExt(rgba[RCOMP], rgba[GCOMP],
|
||||
rgba[BCOMP], rgba[ACOMP] && fxMesa->haveHwAlpha);
|
||||
}
|
||||
else {
|
||||
/* 16 bpp mode */
|
||||
grColorMask(rgba[RCOMP] || rgba[GCOMP] || rgba[BCOMP], rgba[ACOMP] && fxMesa->haveHwAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
fxDDColorMask(GLcontext * ctx,
|
||||
GLboolean r, GLboolean g, GLboolean b, GLboolean a)
|
||||
@ -1367,16 +1450,24 @@ fxDDColorMask(GLcontext * ctx,
|
||||
(void) a;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
fxSetupColorMask(GLcontext * ctx)
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
|
||||
if (ctx->Color.DrawBuffer == GL_NONE) {
|
||||
fxColorMask(fxMesa, GL_FALSE);
|
||||
if (fxMesa->colDepth != 16) {
|
||||
/* 32bpp mode or 15bpp mode */
|
||||
fxMesa->Glide.grColorMaskExt(ctx->Color.ColorMask[RCOMP],
|
||||
ctx->Color.ColorMask[GCOMP],
|
||||
ctx->Color.ColorMask[BCOMP],
|
||||
ctx->Color.ColorMask[ACOMP] && fxMesa->haveHwAlpha);
|
||||
}
|
||||
else {
|
||||
fxColorMask(fxMesa, GL_TRUE);
|
||||
/* 16 bpp mode */
|
||||
grColorMask(ctx->Color.ColorMask[RCOMP] ||
|
||||
ctx->Color.ColorMask[GCOMP] ||
|
||||
ctx->Color.ColorMask[BCOMP],
|
||||
ctx->Color.ColorMask[ACOMP] && fxMesa->haveHwAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1453,30 +1544,34 @@ fxSetScissorValues(GLcontext * ctx)
|
||||
{
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
int xmin, xmax;
|
||||
int ymin, ymax, check;
|
||||
int ymin, ymax;
|
||||
|
||||
if (ctx->Scissor.Enabled) {
|
||||
xmin = ctx->Scissor.X;
|
||||
xmax = ctx->Scissor.X + ctx->Scissor.Width;
|
||||
ymin = ctx->Scissor.Y;
|
||||
ymax = ctx->Scissor.Y + ctx->Scissor.Height;
|
||||
check = 1;
|
||||
|
||||
if (xmin < 0)
|
||||
xmin = 0;
|
||||
if (xmax > fxMesa->width)
|
||||
xmax = fxMesa->width;
|
||||
if (ymin < fxMesa->screen_height - fxMesa->height)
|
||||
ymin = fxMesa->screen_height - fxMesa->height;
|
||||
if (ymax > fxMesa->screen_height - 0)
|
||||
ymax = fxMesa->screen_height - 0;
|
||||
}
|
||||
else {
|
||||
xmin = 0;
|
||||
ymin = 0;
|
||||
xmax = fxMesa->width;
|
||||
ymax = fxMesa->height;
|
||||
check = 0;
|
||||
}
|
||||
if (xmin < fxMesa->clipMinX)
|
||||
xmin = fxMesa->clipMinX;
|
||||
if (xmax > fxMesa->clipMaxX)
|
||||
xmax = fxMesa->clipMaxX;
|
||||
if (ymin < fxMesa->screen_height - fxMesa->clipMaxY)
|
||||
ymin = fxMesa->screen_height - fxMesa->clipMaxY;
|
||||
if (ymax > fxMesa->screen_height - fxMesa->clipMinY)
|
||||
ymax = fxMesa->screen_height - fxMesa->clipMinY;
|
||||
|
||||
fxMesa->clipMinX = xmin;
|
||||
fxMesa->clipMinY = ymin;
|
||||
fxMesa->clipMaxX = xmax;
|
||||
fxMesa->clipMaxY = ymax;
|
||||
grClipWindow(xmin, ymin, xmax, ymax);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxtexman.c,v 1.17 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxtexman.c,v 1.18 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -45,6 +45,7 @@
|
||||
#include "fxdrv.h"
|
||||
|
||||
int texSwaps = 0;
|
||||
static FxU32 texBoundMask;
|
||||
|
||||
#define FX_2MB_SPLIT 0x200000
|
||||
|
||||
@ -120,30 +121,37 @@ fxTMNewRangeNode(fxMesaContext fxMesa, FxU32 start, FxU32 end)
|
||||
fxCloseHardware();
|
||||
exit(-1);
|
||||
}
|
||||
result->next = NULL;
|
||||
}
|
||||
result->startAddr = start;
|
||||
result->endAddr = end;
|
||||
return result;
|
||||
}
|
||||
|
||||
#if 1
|
||||
#define fxTMDeleteRangeNode(fxMesa, range) \
|
||||
do { \
|
||||
range->next = fxMesa->tmPool; \
|
||||
fxMesa->tmPool = range; \
|
||||
} while (0);
|
||||
#else
|
||||
static void
|
||||
fxTMDeleteRangeNode(fxMesaContext fxMesa, MemRange * range)
|
||||
{
|
||||
range->next = fxMesa->tmPool;
|
||||
fxMesa->tmPool = range;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
fxTMUInit(fxMesaContext fxMesa, int tmu)
|
||||
{
|
||||
MemRange *tmn, *last;
|
||||
FxU32 start, end, blockstart, blockend, boundary;
|
||||
FxU32 start, end, blockstart, blockend, chunk;
|
||||
|
||||
start = grTexMinAddress(tmu);
|
||||
end = grTexMaxAddress(tmu);
|
||||
|
||||
boundary = (fxMesa->type >= GR_SSTTYPE_Banshee) ? (end - start) : FX_2MB_SPLIT;
|
||||
chunk = (fxMesa->type >= GR_SSTTYPE_Banshee) ? (end - start) : FX_2MB_SPLIT;
|
||||
|
||||
if (fxMesa->verbose) {
|
||||
fprintf(stderr, "Voodoo %s configuration:\n",
|
||||
@ -152,7 +160,7 @@ fxTMUInit(fxMesaContext fxMesa, int tmu)
|
||||
(unsigned int) start);
|
||||
fprintf(stderr, "Voodoo Higher texture memory address (%u)\n",
|
||||
(unsigned int) end);
|
||||
fprintf(stderr, "Voodoo Splitting Texture memory in %luMB blocks:\n", boundary >> 20);
|
||||
fprintf(stderr, "Voodoo Splitting Texture memory in %luMB blocks:\n", chunk >> 20);
|
||||
}
|
||||
|
||||
fxMesa->freeTexMem[tmu] = end - start;
|
||||
@ -161,16 +169,18 @@ fxTMUInit(fxMesaContext fxMesa, int tmu)
|
||||
last = 0;
|
||||
blockstart = start;
|
||||
while (blockstart < end) {
|
||||
if (blockstart + boundary > end)
|
||||
if (blockstart + chunk > end)
|
||||
blockend = end;
|
||||
else
|
||||
blockend = blockstart + boundary;
|
||||
blockend = blockstart + chunk;
|
||||
|
||||
if (fxMesa->verbose)
|
||||
fprintf(stderr, "Voodoo %07u-%07u\n",
|
||||
(unsigned int) blockstart, (unsigned int) blockend);
|
||||
|
||||
tmn = fxTMNewRangeNode(fxMesa, blockstart, blockend);
|
||||
tmn->next = NULL;
|
||||
|
||||
|
||||
if (last)
|
||||
last->next = tmn;
|
||||
@ -178,7 +188,7 @@ fxTMUInit(fxMesaContext fxMesa, int tmu)
|
||||
fxMesa->tmFree[tmu] = tmn;
|
||||
last = tmn;
|
||||
|
||||
blockstart += boundary;
|
||||
blockstart += chunk;
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,7 +239,6 @@ static void
|
||||
fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange * range)
|
||||
{
|
||||
MemRange *tmp, *prev;
|
||||
FxU32 boundary = (fxMesa->type >= GR_SSTTYPE_Banshee) ? -1 : (FX_2MB_SPLIT - 1);
|
||||
|
||||
if (range->startAddr == range->endAddr) {
|
||||
fxTMDeleteRangeNode(fxMesa, range);
|
||||
@ -252,7 +261,7 @@ fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange * range)
|
||||
range->next = tmp;
|
||||
if (tmp) {
|
||||
if (range->endAddr == tmp->startAddr
|
||||
&& tmp->startAddr & boundary) {
|
||||
&& tmp->startAddr & texBoundMask) {
|
||||
/* Combine */
|
||||
tmp->startAddr = range->startAddr;
|
||||
fxTMDeleteRangeNode(fxMesa, range);
|
||||
@ -261,7 +270,7 @@ fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange * range)
|
||||
}
|
||||
if (prev) {
|
||||
if (prev->endAddr == range->startAddr
|
||||
&& range->startAddr & boundary) {
|
||||
&& range->startAddr & texBoundMask) {
|
||||
/* Combine */
|
||||
prev->endAddr = range->endAddr;
|
||||
prev->next = range->next;
|
||||
@ -312,7 +321,7 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu)
|
||||
}
|
||||
|
||||
/* examine priority */
|
||||
if (obj->Priority < lowestPriority) {
|
||||
if (tmp->Priority < lowestPriority) {
|
||||
lowestPriority = tmp->Priority;
|
||||
lowestPriorityObj = tmp;
|
||||
}
|
||||
@ -320,8 +329,7 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu)
|
||||
tmp = tmp->Next;
|
||||
}
|
||||
|
||||
if (lowestPriority < 1.0) {
|
||||
ASSERT(lowestPriorityObj);
|
||||
if (lowestPriorityObj != NULL) {
|
||||
if (TDFX_DEBUG & VERBOSE_TEXTURE) {
|
||||
fprintf(stderr, "fxTMFindOldestObject: %d pri=%f\n", lowestPriorityObj->Name, lowestPriority);
|
||||
}
|
||||
@ -753,6 +761,8 @@ fxTMInit(fxMesaContext fxMesa)
|
||||
|
||||
if (fxMesa->haveTwoTMUs)
|
||||
fxTMUInit(fxMesa, FX_TMU1);
|
||||
|
||||
texBoundMask = (fxMesa->type >= GR_SSTTYPE_Banshee) ? -1 : (FX_2MB_SPLIT - 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxtris.c,v 1.24 2003/10/02 17:36:44 brianp Exp $ */
|
||||
/* $Id: fxtris.c,v 1.25 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -1097,8 +1097,6 @@ static GLenum reduced_prim[GL_POLYGON+1] = {
|
||||
*/
|
||||
static void fxRasterPrimitive( GLcontext *ctx, GLenum prim )
|
||||
{
|
||||
extern void fxSetupCull (GLcontext *ctx);
|
||||
|
||||
fxMesaContext fxMesa = FX_CONTEXT( ctx );
|
||||
|
||||
fxMesa->raster_primitive = prim;
|
||||
@ -1176,7 +1174,7 @@ void fxCheckIsInHardware( GLcontext *ctx )
|
||||
if (newfallback) {
|
||||
if (oldfallback == 0) {
|
||||
if (fxMesa->verbose) {
|
||||
fprintf(stderr, "Voodoo ! begin SW 0x08%x %s\n", newfallback, getFallbackString(newfallback));
|
||||
fprintf(stderr, "Voodoo ! begin SW 0x%08x %s\n", newfallback, getFallbackString(newfallback));
|
||||
}
|
||||
_swsetup_Wakeup( ctx );
|
||||
}
|
||||
@ -1197,7 +1195,7 @@ void fxCheckIsInHardware( GLcontext *ctx )
|
||||
fxChooseVertexState(ctx);
|
||||
fxDDChooseRenderState(ctx);
|
||||
if (fxMesa->verbose) {
|
||||
fprintf(stderr, "Voodoo ! end SW 0x08%x %s\n", oldfallback, getFallbackString(oldfallback));
|
||||
fprintf(stderr, "Voodoo ! end SW 0x%08x %s\n", oldfallback, getFallbackString(oldfallback));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxvb.c,v 1.19 2003/10/02 17:36:45 brianp Exp $ */
|
||||
/* $Id: fxvb.c,v 1.20 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -118,7 +118,7 @@ static void interp_extras( GLcontext *ctx,
|
||||
GET_COLOR(VB->ColorPtr[1], dst),
|
||||
GET_COLOR(VB->ColorPtr[1], out),
|
||||
GET_COLOR(VB->ColorPtr[1], in) );
|
||||
#if 0 /* [dBorca] leaving disabled for now */
|
||||
#if 1 /* [dBorca] GL_EXT_separate_specular_color */
|
||||
if (VB->SecondaryColorPtr[1]) {
|
||||
INTERP_3CHAN( t,
|
||||
GET_COLOR(VB->SecondaryColorPtr[1], dst),
|
||||
@ -143,7 +143,7 @@ static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src )
|
||||
if (VB->ColorPtr[1]) {
|
||||
COPY_CHAN4( GET_COLOR(VB->ColorPtr[1], dst),
|
||||
GET_COLOR(VB->ColorPtr[1], src) );
|
||||
#if 0 /* [dBorca] leaving disabled for now */
|
||||
#if 1 /* [dBorca] GL_EXT_separate_specular_color */
|
||||
if (VB->SecondaryColorPtr[1]) {
|
||||
COPY_CHAN4( GET_COLOR(VB->SecondaryColorPtr[1], dst),
|
||||
GET_COLOR(VB->SecondaryColorPtr[1], src) );
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: fxvbtmp.h,v 1.13 2003/10/02 17:36:45 brianp Exp $ */
|
||||
/* $Id: fxvbtmp.h,v 1.14 2003/10/09 15:12:21 dborca Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@ -29,6 +29,10 @@
|
||||
*/
|
||||
|
||||
|
||||
#define VIEWPORT_X(dst,x) dst = s[0] * x + s[12]
|
||||
#define VIEWPORT_Y(dst,y) dst = s[5] * y + s[13]
|
||||
#define VIEWPORT_Z(dst,z) dst = s[10] * z + s[14]
|
||||
|
||||
static void TAG(emit)( GLcontext *ctx,
|
||||
GLuint start, GLuint end,
|
||||
void *dest )
|
||||
@ -89,9 +93,9 @@ static void TAG(emit)( GLcontext *ctx,
|
||||
if (IND & SETUP_XYZW) {
|
||||
if (mask[i] == 0) {
|
||||
/* unclipped */
|
||||
v->x = s[0] * proj[0][0] + s[12];
|
||||
v->y = s[5] * proj[0][1] + s[13];
|
||||
v->ooz = s[10] * proj[0][2] + s[14];
|
||||
VIEWPORT_X(v->x, proj[0][0]);
|
||||
VIEWPORT_Y(v->y, proj[0][1]);
|
||||
VIEWPORT_Z(v->ooz, proj[0][2]);
|
||||
v->oow = proj[0][3];
|
||||
} else {
|
||||
/* clipped */
|
||||
@ -122,32 +126,24 @@ static void TAG(emit)( GLcontext *ctx,
|
||||
}
|
||||
if (IND & SETUP_TMU0) {
|
||||
GLfloat w = v->oow;
|
||||
v->tmuvtx[0].sow = tc0[0][0] * u0scale * w;
|
||||
v->tmuvtx[0].tow = tc0[0][1] * v0scale * w;
|
||||
if (IND & SETUP_PTEX) {
|
||||
v->tmuvtx[0].sow = tc0[0][0] * u0scale * w;
|
||||
v->tmuvtx[0].tow = tc0[0][1] * v0scale * w;
|
||||
v->tmuvtx[0].oow = w;
|
||||
if (tc0_size == 4)
|
||||
v->tmuvtx[0].oow = tc0[0][3] * w;
|
||||
}
|
||||
else {
|
||||
v->tmuvtx[0].sow = tc0[0][0] * u0scale * w;
|
||||
v->tmuvtx[0].tow = tc0[0][1] * v0scale * w;
|
||||
v->tmuvtx[0].oow *= tc0[0][3];
|
||||
}
|
||||
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
|
||||
}
|
||||
if (IND & SETUP_TMU1) {
|
||||
GLfloat w = v->oow;
|
||||
v->tmuvtx[1].sow = tc1[0][0] * u1scale * w;
|
||||
v->tmuvtx[1].tow = tc1[0][1] * v1scale * w;
|
||||
if (IND & SETUP_PTEX) {
|
||||
v->tmuvtx[1].sow = tc1[0][0] * u1scale * w;
|
||||
v->tmuvtx[1].tow = tc1[0][1] * v1scale * w;
|
||||
v->tmuvtx[1].oow = w;
|
||||
if (tc1_size == 4)
|
||||
v->tmuvtx[1].oow = tc1[0][3] * w;
|
||||
v->tmuvtx[1].oow *= tc1[0][3];
|
||||
}
|
||||
else {
|
||||
v->tmuvtx[1].sow = tc1[0][0] * u1scale * w;
|
||||
v->tmuvtx[1].tow = tc1[0][1] * v1scale * w;
|
||||
}
|
||||
tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + tc1_stride);
|
||||
}
|
||||
}
|
||||
@ -197,9 +193,9 @@ static void TAG(interp)( GLcontext *ctx,
|
||||
const GLfloat wout = 1.0F / out->oow;
|
||||
const GLfloat win = 1.0F / in->oow;
|
||||
|
||||
dst->x = s[0] * dstclip[0] * oow + s[12];
|
||||
dst->y = s[5] * dstclip[1] * oow + s[13];
|
||||
dst->ooz = s[10] * dstclip[2] * oow + s[14];
|
||||
VIEWPORT_X(dst->x, dstclip[0] * oow);
|
||||
VIEWPORT_Y(dst->y, dstclip[1] * oow);
|
||||
VIEWPORT_Z(dst->ooz, dstclip[2] * oow);
|
||||
dst->oow = oow;
|
||||
|
||||
if (IND & SETUP_SNAP) {
|
||||
|
Loading…
Reference in New Issue
Block a user