st/mesa: Ignore internal_format in st_context_teximage.
authorChia-I Wu <olv@lunarg.com>
Fri, 7 May 2010 09:34:15 +0000 (17:34 +0800)
committerChia-I Wu <olv@lunarg.com>
Sun, 9 May 2010 08:23:28 +0000 (16:23 +0800)
When internal_format and tex->format differ, st_finailize_texture will
surface_copy between surfaces with different formats.  This commit works
around the issue by ignoring internal_format.  A sane fix is needed
here.

src/mesa/state_tracker/st_manager.c

index ea89553840aa4b33b28f4148c956f686f5417cae..869196941c3a2e530e46f94928caabbe3de06dbf 100644 (file)
@@ -541,7 +541,16 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target
    texImage = _mesa_get_tex_image(ctx, texObj, target, level);
    stImage = st_texture_image(texImage);
    if (tex) {
-      if (util_format_get_component_bits(internal_format,
+      /*
+       * XXX When internal_format and tex->format differ, st_finalize_texture
+       * needs to allocate a new texture with internal_format and copy the
+       * texture here into the new one.  It will result in surface_copy being
+       * called on surfaces whose formats differ.
+       *
+       * To avoid that, internal_format is (wrongly) ignored here.  A sane fix
+       * is to use a sampler view.
+       */
+      if (util_format_get_component_bits(tex->format,
                UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
          internalFormat = GL_RGBA;
       else