mesa: Return the correct internal fmt when a generic compressed fmt was used
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 22 Jul 2011 22:26:24 +0000 (15:26 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 26 Jul 2011 02:57:17 +0000 (19:57 -0700)
If an application requests a generic compressed format for a texture
and the driver does not pick a specific compressed format, return the
generic base format (e.g., GL_RGBA) for the GL_TEXTURE_INTERNAL_FORMAT
query.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=3165
Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/main/texparam.c

index 4b9dcb5d3b596178047b3bec9c81028b886bf3ab..c4ec29533e2ac507d65338c962455c92dee62a20 100644 (file)
@@ -915,9 +915,23 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
             *params = _mesa_compressed_format_to_glenum(ctx, texFormat);
          }
          else {
-            /* return the user's requested internal format */
-            *params = img->InternalFormat;
-         }
+           /* If the true internal format is not compressed but the user
+            * requested a generic compressed format, we have to return the
+            * generic base format that matches.
+            *
+            * From page 119 (page 129 of the PDF) of the OpenGL 1.3 spec:
+            *
+            *     "If no specific compressed format is available,
+            *     internalformat is instead replaced by the corresponding base
+            *     internal format."
+            *
+            * Otherwise just return the user's requested internal format
+            */
+           const GLenum f =
+              _mesa_gl_compressed_format_base_format(img->InternalFormat);
+
+           *params = (f != 0) ? f : img->InternalFormat;
+        }
          break;
       case GL_TEXTURE_BORDER:
          *params = img->Border;