fixed automatic mipmap generation

This commit is contained in:
Daniel Borca
2004-08-30 08:41:25 +00:00
parent 554321af7b
commit d17c1769ca
+63 -8
View File
@@ -49,19 +49,56 @@
#include "tdfx_texman.h"
/* no borders! can't halve 1x1! (stride > width * comp) not allowed */
void
_mesa_halve2x2_teximage2d ( GLuint bytesPerPixel,
_mesa_halve2x2_teximage2d ( GLcontext *ctx,
struct gl_texture_image *texImage,
GLuint bytesPerPixel,
GLint srcWidth, GLint srcHeight,
const GLvoid *srcImage, GLvoid *dstImage )
{
GLint i, j, k;
const GLint dstWidth = srcWidth / 2;
const GLint dstHeight = srcHeight / 2;
const GLint srcRowStride = srcWidth * bytesPerPixel;
const GLubyte *src = srcImage;
GLint dstWidth = srcWidth / 2;
GLint dstHeight = srcHeight / 2;
GLint srcRowStride = srcWidth * bytesPerPixel;
GLubyte *src = (GLubyte *)srcImage;
GLubyte *dst = dstImage;
/* no borders! can't halve 1x1! (stride > width * comp) not allowed */
GLuint bpt = 0;
GLubyte *_s = NULL;
GLubyte *_d = NULL;
GLenum _t;
if (texImage->TexFormat->MesaFormat == MESA_FORMAT_RGB565) {
_t = GL_UNSIGNED_SHORT_5_6_5_REV;
bpt = bytesPerPixel;
} else if (texImage->TexFormat->MesaFormat == MESA_FORMAT_ARGB4444) {
_t = GL_UNSIGNED_SHORT_4_4_4_4_REV;
bpt = bytesPerPixel;
} else if (texImage->TexFormat->MesaFormat == MESA_FORMAT_ARGB1555) {
_t = GL_UNSIGNED_SHORT_1_5_5_5_REV;
bpt = bytesPerPixel;
}
if (bpt) {
bytesPerPixel = 4;
srcRowStride = srcWidth * bytesPerPixel;
if (dstWidth == 0) {
dstWidth = 1;
}
if (dstHeight == 0) {
dstHeight = 1;
}
_s = src = MALLOC(srcRowStride * srcHeight);
_d = dst = MALLOC(dstWidth * bytesPerPixel * dstHeight);
_mesa_texstore_rgba8888(ctx, 2, GL_RGBA,
&_mesa_texformat_rgba8888_rev, src,
0, 0, 0, /* dstX/Y/Zoffset */
srcRowStride, /* dstRowStride */
0, /* dstImageStride */
srcWidth, srcHeight, 1,
texImage->Format, _t, srcImage, &ctx->DefaultPacking);
}
if (srcHeight == 1) {
for (i = 0; i < dstWidth; i++) {
for (k = 0; k < bytesPerPixel; k++) {
@@ -96,6 +133,20 @@ _mesa_halve2x2_teximage2d ( GLuint bytesPerPixel,
src += srcRowStride;
}
}
if (bpt) {
src = _s;
dst = _d;
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
texImage->TexFormat, dstImage,
0, 0, 0, /* dstX/Y/Zoffset */
dstWidth * bpt,
0, /* dstImageStride */
dstWidth, dstHeight, 1,
GL_BGRA, CHAN_TYPE, dst, &ctx->DefaultPacking);
FREE(dst);
FREE(src);
}
}
@@ -1363,7 +1414,9 @@ tdfxTexImage2D(GLcontext *ctx, GLenum target, GLint level,
NULL);
mipImage = _mesa_select_tex_image(ctx, texUnit, target, level);
mip = TDFX_TEXIMAGE_DATA(mipImage);
_mesa_halve2x2_teximage2d(texelBytes,
_mesa_halve2x2_teximage2d(ctx,
texImage,
texelBytes,
mml->width, mml->height,
texImage->Data, mipImage->Data);
texImage = mipImage;
@@ -1470,7 +1523,9 @@ tdfxTexSubImage2D(GLcontext *ctx, GLenum target, GLint level,
++level;
mipImage = _mesa_select_tex_image(ctx, texUnit, target, level);
mip = TDFX_TEXIMAGE_DATA(mipImage);
_mesa_halve2x2_teximage2d(texelBytes,
_mesa_halve2x2_teximage2d(ctx,
texImage,
texelBytes,
mml->width, mml->height,
texImage->Data, mipImage->Data);
texImage = mipImage;