mesa: new _mesa_decompress_image() function
authorBrian Paul <brianp@vmware.com>
Fri, 9 Sep 2011 02:16:18 +0000 (20:16 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 9 Sep 2011 02:16:18 +0000 (20:16 -0600)
Use the old texture fetch functions to decompress a whole image.
To be used by glGetTexImage().

src/mesa/main/texcompress.c
src/mesa/main/texcompress.h

index 390fc535e925aa81bdee40cfd032069e68dfbeb3..4e5c14cbba20c46133d97eebbc78d79c1efdd524 100644 (file)
@@ -37,6 +37,9 @@
 #include "mfeatures.h"
 #include "mtypes.h"
 #include "texcompress.h"
+#include "texcompress_fxt1.h"
+#include "texcompress_rgtc.h"
+#include "texcompress_s3tc.h"
 
 
 /**
@@ -438,3 +441,86 @@ _mesa_compressed_image_address(GLint col, GLint row, GLint img,
 
    return (GLubyte *) image + offset;
 }
+
+
+/**
+ * Decompress a compressed texture image, returning a GL_RGBA/GL_FLOAT image.
+ */
+void
+_mesa_decompress_image(gl_format format, GLuint width, GLuint height,
+                       const GLubyte *src, GLint srcRowStride,
+                       GLfloat *dest)
+{
+   void (*fetch)(const struct gl_texture_image *texImage,
+                 GLint i, GLint j, GLint k, GLfloat *texel);
+   struct gl_texture_image texImage;  /* dummy teximage */
+   GLuint i, j;
+
+   /* setup dummy texture image info */
+   memset(&texImage, 0, sizeof(texImage));
+   texImage.Data = (void *) src;
+   texImage.RowStride = srcRowStride;
+
+   switch (format) {
+   /* DXT formats */
+   case MESA_FORMAT_RGB_DXT1:
+      fetch = _mesa_fetch_texel_2d_f_rgb_dxt1;
+      break;
+   case MESA_FORMAT_RGBA_DXT1:
+      fetch = _mesa_fetch_texel_2d_f_rgba_dxt1;
+      break;
+   case MESA_FORMAT_RGBA_DXT3:
+      fetch = _mesa_fetch_texel_2d_f_rgba_dxt3;
+      break;
+   case MESA_FORMAT_RGBA_DXT5:
+      fetch = _mesa_fetch_texel_2d_f_rgba_dxt5;
+      break;
+
+   /* FXT1 formats */
+   case MESA_FORMAT_RGB_FXT1:
+      fetch = _mesa_fetch_texel_2d_f_rgb_fxt1;
+      break;
+   case MESA_FORMAT_RGBA_FXT1:
+      fetch = _mesa_fetch_texel_2d_f_rgba_fxt1;
+      break;
+
+   /* Red/RG formats */
+   case MESA_FORMAT_RED_RGTC1:
+      fetch = _mesa_fetch_texel_2d_f_red_rgtc1;
+      break;
+   case MESA_FORMAT_SIGNED_RED_RGTC1:
+      fetch = _mesa_fetch_texel_2d_f_signed_red_rgtc1;
+      break;
+   case MESA_FORMAT_RG_RGTC2:
+      fetch = _mesa_fetch_texel_2d_f_rg_rgtc2;
+      break;
+   case MESA_FORMAT_SIGNED_RG_RGTC2:
+      fetch = _mesa_fetch_texel_2d_f_signed_rg_rgtc2;
+      break;
+
+   /* L/LA formats */
+   case MESA_FORMAT_L_LATC1:
+      fetch = _mesa_fetch_texel_2d_f_l_latc1;
+      break;
+   case MESA_FORMAT_SIGNED_L_LATC1:
+      fetch = _mesa_fetch_texel_2d_f_signed_l_latc1;
+      break;
+   case MESA_FORMAT_LA_LATC2:
+      fetch = _mesa_fetch_texel_2d_f_la_latc2;
+      break;
+   case MESA_FORMAT_SIGNED_LA_LATC2:
+      fetch = _mesa_fetch_texel_2d_f_signed_la_latc2;
+      break;
+
+   default:
+      _mesa_problem(NULL, "Unexpected format in _mesa_decompress_image()");
+      return;
+   }
+
+   for (j = 0; j < height; j++) {
+      for (i = 0; i < width; i++) {
+         fetch(&texImage, i, j, 0, dest);
+         dest += 4;
+      }
+   }
+}
index 375cf90c8a21c036859e2a9524d7e64b82487eb9..2c357068c91fad15b7e571bcf1991e48e595727f 100644 (file)
@@ -50,6 +50,11 @@ _mesa_compressed_image_address(GLint col, GLint row, GLint img,
                                gl_format mesaFormat,
                                GLsizei width, const GLubyte *image);
 
+extern void
+_mesa_decompress_image(gl_format format, GLuint width, GLuint height,
+                       const GLubyte *src, GLint srcRowStride,
+                       GLfloat *dest);
+
 #else /* _HAVE_FULL_GL */
 
 /* no-op macros */