r100: Don't assume that the base mipmap of a texture exists
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 24 May 2017 23:36:28 +0000 (16:36 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 1 Jun 2017 04:14:44 +0000 (21:14 -0700)
Fixes crashes in piglit's gl-1.2-texture-base-level.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/radeon/radeon_texstate.c

index 35b1538d9e12bf177cc85a277c5c53f8e32e529a..5cabba1227fdccabf770342364e2aebd8996c05a 100644 (file)
@@ -199,6 +199,12 @@ do {                                                       \
  * Texture unit state management
  */
 
+static GLenum
+texture_base_format(const struct gl_texture_object *t)
+{
+       return t->Image[0][t->BaseLevel]->_BaseFormat;
+}
+
 static GLboolean radeonUpdateTextureEnv( struct gl_context *ctx, int unit )
 {
    r100ContextPtr rmesa = R100_CONTEXT(ctx);
@@ -251,7 +257,7 @@ static GLboolean radeonUpdateTextureEnv( struct gl_context *ctx, int unit )
         assert(op <= 3);
         switch ( srcRGBi ) {
         case GL_TEXTURE:
-           if (texUnit->_Current->Image[0][0]->_BaseFormat == GL_ALPHA)
+           if (texture_base_format(texUnit->_Current) == GL_ALPHA)
               color_arg[i] = radeon_zero_color[op];
            else
               color_arg[i] = radeon_texture_color[op][unit];
@@ -275,7 +281,7 @@ static GLboolean radeonUpdateTextureEnv( struct gl_context *ctx, int unit )
         case GL_TEXTURE1:
         case GL_TEXTURE2: {
            GLuint txunit = srcRGBi - GL_TEXTURE0;
-           if (ctx->Texture.Unit[txunit]._Current->Image[0][0]->_BaseFormat == GL_ALPHA)
+           if (texture_base_format(ctx->Texture.Unit[txunit]._Current) == GL_ALPHA)
               color_arg[i] = radeon_zero_color[op];
            else
         /* implement ogl 1.4/1.5 core spec here, not specification of
@@ -296,7 +302,7 @@ static GLboolean radeonUpdateTextureEnv( struct gl_context *ctx, int unit )
         assert(op <= 1);
         switch ( srcAi ) {
         case GL_TEXTURE:
-           if (texUnit->_Current->Image[0][0]->_BaseFormat == GL_LUMINANCE)
+           if (texture_base_format(texUnit->_Current) == GL_LUMINANCE)
               alpha_arg[i] = radeon_zero_alpha[op+1];
            else
               alpha_arg[i] = radeon_texture_alpha[op][unit];
@@ -320,7 +326,7 @@ static GLboolean radeonUpdateTextureEnv( struct gl_context *ctx, int unit )
         case GL_TEXTURE1:
         case GL_TEXTURE2: {    
            GLuint txunit = srcAi - GL_TEXTURE0;
-           if (ctx->Texture.Unit[txunit]._Current->Image[0][0]->_BaseFormat == GL_LUMINANCE)
+           if (texture_base_format(ctx->Texture.Unit[txunit]._Current) == GL_LUMINANCE)
               alpha_arg[i] = radeon_zero_alpha[op+1];
            else
               alpha_arg[i] = radeon_texture_alpha[op][txunit];