On Fri, 7 Feb 2003, Keith Whitwell wrote: > >> I don't have a local copy of the mesa-4.0.4 branch. Could somebody > >> commit this change to that tree? It's a pretty easy fix & should make > >> Linus happy. :) > > > > > > I'll do it. > > Actually, I take that back - I don't have an r200 handy to test & the diff > didn't apply cleanly enough to "wing it"... > > Anyone else? > > Keith
Here's a hand-merged diff against mesa-4-0-4-branch. How does this look? -- Leif Delgass http://www.retinalburn.net
Index: r200_texstate.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_texstate.c,v retrieving revision 1.7 diff -u -r1.7 r200_texstate.c --- r200_texstate.c 5 Nov 2002 21:19:50 -0000 1.7 +++ r200_texstate.c 7 Feb 2003 21:41:52 -0000 @@ -47,6 +47,7 @@ #include "mmath.h" #include "simple_list.h" #include "texformat.h" +#include "enums.h" static void r200SetTexImages( r200ContextPtr rmesa, @@ -702,16 +703,19 @@ { r200ContextPtr rmesa = R200_CONTEXT(ctx); const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; + const struct gl_texture_object *tObj = texUnit->_Current; + const GLenum format = tObj->Image[tObj->BaseLevel]->Format; GLuint color_combine, alpha_combine; GLuint color_scale = rmesa->hw.pix[unit].cmd[PIX_PP_TXCBLEND2]; GLuint alpha_scale = rmesa->hw.pix[unit].cmd[PIX_PP_TXABLEND2]; if ( R200_DEBUG & DEBUG_TEXTURE ) { - fprintf( stderr, "%s( %p, %d )\n", __FUNCTION__, ctx, unit ); + fprintf( stderr, "%s( %p, %d ) format=%s\n", __FUNCTION__, + ctx, unit, _mesa_lookup_enum_by_nr( format ) ); } /* Set the texture environment state. Isn't this nice and clean? - * The R200 will automagically set the texture alpha to 0xff when + * The chip will automagically set the texture alpha to 0xff when * the texture format does not include an alpha component. This * reduces the amount of special-casing we have to do, alpha-only * textures being a notable exception. @@ -729,6 +733,8 @@ const GLenum format = tObj->Image[tObj->BaseLevel]->Format; GLuint color_arg[3], alpha_arg[3]; GLuint i, numColorArgs = 0, numAlphaArgs = 0; + GLuint RGBshift = texUnit->CombineScaleShiftRGB; + GLuint Ashift = texUnit->CombineScaleShiftA; switch ( texUnit->EnvMode ) { case GL_REPLACE: @@ -867,6 +873,8 @@ case GL_SUBTRACT: case GL_DOT3_RGB: case GL_DOT3_RGBA: + case GL_DOT3_RGB_EXT: + case GL_DOT3_RGBA_EXT: numColorArgs = 2; break; case GL_INTERPOLATE: @@ -880,10 +888,10 @@ case GL_REPLACE: numAlphaArgs = 1; break; - case GL_SUBTRACT: case GL_MODULATE: case GL_ADD: case GL_ADD_SIGNED: + case GL_SUBTRACT: numAlphaArgs = 2; break; case GL_INTERPOLATE: @@ -969,14 +977,6 @@ R200_COLOR_ARG( 0, A ); R200_COLOR_ARG( 1, C ); break; - case GL_SUBTRACT: - color_combine = (R200_TXC_ARG_B_ZERO | - R200_TXC_COMP_ARG_B | - R200_TXC_NEG_ARG_C | - R200_TXC_OP_MADD); - R200_COLOR_ARG( 0, A ); - R200_COLOR_ARG( 1, C ); - break; case GL_ADD_SIGNED: color_combine = (R200_TXC_ARG_B_ZERO | R200_TXC_COMP_ARG_B | @@ -985,16 +985,46 @@ R200_COLOR_ARG( 0, A ); R200_COLOR_ARG( 1, C ); break; + case GL_SUBTRACT: + color_combine = (R200_TXC_ARG_B_ZERO | + R200_TXC_COMP_ARG_B | + R200_TXC_NEG_ARG_C | + R200_TXC_OP_MADD); + R200_COLOR_ARG( 0, A ); + R200_COLOR_ARG( 1, C ); + break; case GL_INTERPOLATE: color_combine = (R200_TXC_OP_LERP); R200_COLOR_ARG( 0, B ); R200_COLOR_ARG( 1, A ); R200_COLOR_ARG( 2, C ); break; + + case GL_DOT3_RGB_EXT: + case GL_DOT3_RGBA_EXT: + RGBshift = 0; + Ashift = 0; + /* FALLTHROUGH */ + case GL_DOT3_RGB: case GL_DOT3_RGBA: + /* DOT3 works differently on R200 than on R100. On R100, just + * setting the DOT3 mode did everything for you. On R200, the + * driver has to enable the biasing (the -0.5 in the combine + * equation), and it has add the 4x scale factor. The hardware + * only supports up to 8x in the post filter, so 2x part of it + * happens on the inputs going into the combiner. + */ + + RGBshift++; + Ashift = RGBshift; + color_combine = (R200_TXC_ARG_C_ZERO | - R200_TXC_OP_DOT3); + R200_TXC_OP_DOT3 | + R200_TXC_BIAS_ARG_A | + R200_TXC_BIAS_ARG_B | + R200_TXC_SCALE_ARG_A | + R200_TXC_SCALE_ARG_B); R200_COLOR_ARG( 0, A ); R200_COLOR_ARG( 1, B ); break; @@ -1022,19 +1052,19 @@ R200_ALPHA_ARG( 0, A ); R200_ALPHA_ARG( 1, C ); break; - case GL_SUBTRACT: + case GL_ADD_SIGNED: alpha_combine = (R200_TXA_ARG_B_ZERO | R200_TXC_COMP_ARG_B | - R200_TXC_NEG_ARG_C | - R200_TXA_OP_MADD); + R200_TXC_BIAS_ARG_C | /* new */ + R200_TXA_OP_MADD); /* was ADDSIGNED */ R200_ALPHA_ARG( 0, A ); R200_ALPHA_ARG( 1, C ); break; - case GL_ADD_SIGNED: + case GL_SUBTRACT: alpha_combine = (R200_TXA_ARG_B_ZERO | R200_TXC_COMP_ARG_B | - R200_TXC_BIAS_ARG_C | /* new */ - R200_TXA_OP_MADD); /* was ADDSIGNED */ + R200_TXC_NEG_ARG_C | + R200_TXA_OP_MADD); R200_ALPHA_ARG( 0, A ); R200_ALPHA_ARG( 1, C ); break; @@ -1048,28 +1078,20 @@ return; } - if ( texUnit->CombineModeRGB == GL_DOT3_RGB ) { + if ( (texUnit->CombineModeRGB == GL_DOT3_RGB_EXT) + || (texUnit->CombineModeRGB == GL_DOT3_RGB) ) { alpha_combine |= R200_TXA_DOT_ALPHA; } /* Step 3: - * Apply the scale factor. The EXT extension has a somewhat - * unnecessary restriction that the scale must be 4x. The ARB - * extension will likely drop this and we can just apply the - * scale factors regardless. + * Apply the scale factor. The EXT version of the DOT3 extension does + * not support the scale factor, but the ARB version (and the version in + * OpenGL 1.3) does. */ color_scale &= ~R200_TXC_SCALE_MASK; alpha_scale &= ~R200_TXA_SCALE_MASK; - if ( texUnit->CombineModeRGB != GL_DOT3_RGB && - texUnit->CombineModeRGB != GL_DOT3_RGBA ) { - color_scale |= texUnit->CombineScaleShiftRGB<< R200_TXC_SCALE_SHIFT; - alpha_scale |= texUnit->CombineScaleShiftA << R200_TXA_SCALE_SHIFT; - } - else - { - color_scale |= R200_TXC_SCALE_4X; - alpha_scale |= R200_TXA_SCALE_4X; - } + color_scale |= (RGBshift << R200_TXC_SCALE_SHIFT); + alpha_scale |= (Ashift << R200_TXA_SCALE_SHIFT); /* All done! */