Adam K Kirchhoff wrote:

Program received signal SIGSEGV, Segmentation fault.
r200UpdateTextureEnv (ctx=0x8391a38, unit=0) at r200_texstate.c:739
739        const GLenum format = tObj->Image[tObj->BaseLevel]->Format;
(gdb) bt
#0  r200UpdateTextureEnv (ctx=0x8391a38, unit=0) at r200_texstate.c:739
#1  0x40cc5419 in disable_tex (ctx=0x8391a38, unit=0) at
r200_texstate.c:1401
I finally got Marble Blast and was able to reproduce this. Unfortunatly, this was caused by some of my recent changes. :( The problem is that in if texture unit 1 is enabled and texture unit 0 is disabled, disable_tex will call r200UpdateTextureEnv to put it into a "pass through" mode. This is apparently as close as the r200 can get to disabling a texture unit. When the unit is disabled, texUnit->_Current will be NULL. Therefore, tObj will also be NULL.

In any case, here is a patch against the trunk that should fix the problem. I verified the fix by playing a few levels of Marble Blast. Cute game. It reminds me of Super Monkey Ball 2, but it's not quite as annoying. :)

This won't need to be applied to the mesa-4-0-4 branch as the problem was never introduced there.
Index: lib/GL/mesa/src/drv/r200/r200_texstate.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_texstate.c,v
retrieving revision 1.11
diff -u -d -r1.11 r200_texstate.c
--- lib/GL/mesa/src/drv/r200/r200_texstate.c    7 Feb 2003 20:07:03 -0000       1.11
+++ lib/GL/mesa/src/drv/r200/r200_texstate.c    13 Feb 2003 23:27:49 -0000
@@ -748,16 +748,18 @@
 {
    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];
 
+   /* texUnit->_Current can be NULL if and only if the texture unit is
+    * not actually enabled.
+    */
+   assert( (texUnit->_ReallyEnabled == 0)
+          || (texUnit->_Current != NULL) );
 
    if ( R200_DEBUG & DEBUG_TEXTURE ) {
-      fprintf( stderr, "%s( %p, %d ) format=%s\n", __FUNCTION__,
-              ctx, unit, _mesa_lookup_enum_by_nr( format ) );
+      fprintf( stderr, "%s( %p, %d )\n", __FUNCTION__, ctx, unit );
    }
 
    /* Set the texture environment state.  Isn't this nice and clean?
@@ -775,6 +777,8 @@
       alpha_combine = r200_alpha_combine[unit][R200_DISABLE];
    }
    else {
+      const struct gl_texture_object *tObj = texUnit->_Current;
+      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;
@@ -1064,6 +1068,10 @@
 
         case GL_DOT3_RGB_EXT:
         case GL_DOT3_RGBA_EXT:
+           /* 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.
+            */
            RGBshift = 0;
            Ashift = 0;
            /* FALLTHROUGH */
@@ -1188,9 +1196,7 @@
         }
 
         /* Step 3:
-         * 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.
+         * Apply the scale factor.
          */
         color_scale &= ~R200_TXC_SCALE_MASK;
         alpha_scale &= ~R200_TXA_SCALE_MASK;


Reply via email to