more texture compression
authorDaniel Borca <dborca@users.sourceforge.net>
Fri, 21 Nov 2003 09:56:50 +0000 (09:56 +0000)
committerDaniel Borca <dborca@users.sourceforge.net>
Fri, 21 Nov 2003 09:56:50 +0000 (09:56 +0000)
src/mesa/drivers/glide/fxdd.c
src/mesa/drivers/glide/fxddtex.c
src/mesa/main/extensions.c
src/mesa/main/mtypes.h
src/mesa/main/texcompress.c
src/mesa/main/texformat.c
src/mesa/main/teximage.c

index f4090122f5a46ec431d458768204c930efe108ef..61d530cd785d19fafbfdf7b7222787ca3b41f49d 100644 (file)
@@ -1458,7 +1458,7 @@ fxDDInitExtensions(GLcontext * ctx)
    if (fxMesa->type >= GR_SSTTYPE_Voodoo4) {
       _mesa_enable_extension(ctx, "GL_3DFX_texture_compression_FXT1");
       _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
-      /*_mesa_enable_extension(ctx, "GL_S3_s3tc");*/
+      _mesa_enable_extension(ctx, "GL_S3_s3tc");
    }
 
    if (fxMesa->HaveCmbExt) {
index b84f8d4a9dccd7da7f889b4a21b928a496c1c539..da1e73d029c4f2342cad1f8b70a48f835d39b385 100644 (file)
@@ -832,7 +832,11 @@ GLboolean fxDDIsCompressedFormat ( GLcontext *ctx, GLenum internalFormat )
      (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) ||
      (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ||
      (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) ||
-     (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)) {
+     (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) ||
+     (internalFormat == GL_RGB_S3TC) ||
+     (internalFormat == GL_RGB4_S3TC) ||
+     (internalFormat == GL_RGBA_S3TC) ||
+     (internalFormat == GL_RGBA4_S3TC)) {
     return GL_TRUE;
  }
 
@@ -876,8 +880,11 @@ GLuint fxDDCompressedTextureSize (GLcontext *ctx,
  switch (format) {
  case GL_COMPRESSED_RGB_FXT1_3DFX:
  case GL_COMPRESSED_RGBA_FXT1_3DFX:
-    /* round up to multiples of 8, 4 */
-    size = ((width + 7) / 8) * ((height + 3) / 4) * 16;
+    /* round up width to next multiple of 8, height to next multiple of 4 */
+    width = (width + 7) & ~7;
+    height = (height + 3) & ~3;
+    /* 16 bytes per 8x4 tile of RGB[A] texels */
+    size = width * height / 2;
     /* Textures smaller than 8x4 will effectively be made into 8x4 and
      * take 16 bytes.
      */
@@ -886,11 +893,13 @@ GLuint fxDDCompressedTextureSize (GLcontext *ctx,
     return size;
  case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+ case GL_RGB_S3TC:
+ case GL_RGB4_S3TC:
     /* round up width, height to next multiple of 4 */
     width = (width + 3) & ~3;
     height = (height + 3) & ~3;
     /* 8 bytes per 4x4 tile of RGB[A] texels */
-    size = (width * height * 8) / 16;
+    size = width * height / 2;
     /* Textures smaller than 4x4 will effectively be made into 4x4 and
      * take 8 bytes.
      */
@@ -899,6 +908,8 @@ GLuint fxDDCompressedTextureSize (GLcontext *ctx,
     return size;
  case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+ case GL_RGBA_S3TC:
+ case GL_RGBA4_S3TC:
     /* round up width, height to next multiple of 4 */
     width = (width + 3) & ~3;
     height = (height + 3) & ~3;
@@ -1053,10 +1064,14 @@ fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
       return &_mesa_texformat_argb1555;
    /* GL_EXT_texture_compression_s3tc */
    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
       return &_mesa_texformat_rgb_dxt1;
    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
       return &_mesa_texformat_rgba_dxt1;
    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
       return &_mesa_texformat_rgba_dxt3;
    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
       return &_mesa_texformat_rgba_dxt5;
index 05ae619ea2822f07e799e85bed930a8baf69724e..fa7a33e0c0d435c6671fe04679a44eaba272b979 100644 (file)
@@ -143,6 +143,7 @@ static const struct {
    { OFF, "GL_SGIX_shadow",                    F(SGIX_shadow) },
    { OFF, "GL_SGIX_shadow_ambient",            F(SGIX_shadow_ambient) },
    { OFF, "GL_SUN_multi_draw_arrays",          F(EXT_multi_draw_arrays) },
+   { OFF, "GL_S3_s3tc",                        F(S3_s3tc) },
 };
 
 
index a36a21825771433e90a0a305cc38e65707de980a..23ff3548c24e61ae4613679d6830f819583c08d7 100644 (file)
@@ -1815,6 +1815,7 @@ struct gl_extensions
    GLboolean SGIX_shadow_ambient; /* or GL_ARB_shadow_ambient */
    GLboolean TDFX_texture_compression_FXT1;
    GLboolean APPLE_client_storage;
+   GLboolean S3_s3tc;
    /*@}*/
    /* The extension string */
    const GLubyte *String;
index 3e06275c93068ce8ad17439045691020f113e033..4c6eaae4cf324272f5ab63e05788d500b6636480 100644 (file)
@@ -73,6 +73,17 @@ _mesa_get_compressed_formats( GLcontext *ctx, GLint *formats )
             n += 3;
          }
       }
+      if (ctx->Extensions.S3_s3tc) {
+         if (formats) {
+            formats[n++] = GL_RGB_S3TC;
+            formats[n++] = GL_RGB4_S3TC;
+            formats[n++] = GL_RGBA_S3TC;
+            formats[n++] = GL_RGBA4_S3TC;
+         }
+         else {
+            n += 4;
+         }
+      }
    }
    return n;
 }
@@ -100,11 +111,16 @@ _mesa_compressed_texture_size( GLcontext *ctx,
       return ctx->Driver.CompressedTextureSize(ctx, width, height, depth, format);
    }
 
+   ASSERT(depth == 1);
+
    switch (format) {
    case GL_COMPRESSED_RGB_FXT1_3DFX:
    case GL_COMPRESSED_RGBA_FXT1_3DFX:
-      /* round up to multiples of 8, 4 */
-      size = ((width + 7) / 8) * ((height + 3) / 4) * 16;
+      /* round up width to next multiple of 8, height to next multiple of 4 */
+      width = (width + 7) & ~7;
+      height = (height + 3) & ~3;
+      /* 16 bytes per 8x4 tile of RGB[A] texels */
+      size = width * height / 2;
       /* Textures smaller than 8x4 will effectively be made into 8x4 and
        * take 16 bytes.
        */
@@ -113,12 +129,13 @@ _mesa_compressed_texture_size( GLcontext *ctx,
       return size;
    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
       /* round up width, height to next multiple of 4 */
       width = (width + 3) & ~3;
       height = (height + 3) & ~3;
-      ASSERT(depth == 1);
       /* 8 bytes per 4x4 tile of RGB[A] texels */
-      size = (width * height * 8) / 16;
+      size = width * height / 2;
       /* Textures smaller than 4x4 will effectively be made into 4x4 and
        * take 8 bytes.
        */
@@ -127,10 +144,11 @@ _mesa_compressed_texture_size( GLcontext *ctx,
       return size;
    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
       /* round up width, height to next multiple of 4 */
       width = (width + 3) & ~3;
       height = (height + 3) & ~3;
-      ASSERT(depth == 1);
       /* 16 bytes per 4x4 tile of RGBA texels */
       size = width * height; /* simple! */
       /* Textures smaller than 4x4 will effectively be made into 4x4 and
@@ -156,26 +174,29 @@ _mesa_compressed_texture_size( GLcontext *ctx,
 GLint
 _mesa_compressed_row_stride(GLenum format, GLsizei width)
 {
-   GLint bytesPerTile, stride;
+   GLint stride;
 
    switch (format) {
    case GL_COMPRESSED_RGB_FXT1_3DFX:
    case GL_COMPRESSED_RGBA_FXT1_3DFX:
-      bytesPerTile = 16;
+      stride = ((width + 7) / 8) * 16; /* 16 bytes per 8x4 tile */
       break;
    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-      bytesPerTile = 8;
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
+      stride = ((width + 3) / 4) * 8; /* 8 bytes per 4x4 tile */
       break;
    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
-      bytesPerTile = 16;
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
+      stride = ((width + 3) / 4) * 16; /* 16 bytes per 4x4 tile */
       break;
    default:
       return 0;
    }
 
-   stride = ((width + 3) / 4) * bytesPerTile;
    return stride;
 }
 
@@ -198,33 +219,39 @@ _mesa_compressed_image_address(GLint col, GLint row, GLint img,
                                GLenum format,
                                GLsizei width, const GLubyte *image)
 {
-   GLint bytesPerTile, stride;
    GLubyte *addr;
 
-   ASSERT((row & 3) == 0);
-   ASSERT((col & 3) == 0);
    (void) img;
 
+   /* We try to spot a "complete" subtexture "above" ROW, COL;
+    * this texture is given by appropriate rounding of WIDTH x ROW.
+    * Then we just add the amount left (usually on the left).
+    *
+    * Example for X*Y microtiles (Z bytes each)
+    * offset = Z * (((width + X - 1) / X) * (row / Y) + col / X);
+    */
+
    switch (format) {
    case GL_COMPRESSED_RGB_FXT1_3DFX:
    case GL_COMPRESSED_RGBA_FXT1_3DFX:
-      bytesPerTile = 16;
+      addr = (GLubyte *) image + 16 * (((width + 7) / 8) * (row / 4) + col / 8);
       break;
    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-      bytesPerTile = 8;
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
+      addr = (GLubyte *) image + 8 * (((width + 3) / 4) * (row / 4) + col / 4);
       break;
    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
-      bytesPerTile = 16;
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
+      addr = (GLubyte *) image + 16 * (((width + 3) / 4) * (row / 4) + col / 4);
       break;
    default:
       return 0;
    }
 
-   stride = ((width + 3) / 4) * bytesPerTile;
-
-   addr = (GLubyte *) image + (row / 4) * stride + (col / 4) * bytesPerTile;
    return addr;
 }
 
index 0000767f4ccc82997b74512b1bd93579c99799aa..7af0b1cdf48341b18e860b86eae8f6b9d07f12e4 100644 (file)
@@ -874,7 +874,7 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
         _mesa_problem(ctx, "texture compression extension not enabled");
       if (ctx->Extensions.TDFX_texture_compression_FXT1)
          return &_mesa_texformat_rgb_fxt1;
-      else if (ctx->Extensions.EXT_texture_compression_s3tc)
+      else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc)
          return &_mesa_texformat_rgb_dxt1;
       return &_mesa_texformat_rgb;
    case GL_COMPRESSED_RGBA_ARB:
@@ -882,7 +882,7 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
         _mesa_problem(ctx, "texture compression extension not enabled");
       if (ctx->Extensions.TDFX_texture_compression_FXT1)
          return &_mesa_texformat_rgba_fxt1;
-      else if (ctx->Extensions.EXT_texture_compression_s3tc)
+      else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc)
          return &_mesa_texformat_rgba_dxt3;  /* Not rgba_dxt1!  See the spec */
       return &_mesa_texformat_rgba;
 
@@ -927,6 +927,20 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
       else
          return NULL;
 
+   /* GL_S3_s3tc */
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
+      if (ctx->Extensions.S3_s3tc)
+         return &_mesa_texformat_rgb_dxt1;
+      else
+         return NULL;
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
+      if (ctx->Extensions.S3_s3tc)
+         return &_mesa_texformat_rgba_dxt3;
+      else
+         return NULL;
+
    default:
       _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
       return NULL;
index efe197e13ec9fbd86128a582ba4e9c013fd3ddc8..ec08168fc020dd3b81a6f3ee3a737885abe0c50d 100644 (file)
@@ -274,6 +274,18 @@ _mesa_base_tex_format( GLcontext *ctx, GLint format )
             return GL_RGBA;
          else
             return -1;
+      case GL_RGB_S3TC:
+      case GL_RGB4_S3TC:
+         if (ctx->Extensions.S3_s3tc)
+            return GL_RGB;
+         else
+            return -1;
+      case GL_RGBA_S3TC:
+      case GL_RGBA4_S3TC:
+         if (ctx->Extensions.S3_s3tc)
+            return GL_RGBA;
+         else
+            return -1;
 
       case GL_YCBCR_MESA:
          if (ctx->Extensions.MESA_ycbcr_texture)
@@ -387,6 +399,10 @@ is_compressed_format(GLcontext *ctx, GLenum internalFormat)
       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
       case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+      case GL_RGB_S3TC:
+      case GL_RGB4_S3TC:
+      case GL_RGBA_S3TC:
+      case GL_RGBA4_S3TC:
          return GL_TRUE;
       default:
          if (ctx->Driver.IsCompressedFormat) {