texture compression: getting warmer
authorDaniel Borca <dborca@users.sourceforge.net>
Tue, 4 May 2004 06:27:06 +0000 (06:27 +0000)
committerDaniel Borca <dborca@users.sourceforge.net>
Tue, 4 May 2004 06:27:06 +0000 (06:27 +0000)
progs/tests/texcmp.c
src/mesa/drivers/glide/fxddtex.c
src/mesa/main/texcompress_fxt1.c
src/mesa/main/texcompress_s3tc.c
src/mesa/main/texstore.c
src/mesa/main/texstore.h

index dc6a96cec6980b9bb6d657025bc47df7c90a0553..fe3f58cf347dc441509cef74ee7c6d8c9005a9f6 100644 (file)
@@ -37,6 +37,8 @@ static GLboolean fxt1, dxtc, s3tc;
 static const char *TextureName (GLenum TC)
 {
  switch (TC) {
+        case GL_RGB:
+             return "RGB";
         case GL_RGBA:
              return "RGBA";
         case GL_COMPRESSED_RGB:
index 3137195abb6e5a99e1847dc15108268a60527b27..b0deb252b5dfb26a39694d443f214d32659ec8b7 100644 (file)
@@ -46,7 +46,6 @@
 #include "texcompress.h"
 #include "texobj.h"
 #include "texstore.h"
-#include "texutil.h"
 
 
 void
@@ -1207,7 +1206,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
    fxMesaContext fxMesa = FX_CONTEXT(ctx);
    tfxTexInfo *ti;
    tfxMipMapLevel *mml;
-   GLint texelBytes;
+   GLint texelBytes, dstRowStride;
 
    if (TDFX_DEBUG & VERBOSE_TEXTURE) {
        fprintf(stderr, "fxDDTexImage2D: id=%d int 0x%x  format 0x%x  type 0x%x  %dx%d\n",
@@ -1279,14 +1278,17 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
    /*if (!fxMesa->HaveTexFmt) assert(texelBytes == 1 || texelBytes == 2);*/
 
    mml->glideFormat = fxGlideFormat(texImage->TexFormat->MesaFormat);
-   /* [dBorca] Hack alert ZZZ: how do we handle FX_TC_NCC/FX_TC_NAPALM? */
-   /* [dBorca] Hack alert ZZZ: how do we handle S3TC outside MESA?!?!?! */
+   /* [dBorca] ZYX: how do we handle FX_TC_NCC/FX_TC_NAPALM? */
+   /* [dBorca] ZYX: how do we handle S3TC outside MESA?!?!?! */
+   /* [dBorca] ZYX: how do we handle aspectratio adjustemnt? */
 
    /* allocate mipmap buffer */
    assert(!texImage->Data);
    if (texImage->IsCompressed) {
+      dstRowStride = _mesa_compressed_row_stride(texImage->IntFormat, mml->width);
       texImage->Data = MESA_PBUFFER_ALLOC(texImage->CompressedSize);
    } else {
+      dstRowStride = mml->width * texelBytes;
       texImage->Data = MESA_PBUFFER_ALLOC(mml->width * mml->height * texelBytes);
    }
    if (!texImage->Data) {
@@ -1332,10 +1334,10 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
          texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
                                          texImage->TexFormat, texImage->Data,
                                          0, 0, 0, /* dstX/Y/Zoffset */
-                                         mml->width * texelBytes, /* dstRowStride */
+                                         dstRowStride,
                                          0, /* dstImageStride */
                                          mml->width, mml->height, 1,
-                                         GL_BGRA, type, tempImage, packing);
+                                         GL_BGRA, CHAN_TYPE, tempImage, &ctx->DefaultPacking);
          FREE(rgbaImage);
       } else {
          /* [dBorca] mild case:
@@ -1370,7 +1372,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
       texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
                                       texImage->TexFormat, texImage->Data,
                                       0, 0, 0, /* dstX/Y/Zoffset */
-                                      mml->width * texelBytes, /* dstRowStride */
+                                      dstRowStride,
                                       0, /* dstImageStride */
                                       width, height, 1,
                                       format, type, pixels, packing);
index 2d25f5b6e034f7ddf0825c4dd65bc6ca2e4c20c6..e65451237124ff908e32774c437448b154491490 100644 (file)
 #include "texstore.h"
 
 
-static GLint
+static GLuint
 compress_fxt1 (GLcontext *ctx,
-               GLint srcWidth,
-               GLint srcHeight,
+               GLsizei srcWidth,
+               GLsizei srcHeight,
                GLenum srcFormat,
-               const GLvoid *pixels,
+               const GLchan *source,
                GLint srcRowStride,
-               GLvoid *dst,
+               GLubyte *dest,
                GLint dstRowStride);
 
 
@@ -69,12 +69,9 @@ texstore_rgb_fxt1(STORE_PARAMS)
    const GLchan *pixels;
    GLint srcRowStride;
    GLubyte *dst;
-   GLint texWidth;
+   const GLint texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
    const GLchan *tempImage = NULL;
 
-   dstRowStride = _mesa_compressed_row_stride(GL_COMPRESSED_RGB_FXT1_3DFX, srcWidth);
-   texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
-
    ASSERT(dstFormat == &_mesa_texformat_rgb_fxt1);
    ASSERT(dstXoffset % 8 == 0);
    ASSERT(dstYoffset % 4 == 0);
@@ -130,13 +127,10 @@ texstore_rgba_fxt1(STORE_PARAMS)
    const GLchan *pixels;
    GLint srcRowStride;
    GLubyte *dst;
-   GLint texWidth;
+   GLint texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
    const GLchan *tempImage = NULL;
 
-   dstRowStride = _mesa_compressed_row_stride(GL_COMPRESSED_RGBA_FXT1_3DFX, srcWidth);
-   texWidth = dstRowStride * 8 / 16; /* a bit of a hack */
-
-   ASSERT(dstFormat == &_mesa_texformat_rgba_dxt1);
+   ASSERT(dstFormat == &_mesa_texformat_rgba_fxt1);
    ASSERT(dstXoffset % 8 == 0);
    ASSERT(dstYoffset % 4 == 0);
    ASSERT(dstZoffset     == 0);
@@ -269,14 +263,14 @@ const struct gl_texture_format _mesa_texformat_rgba_fxt1 = {
 };
 
 
-static GLint
+static GLuint
 compress_fxt1 (GLcontext *ctx,
-               GLint srcWidth,
-               GLint srcHeight,
+               GLsizei srcWidth,
+               GLsizei srcHeight,
                GLenum srcFormat,
-               const GLvoid *pixels,
+               const GLchan *source,
                GLint srcRowStride,
-               GLvoid *dst,
+               GLubyte *dest,
                GLint dstRowStride)
 {
    /* here be dragons */
index 35f358a8f384e86e34276b5ed7a428f1fb926fa1..07ca6b0f0143bb8ab3769d19adabbd8ece191e29 100644 (file)
@@ -57,7 +57,7 @@ texstore_rgb_dxt1(STORE_PARAMS)
    const GLchan *pixels;
    GLint srcRowStride;
    GLubyte *dst;
-   const GLint texWidth = dstRowStride / 2; /* a bit of a hack */
+   const GLint texWidth = dstRowStride * 4 / 8; /* a bit of a hack */
    const GLchan *tempImage = NULL;
 
    ASSERT(dstFormat == &_mesa_texformat_rgb_dxt1);
@@ -114,7 +114,7 @@ texstore_rgba_dxt1(STORE_PARAMS)
    const GLchan *pixels;
    GLint srcRowStride;
    GLubyte *dst;
-   const GLint texWidth = dstRowStride / 2; /* a bit of a hack */
+   const GLint texWidth = dstRowStride * 4 / 8; /* a bit of a hack */
    const GLchan *tempImage = NULL;
 
    ASSERT(dstFormat == &_mesa_texformat_rgba_dxt1);
@@ -169,7 +169,7 @@ texstore_rgba_dxt3(STORE_PARAMS)
    const GLchan *pixels;
    GLint srcRowStride;
    GLubyte *dst;
-   const GLint texWidth = dstRowStride / 4; /* a bit of a hack */
+   const GLint texWidth = dstRowStride * 4 / 16; /* a bit of a hack */
    const GLchan *tempImage = NULL;
 
    ASSERT(dstFormat == &_mesa_texformat_rgba_dxt3);
@@ -223,7 +223,7 @@ texstore_rgba_dxt5(STORE_PARAMS)
    const GLchan *pixels;
    GLint srcRowStride;
    GLubyte *dst;
-   const GLint texWidth = dstRowStride / 4; /* a bit of a hack */
+   const GLint texWidth = dstRowStride * 4 / 16; /* a bit of a hack */
    const GLchan *tempImage = NULL;
 
    ASSERT(dstFormat == &_mesa_texformat_rgba_dxt5);
index 3dae1929c4dc3ca594b7de80f48ccb3ea688c38f..ea7d7cebb176fc248f4cc9444262f6509536c689 100644 (file)
@@ -3280,3 +3280,37 @@ do {                                                                     \
       _mesa_problem(NULL,"unexpected bytes/pixel in _mesa_rescale_teximage2d");
    }
 }
+
+
+/**
+ * Upscale an image by replication, not (typical) stretching.
+ * We use this when the image width or height is less than a
+ * certain size (4, 8) and we need to upscale an image.
+ */
+void
+_mesa_upscale_teximage2d (GLsizei inWidth, GLsizei inHeight,
+                          GLsizei outWidth, GLsizei outHeight,
+                          GLint comps, const GLchan *src, GLint srcRowStride,
+                          GLchan *dest )
+{
+   GLint i, j, k;
+
+   ASSERT(outWidth >= inWidth);
+   ASSERT(outHeight >= inHeight);
+   ASSERT(inWidth == 1 || inWidth == 2 || inHeight == 1 || inHeight == 2);
+#if 0
+   ASSERT((outWidth & 3) == 0);
+   ASSERT((outHeight & 3) == 0);
+#endif
+
+   for (i = 0; i < outHeight; i++) {
+      const GLint ii = i % inHeight;
+      for (j = 0; j < outWidth; j++) {
+         const GLint jj = j % inWidth;
+         for (k = 0; k < comps; k++) {
+            dest[(i * outWidth + j) * comps + k]
+               = src[ii * srcRowStride + jj * comps + k];
+         }
+      }
+   }
+}
index d276ff94e47b979dec0c7bb9d303c333c39d2cf2..4edad034d0b7e7d0613dcbe7887d4163d8c64d21 100644 (file)
@@ -232,4 +232,10 @@ _mesa_rescale_teximage2d(GLuint bytesPerPixel, GLuint dstRowStride,
                          GLint dstWidth, GLint dstHeight,
                          const GLvoid *srcImage, GLvoid *dstImage);
 
+extern void
+_mesa_upscale_teximage2d( GLsizei inWidth, GLsizei inHeight,
+                          GLsizei outWidth, GLsizei outHeight,
+                          GLint comps, const GLchan *src, GLint srcRowStride,
+                          GLchan *dest );
+
 #endif