Fixed TexEnv modes GL_BLEND and GL_ADD on Savage4-based cards. Disabled

the use of hardware texture format I8 as it produces garbage at least on
ProSavageDDR.
This commit is contained in:
Felix Kuehling 2005-04-21 21:43:21 +00:00
parent b3474de7b5
commit 07d91bbb59
3 changed files with 71 additions and 24 deletions

View File

@ -367,6 +367,7 @@ typedef enum
#define TBC_BlendInt0 0x00040004
#define TBC_BlendInt1 0x01c20e02
#define TBC_AddAlpha 0x19910c11
#define TBC_Add 0x18110c11
#define TBC_Decal1 0x00870410
#define TBC_Modul1 0x00870013
@ -376,6 +377,7 @@ typedef enum
#define TBC_Copy1 0x00870400
#define TBC_CopyAlpha1 0x00900400
#define TBC_AddAlpha1 0x19930c13
#define TBC_Add1 0x18130c13
/*
* derived from TexBlendCtrl

View File

@ -189,6 +189,7 @@ struct savage_context_t {
* completely on the fly:
*/
GLuint LcsCullMode;
GLuint texEnvColor;
/* Vertex state
*/

View File

@ -577,7 +577,9 @@ savageChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
return !force16bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444;
#if 0
/* TFT_I8 produces garbage on ProSavageDDR and subsequent texture
* disable keeps rendering garbage. Disabled for now. */
case GL_INTENSITY:
case GL_COMPRESSED_INTENSITY:
return isSavage4 ? &_mesa_texformat_i8 : (
@ -589,6 +591,18 @@ savageChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
case GL_INTENSITY16:
return isSavage4 ? &_mesa_texformat_i8 : (
!force16bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444);
#else
case GL_INTENSITY:
case GL_COMPRESSED_INTENSITY:
return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444;
case GL_INTENSITY4:
return &_mesa_texformat_argb4444;
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
return !force16bpt ? &_mesa_texformat_argb8888 :
&_mesa_texformat_argb4444;
#endif
/*
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
@ -818,12 +832,11 @@ static void savageUpdateTex0State_s4( GLcontext *ctx )
GLuint format;
/* disable */
if (ctx->Texture.Unit[0]._ReallyEnabled == 0) {
imesa->regs.s4.texDescr.ni.tex0En = GL_FALSE;
imesa->regs.s4.texBlendCtrl[0].ui = TBC_NoTexMap;
imesa->regs.s4.texCtrl[0].ui = 0x20f040;
imesa->regs.s4.texDescr.ni.tex0En = GL_FALSE;
imesa->regs.s4.texBlendCtrl[0].ui = TBC_NoTexMap;
imesa->regs.s4.texCtrl[0].ui = 0x20f040;
if (ctx->Texture.Unit[0]._ReallyEnabled == 0)
return;
}
tObj = ctx->Texture.Unit[0]._Current;
if ((ctx->Texture.Unit[0]._ReallyEnabled & ~(TEXTURE_1D_BIT|TEXTURE_2D_BIT))
@ -914,6 +927,7 @@ static void savageUpdateTex0State_s4( GLcontext *ctx )
break;
case GL_BLEND:
imesa->regs.s4.texBlendColor.ui = imesa->texEnvColor;
switch (format)
{
@ -983,12 +997,28 @@ static void savageUpdateTex0State_s4( GLcontext *ctx )
&imesa->regs.s4.texBlendCtrl[0]);
break;
/*
GL_ADD
*/
case GL_ADD:
imesa->regs.s4.texCtrl[0].ni.clrArg1Invert = GL_FALSE;
imesa->regs.s4.texBlendCtrl[0].ui = TBC_AddAlpha;
switch (format)
{
case GL_ALPHA:
imesa->regs.s4.texBlendCtrl[0].ui = TBC_ModulAlpha;
break;
case GL_LUMINANCE:
case GL_RGB:
imesa->regs.s4.texBlendCtrl[0].ui = TBC_Add;
break;
case GL_LUMINANCE_ALPHA:
case GL_RGBA:
imesa->regs.s4.texBlendCtrl[0].ui = TBC_Add;
break;
case GL_INTENSITY:
imesa->regs.s4.texBlendCtrl[0].ui = TBC_AddAlpha;
break;
}
__HWEnvCombineSingleUnitScale(imesa, 0, 0,
&imesa->regs.s4.texBlendCtrl[0]);
break;
@ -1083,13 +1113,12 @@ static void savageUpdateTex1State_s4( GLcontext *ctx )
return;
}
if (ctx->Texture.Unit[1]._ReallyEnabled == 0) {
imesa->regs.s4.texDescr.ni.tex1En = GL_FALSE;
imesa->regs.s4.texBlendCtrl[1].ui = TBC_NoTexMap1;
imesa->regs.s4.texCtrl[1].ui = 0x20f040;
imesa->regs.s4.texDescr.ni.texBLoopEn = GL_FALSE;
imesa->regs.s4.texDescr.ni.tex1En = GL_FALSE;
imesa->regs.s4.texBlendCtrl[1].ui = TBC_NoTexMap1;
imesa->regs.s4.texCtrl[1].ui = 0x20f040;
imesa->regs.s4.texDescr.ni.texBLoopEn = GL_FALSE;
if (ctx->Texture.Unit[1]._ReallyEnabled == 0)
return;
}
tObj = ctx->Texture.Unit[1]._Current;
@ -1150,13 +1179,30 @@ static void savageUpdateTex1State_s4( GLcontext *ctx )
__HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl);
break;
/*#if GL_EXT_texture_env_add*/
case GL_ADD:
imesa->regs.s4.texCtrl[1].ni.clrArg1Invert = GL_FALSE;
imesa->regs.s4.texBlendCtrl[1].ui = TBC_AddAlpha1;
switch (format)
{
case GL_ALPHA:
imesa->regs.s4.texBlendCtrl[1].ui = TBC_ModulAlpha1;
break;
case GL_LUMINANCE:
case GL_RGB:
imesa->regs.s4.texBlendCtrl[1].ui = TBC_Add1;
break;
case GL_LUMINANCE_ALPHA:
case GL_RGBA:
imesa->regs.s4.texBlendCtrl[1].ui = TBC_Add1;
break;
case GL_INTENSITY:
imesa->regs.s4.texBlendCtrl[1].ui = TBC_AddAlpha1;
break;
}
__HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl);
break;
/*#endif*/
#if GL_ARB_texture_env_combine
case GL_COMBINE_ARB:
@ -1497,16 +1543,14 @@ static void savageTexEnv( GLcontext *ctx, GLenum target,
struct gl_texture_unit *texUnit =
&ctx->Texture.Unit[ctx->Texture.CurrentUnit];
const GLfloat *fc = texUnit->EnvColor;
GLuint r, g, b, a, col;
GLuint r, g, b, a;
CLAMPED_FLOAT_TO_UBYTE(r, fc[0]);
CLAMPED_FLOAT_TO_UBYTE(g, fc[1]);
CLAMPED_FLOAT_TO_UBYTE(b, fc[2]);
CLAMPED_FLOAT_TO_UBYTE(a, fc[3]);
col = ((a << 24) |
(r << 16) |
(g << 8) |
(b << 0));
imesa->texEnvColor = ((a << 24) | (r << 16) |
(g << 8) | (b << 0));
}