From 33ffbd1c58dc8582f67d946f9eb26127e9851a10 Mon Sep 17 00:00:00 2001 From: Daniel Borca Date: Tue, 4 May 2004 06:27:06 +0000 Subject: texture compression: getting warmer --- progs/tests/texcmp.c | 2 ++ src/mesa/drivers/glide/fxddtex.c | 16 +++++++++------- src/mesa/main/texcompress_fxt1.c | 32 +++++++++++++------------------- src/mesa/main/texcompress_s3tc.c | 8 ++++---- src/mesa/main/texstore.c | 34 ++++++++++++++++++++++++++++++++++ src/mesa/main/texstore.h | 6 ++++++ 6 files changed, 68 insertions(+), 30 deletions(-) diff --git a/progs/tests/texcmp.c b/progs/tests/texcmp.c index dc6a96cec6..fe3f58cf34 100644 --- a/progs/tests/texcmp.c +++ b/progs/tests/texcmp.c @@ -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: diff --git a/src/mesa/drivers/glide/fxddtex.c b/src/mesa/drivers/glide/fxddtex.c index 3137195abb..b0deb252b5 100644 --- a/src/mesa/drivers/glide/fxddtex.c +++ b/src/mesa/drivers/glide/fxddtex.c @@ -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); diff --git a/src/mesa/main/texcompress_fxt1.c b/src/mesa/main/texcompress_fxt1.c index 2d25f5b6e0..e654512371 100644 --- a/src/mesa/main/texcompress_fxt1.c +++ b/src/mesa/main/texcompress_fxt1.c @@ -40,14 +40,14 @@ #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 */ diff --git a/src/mesa/main/texcompress_s3tc.c b/src/mesa/main/texcompress_s3tc.c index 35f358a8f3..07ca6b0f01 100644 --- a/src/mesa/main/texcompress_s3tc.c +++ b/src/mesa/main/texcompress_s3tc.c @@ -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); diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index 3dae1929c4..ea7d7cebb1 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -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]; + } + } + } +} diff --git a/src/mesa/main/texstore.h b/src/mesa/main/texstore.h index d276ff94e4..4edad034d0 100644 --- a/src/mesa/main/texstore.h +++ b/src/mesa/main/texstore.h @@ -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 -- cgit v1.2.3