diff options
-rw-r--r-- | progs/tests/texcmp.c | 3 | ||||
-rw-r--r-- | src/mesa/drivers/glide/fxdd.c | 1 | ||||
-rw-r--r-- | src/mesa/drivers/glide/fxddtex.c | 149 | ||||
-rw-r--r-- | src/mesa/main/texcompress_fxt1.c | 139 |
4 files changed, 233 insertions, 59 deletions
diff --git a/progs/tests/texcmp.c b/progs/tests/texcmp.c index fc66a96030e..dc6a96cec69 100644 --- a/progs/tests/texcmp.c +++ b/progs/tests/texcmp.c @@ -305,6 +305,9 @@ static void Key( unsigned char key, int x, int y ) } ReInit(Tx->TC, Tx); break; + case '9': + ReInit(GL_RGB, Tx); + break; case '0': ReInit(GL_RGBA, Tx); break; diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c index 510b9ce43bc..106c7d0e070 100644 --- a/src/mesa/drivers/glide/fxdd.c +++ b/src/mesa/drivers/glide/fxdd.c @@ -1730,7 +1730,6 @@ fxSetupDDPointers(GLcontext * ctx) ctx->Driver.TexSubImage2D = fxDDTexSubImage2D; ctx->Driver.CompressedTexImage2D = fxDDCompressedTexImage2D; ctx->Driver.CompressedTexSubImage2D = fxDDCompressedTexSubImage2D; - ctx->Driver.IsCompressedFormat = fxDDIsCompressedFormat; ctx->Driver.CompressedTextureSize = fxDDCompressedTextureSize; ctx->Driver.TestProxyTexImage = fxDDTestProxyTexImage; ctx->Driver.TexEnv = fxDDTexEnv; diff --git a/src/mesa/drivers/glide/fxddtex.c b/src/mesa/drivers/glide/fxddtex.c index 6f7c9252f34..25a41cac347 100644 --- a/src/mesa/drivers/glide/fxddtex.c +++ b/src/mesa/drivers/glide/fxddtex.c @@ -43,6 +43,7 @@ #include "image.h" #include "teximage.h" #include "texformat.h" +#include "texcompress.h" #include "texobj.h" #include "texstore.h" #include "texutil.h" @@ -663,9 +664,6 @@ fxIsTexSupported(GLenum target, GLint internalFormat, * may get defined in texutil.c) but we have to account for scaled texture * images on tdfx hardware (the 8:1 aspect ratio limit). * Hence, we need special functions here. - * - * [dBorca] - * this better be right, if we will advertise GL_SGIS_generate_mipmap! */ static void @@ -828,6 +826,84 @@ fetch_a8r8g8b8(const struct gl_texture_image *texImage, static void +fetch_rgb_fxt1(const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLchan *rgba) +{ + const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); + + i = i * mml->wScale; + j = j * mml->hScale; + + _mesa_texformat_rgb_fxt1.FetchTexel2D(texImage, i, j, k, rgba); +} + + +static void +fetch_rgba_fxt1(const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLchan *rgba) +{ + const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); + + i = i * mml->wScale; + j = j * mml->hScale; + + _mesa_texformat_rgba_fxt1.FetchTexel2D(texImage, i, j, k, rgba); +} + + +static void +fetch_rgb_dxt1(const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLchan *rgba) +{ + const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); + + i = i * mml->wScale; + j = j * mml->hScale; + + _mesa_texformat_rgb_dxt1.FetchTexel2D(texImage, i, j, k, rgba); +} + + +static void +fetch_rgba_dxt1(const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLchan *rgba) +{ + const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); + + i = i * mml->wScale; + j = j * mml->hScale; + + _mesa_texformat_rgba_dxt1.FetchTexel2D(texImage, i, j, k, rgba); +} + + +static void +fetch_rgba_dxt3(const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLchan *rgba) +{ + const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); + + i = i * mml->wScale; + j = j * mml->hScale; + + _mesa_texformat_rgba_dxt3.FetchTexel2D(texImage, i, j, k, rgba); +} + + +static void +fetch_rgba_dxt5(const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLchan *rgba) +{ + const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); + + i = i * mml->wScale; + j = j * mml->hScale; + + _mesa_texformat_rgba_dxt5.FetchTexel2D(texImage, i, j, k, rgba); +} + + +static void PrintTexture(int w, int h, int c, const GLubyte * data) { int i, j; @@ -896,56 +972,15 @@ GLuint fxDDCompressedTextureSize (GLcontext *ctx, width *= wScale; height *= hScale; +#if FX_TC_NAPALM || FX_TC_NCC switch (format) { - case GL_COMPRESSED_RGB_FXT1_3DFX: - case GL_COMPRESSED_RGBA_FXT1_3DFX: - /* 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. - */ - if (size < 16) - size = 16; - 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 / 2; - /* Textures smaller than 4x4 will effectively be made into 4x4 and - * take 8 bytes. - */ - if (size < 8) - size = 8; - 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; - /* 16 bytes per 4x4 tile of RGBA texels */ - size = width * height; /* simple! */ - /* Textures smaller than 4x4 will effectively be made into 4x4 and - * take 16 bytes. - */ - if (size < 16) - size = 16; - return size; case GL_COMPRESSED_RGB: #if FX_TC_NAPALM { fxMesaContext fxMesa = FX_CONTEXT(ctx); if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { - return fxDDCompressedTextureSize(ctx, width, height, 1, GL_COMPRESSED_RGB_FXT1_3DFX); + format = GL_COMPRESSED_RGB_FXT1_3DFX; + break; } } #endif @@ -957,17 +992,22 @@ GLuint fxDDCompressedTextureSize (GLcontext *ctx, { fxMesaContext fxMesa = FX_CONTEXT(ctx); if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { - return fxDDCompressedTextureSize(ctx, width, height, 1, GL_COMPRESSED_RGBA_FXT1_3DFX); + format = GL_COMPRESSED_RGBA_FXT1_3DFX; + break; } } #endif #if FX_TC_NCC return (width * height * 16 >> 3) + 12 * 4; #endif - default: - _mesa_problem(ctx, "bad texformat in fxDDCompressedTextureSize"); - return 0; } +#endif + + return _mesa_compressed_texture_size(ctx, + width, + height, + depth, + format); } @@ -1170,12 +1210,17 @@ fxFetchFunction(GLint mesaFormat) case MESA_FORMAT_ARGB8888: return &fetch_a8r8g8b8; case MESA_FORMAT_RGB_FXT1: + return &fetch_rgb_fxt1; case MESA_FORMAT_RGBA_FXT1: + return &fetch_rgba_fxt1; case MESA_FORMAT_RGB_DXT1: + return &fetch_rgb_dxt1; case MESA_FORMAT_RGBA_DXT1: + return &fetch_rgba_dxt1; case MESA_FORMAT_RGBA_DXT3: + return &fetch_rgba_dxt3; case MESA_FORMAT_RGBA_DXT5: - return &fetch_r4g4b4a4; + return &fetch_rgba_dxt5; default: _mesa_problem(NULL, "Unexpected format in fxFetchFunction"); return NULL; diff --git a/src/mesa/main/texcompress_fxt1.c b/src/mesa/main/texcompress_fxt1.c index f18f717fc64..98e9158074a 100644 --- a/src/mesa/main/texcompress_fxt1.c +++ b/src/mesa/main/texcompress_fxt1.c @@ -40,28 +40,142 @@ #include "texstore.h" +GLint compress_fxt1 (GLcontext *ctx, + GLint srcWidth, + GLint srcHeight, + GLenum srcFormat, + const GLvoid *pixels, + GLint srcRowStride, + GLvoid *dst, + GLint dstRowStride); + + +/** + * Called during context initialization. + */ void _mesa_init_texture_fxt1( GLcontext *ctx ) { - /* called during context initialization */ } +/** + * Called via TexFormat->StoreImage to store an RGB_FXT1 texture. + */ static GLboolean texstore_rgb_fxt1(STORE_PARAMS) { - /* XXX to do */ - return GL_FALSE; + const GLchan *pixels; + GLint srcRowStride; + GLubyte *dst; + GLint texWidth; + 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); + ASSERT(dstZoffset == 0); + + /* [dBorca] + * we still need to pass a 4byte/pixel texture to the codec + */ + if (srcFormat != GL_RGB || + srcType != CHAN_TYPE || + ctx->_ImageTransferState || + srcPacking->SwapBytes) { + /* convert image to RGB/GLchan */ + tempImage = _mesa_make_temp_chan_image(ctx, dims, + baseInternalFormat, + /*dstFormat->BaseFormat*/GL_RGBA, + srcWidth, srcHeight, srcDepth, + srcFormat, srcType, srcAddr, + srcPacking); + if (!tempImage) + return GL_FALSE; /* out of memory */ + _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); + pixels = tempImage; + srcRowStride = /*3*/4 * srcWidth; + srcFormat = GL_RGB; + } + else { + pixels = (const GLchan *) srcAddr; + srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, + srcType) / sizeof(GLchan); + } + + dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0, + GL_COMPRESSED_RGB_FXT1_3DFX, + texWidth, dstAddr); + + compress_fxt1(ctx, srcWidth, srcHeight, srcFormat, pixels, srcRowStride, + dst, dstRowStride); + + if (tempImage) + _mesa_free((void *) tempImage); + + return GL_TRUE; } +/** + * Called via TexFormat->StoreImage to store an RGBA_FXT1 texture. + */ static GLboolean texstore_rgba_fxt1(STORE_PARAMS) { - /* XXX to do */ - return GL_FALSE; -} + const GLchan *pixels; + GLint srcRowStride; + GLubyte *dst; + GLint texWidth; + 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(dstXoffset % 8 == 0); + ASSERT(dstYoffset % 4 == 0); + ASSERT(dstZoffset == 0); + + if (srcFormat != GL_RGBA || + srcType != CHAN_TYPE || + ctx->_ImageTransferState || + srcPacking->SwapBytes) { + /* convert image to RGBA/GLchan */ + tempImage = _mesa_make_temp_chan_image(ctx, dims, + baseInternalFormat, + dstFormat->BaseFormat, + srcWidth, srcHeight, srcDepth, + srcFormat, srcType, srcAddr, + srcPacking); + if (!tempImage) + return GL_FALSE; /* out of memory */ + _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); + pixels = tempImage; + srcRowStride = 4 * srcWidth; + srcFormat = GL_RGBA; + } + else { + pixels = (const GLchan *) srcAddr; + srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, + srcType) / sizeof(GLchan); + } + dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0, + GL_COMPRESSED_RGBA_FXT1_3DFX, + texWidth, dstAddr); + + compress_fxt1(ctx, srcWidth, srcHeight, srcFormat, pixels, srcRowStride, + dst, dstRowStride); + + if (tempImage) + _mesa_free((void*) tempImage); + + return GL_TRUE; +} static void @@ -153,3 +267,16 @@ const struct gl_texture_format _mesa_texformat_rgba_fxt1 = { NULL, /*impossible*/ /* FetchTexel3Df */ }; + +GLint compress_fxt1 (GLcontext *ctx, + GLint srcWidth, + GLint srcHeight, + GLenum srcFormat, + const GLvoid *pixels, + GLint srcRowStride, + GLvoid *dst, + GLint dstRowStride) +{ + /* here be dragons */ + return -1; +} |