From 1bbc203c6e7fa200339204d4b686616ed030e6c1 Mon Sep 17 00:00:00 2001
From: Brian Paul <brian.paul@tungstengraphics.com>
Date: Fri, 24 Mar 2006 23:53:50 +0000
Subject: Clean up the recent code related to texture_override().  Pass params
 in a more logical order. Remove a mess of stray ^M chars. Fix a bug when
 checking if the texture object's format is GL_COLOR_INDEX or
 GL_DEPTH_COMPONENT.  This fixes a segfault when GL_TEXTURE_BASE_LEVEL!=0.

---
 src/mesa/main/texstate.c | 101 ++++++++++++++++++++++++++---------------------
 1 file changed, 56 insertions(+), 45 deletions(-)

(limited to 'src/mesa/main')

diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
index 5de5f6815ab..daf579a7bfc 100644
--- a/src/mesa/main/texstate.c
+++ b/src/mesa/main/texstate.c
@@ -39,7 +39,7 @@
 #include "texstate.h"
 #include "texenvprogram.h"
 #include "mtypes.h"
-#include "math/m_xform.h"
+#include "math/m_xform.h"
 #include "shaderobjects.h"
 
 
@@ -2766,23 +2766,29 @@ update_texture_matrices( GLcontext *ctx )
       }
    }
 }
-
-
-static void
-texture_override( struct gl_texture_object *texObj, GLuint textureBit, GLcontext *ctx,
-                GLbitfield enableBits, struct gl_texture_unit *texUnit )
-{
-   if (!texUnit->_ReallyEnabled && (enableBits & textureBit)) {
-      if (!texObj->Complete) {
-         _mesa_test_texobj_completeness(ctx, texObj);
-      }
-      if (texObj->Complete) {
-         texUnit->_ReallyEnabled = textureBit;
-         texUnit->_Current = texObj;
-      }
-   }
+
+
+/**
+ * Helper function for determining which texture object (1D, 2D, cube, etc)
+ * should actually be used.
+ */
+static void
+texture_override(GLcontext *ctx,
+                 struct gl_texture_unit *texUnit, GLbitfield enableBits,
+                 struct gl_texture_object *texObj, GLuint textureBit)
+{
+   if (!texUnit->_ReallyEnabled && (enableBits & textureBit)) {
+      if (!texObj->Complete) {
+         _mesa_test_texobj_completeness(ctx, texObj);
+      }
+      if (texObj->Complete) {
+         texUnit->_ReallyEnabled = textureBit;
+         texUnit->_Current = texObj;
+      }
+   }
 }
 
+
 /**
  * \note This routine refers to derived texture matrix values to
  * compute the ENABLE_TEXMAT flags, but is only called on
@@ -2794,9 +2800,9 @@ texture_override( struct gl_texture_object *texObj, GLuint textureBit, GLcontext
 static void
 update_texture_state( GLcontext *ctx )
 {
-   GLuint unit;
-   struct gl2_program_intf **prog = ctx->ShaderObjects.CurrentProgram;
-   GLbitfield progteximageusage[MAX_TEXTURE_IMAGE_UNITS];
+   GLuint unit;
+   struct gl2_program_intf **prog = ctx->ShaderObjects.CurrentProgram;
+   GLbitfield progteximageusage[MAX_TEXTURE_IMAGE_UNITS];
 
    ctx->NewState |= _NEW_TEXTURE; /* TODO: only set this if there are 
 				   * actual changes. 
@@ -2805,20 +2811,19 @@ update_texture_state( GLcontext *ctx )
    ctx->Texture._EnabledUnits = 0;
    ctx->Texture._GenFlags = 0;
    ctx->Texture._TexMatEnabled = 0;
-   ctx->Texture._TexGenEnabled = 0;
-
-   /*
-    * Grab texture image usage state from shader program. It must be grabbed every time
-    * uniform sampler changes, so maybe there is a better place to perform these rather
-    * expensive computations.
-    */
-   if (ctx->ShaderObjects._FragmentShaderPresent) {
-      (**prog).GetTextureImageUsage (prog, progteximageusage);
+   ctx->Texture._TexGenEnabled = 0;
+
+   /*
+    * Grab texture image usage state from shader program. It must be
+    * grabbed every time uniform sampler changes, so maybe there is a
+    * better place to perform these rather expensive computations.
+    */
+   if (ctx->ShaderObjects._FragmentShaderPresent) {
+      (**prog).GetTextureImageUsage (prog, progteximageusage);
    }
 
-   /* Update texture unit state.
-    * XXX this loop should probably be broken into separate loops for
-    * texture coord units and texture image units.
+   /*
+    * Update texture unit state.
     */
    for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
       struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
@@ -2828,10 +2833,10 @@ update_texture_state( GLcontext *ctx )
       texUnit->_ReallyEnabled = 0;
       texUnit->_GenFlags = 0;
 
-      /* Get the bitmask of texture enables */
-      if (ctx->ShaderObjects._FragmentShaderPresent) {
+      /* Get the bitmask of texture enables */
+      if (ctx->ShaderObjects._FragmentShaderPresent) {
          enableBits = progteximageusage[unit];
-      }
+      }
       else if (ctx->FragmentProgram._Enabled) {
          enableBits = ctx->FragmentProgram.Current->TexturesUsed[unit];
       }
@@ -2844,12 +2849,17 @@ update_texture_state( GLcontext *ctx )
       /* Look for the highest-priority texture target that's enabled and
        * complete.  That's the one we'll use for texturing.  If we're using
        * a fragment program we're guaranteed that bitcount(enabledBits) <= 1.
-       */
-      texture_override(texUnit->CurrentCubeMap, TEXTURE_CUBE_BIT, ctx, enableBits, texUnit);
-      texture_override(texUnit->Current3D, TEXTURE_3D_BIT, ctx, enableBits, texUnit);
-      texture_override(texUnit->CurrentRect, TEXTURE_RECT_BIT, ctx, enableBits, texUnit);
-      texture_override(texUnit->Current2D, TEXTURE_2D_BIT, ctx, enableBits, texUnit);
-      texture_override(texUnit->Current1D, TEXTURE_1D_BIT, ctx, enableBits, texUnit);
+       */
+      texture_override(ctx, texUnit, enableBits,
+                       texUnit->CurrentCubeMap, TEXTURE_CUBE_BIT);
+      texture_override(ctx, texUnit, enableBits,
+                       texUnit->Current3D, TEXTURE_3D_BIT);
+      texture_override(ctx, texUnit, enableBits,
+                       texUnit->CurrentRect, TEXTURE_RECT_BIT);
+      texture_override(ctx, texUnit, enableBits,
+                       texUnit->Current2D, TEXTURE_2D_BIT);
+      texture_override(ctx, texUnit, enableBits,
+                       texUnit->Current1D, TEXTURE_1D_BIT);
 
       if (!texUnit->_ReallyEnabled) {
          continue;
@@ -2862,13 +2872,14 @@ update_texture_state( GLcontext *ctx )
 	 texUnit->_CurrentCombine = & texUnit->Combine;
       }
       else {
-         GLenum format = texUnit->_Current->Image[0][0]->_BaseFormat;
+         const struct gl_texture_object *texObj = texUnit->_Current;
+         GLenum format = texObj->Image[0][texObj->BaseLevel]->_BaseFormat;
          if (format == GL_COLOR_INDEX) {
             format = GL_RGBA;  /* a bit of a hack */
          }
          else if (format == GL_DEPTH_COMPONENT
                   || format == GL_DEPTH_STENCIL_EXT) {
-            format = texUnit->_Current->DepthMode;
+            format = texObj->DepthMode;
          }
 	 calculate_derived_texenv(&texUnit->_EnvMode, texUnit->EnvMode, format);
 	 texUnit->_CurrentCombine = & texUnit->_EnvMode;
@@ -2947,9 +2958,9 @@ update_texture_state( GLcontext *ctx )
    ctx->Texture._EnabledCoordUnits = ctx->Texture._EnabledUnits;
    /* Fragment programs may need texture coordinates but not the
     * corresponding texture images.
-    */
-   if (ctx->ShaderObjects.CurrentProgram != NULL) {
-      ctx->Texture._EnabledCoordUnits |= (1 << ctx->Const.MaxTextureCoordUnits) - 1;
+    */
+   if (ctx->ShaderObjects.CurrentProgram != NULL) {
+      ctx->Texture._EnabledCoordUnits |= (1 << ctx->Const.MaxTextureCoordUnits) - 1;
    }
    else if (ctx->FragmentProgram._Enabled) {
       ctx->Texture._EnabledCoordUnits |=
-- 
cgit v1.2.3