diff options
Diffstat (limited to 'src/mesa/main/mipmap.c')
| -rw-r--r-- | src/mesa/main/mipmap.c | 78 | 
1 files changed, 38 insertions, 40 deletions
| diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c index c3928fa513..7350c7a3d2 100644 --- a/src/mesa/main/mipmap.c +++ b/src/mesa/main/mipmap.c @@ -28,10 +28,11 @@   */  #include "imports.h" +#include "formats.h"  #include "mipmap.h"  #include "texcompress.h" -#include "texformat.h"  #include "teximage.h" +#include "texstore.h"  #include "image.h" @@ -1493,7 +1494,7 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,                        struct gl_texture_object *texObj)  {     const struct gl_texture_image *srcImage; -   const struct gl_texture_format *convertFormat; +   gl_format convertFormat;     const GLubyte *srcData = NULL;     GLubyte *dstData = NULL;     GLint level, maxLevels; @@ -1508,7 +1509,8 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,     ASSERT(maxLevels > 0);  /* bad target */     /* Find convertFormat - the format that do_row() will process */ -   if (srcImage->IsCompressed) { + +   if (_mesa_is_format_compressed(srcImage->TexFormat)) {        /* setup for compressed textures - need to allocate temporary         * image buffers to hold uncompressed images.         */ @@ -1520,11 +1522,11 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,               texObj->Target == GL_TEXTURE_CUBE_MAP_ARB);        if (srcImage->_BaseFormat == GL_RGB) { -         convertFormat = &_mesa_texformat_rgb; +         convertFormat = MESA_FORMAT_RGB888;           components = 3;        }        else if (srcImage->_BaseFormat == GL_RGBA) { -         convertFormat = &_mesa_texformat_rgba; +         convertFormat = MESA_FORMAT_RGBA8888;           components = 4;        }        else { @@ -1588,7 +1590,11 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,                                           &dstWidth, &dstHeight, &dstDepth);        if (!nextLevel) {           /* all done */ -         break; +         if (_mesa_is_format_compressed(srcImage->TexFormat)) { +            _mesa_free((void *) srcData); +            _mesa_free(dstData); +         } +         return;        }        /* get dest gl_texture_image */ @@ -1609,25 +1615,17 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,        dstImage->TexFormat = srcImage->TexFormat;        dstImage->FetchTexelc = srcImage->FetchTexelc;        dstImage->FetchTexelf = srcImage->FetchTexelf; -      dstImage->IsCompressed = srcImage->IsCompressed; -      if (dstImage->IsCompressed) { -         dstImage->CompressedSize -            = ctx->Driver.CompressedTextureSize(ctx, dstImage->Width, -                                              dstImage->Height, -                                              dstImage->Depth, -                                              dstImage->TexFormat->MesaFormat); -         ASSERT(dstImage->CompressedSize > 0); -      } - -      ASSERT(dstImage->TexFormat); -      ASSERT(dstImage->FetchTexelc); -      ASSERT(dstImage->FetchTexelf);        /* Alloc new teximage data buffer.         * Setup src and dest data pointers.         */ -      if (dstImage->IsCompressed) { -         dstImage->Data = _mesa_alloc_texmemory(dstImage->CompressedSize); +      if (_mesa_is_format_compressed(dstImage->TexFormat)) { +         GLuint dstCompressedSize =  +            _mesa_format_image_size(dstImage->TexFormat, dstImage->Width, +                                    dstImage->Height, dstImage->Depth); +         ASSERT(dstCompressedSize > 0); + +         dstImage->Data = _mesa_alloc_texmemory(dstCompressedSize);           if (!dstImage->Data) {              _mesa_error(ctx, GL_OUT_OF_MEMORY, "generating mipmaps");              return; @@ -1637,7 +1635,7 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,           ASSERT(dstData);        }        else { -         bytesPerTexel = dstImage->TexFormat->TexelBytes; +         bytesPerTexel = _mesa_get_format_bytes(dstImage->TexFormat);           ASSERT(dstWidth * dstHeight * dstDepth * bytesPerTexel > 0);           dstImage->Data = _mesa_alloc_texmemory(dstWidth * dstHeight                                                  * dstDepth * bytesPerTexel); @@ -1649,6 +1647,10 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,           dstData = (GLubyte *) dstImage->Data;        } +      ASSERT(dstImage->TexFormat); +      ASSERT(dstImage->FetchTexelc); +      ASSERT(dstImage->FetchTexelf); +        _mesa_generate_mipmap_level(target, datatype, comps, border,                                    srcWidth, srcHeight, srcDepth,                                     srcData, srcImage->RowStride, @@ -1656,22 +1658,24 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,                                    dstData, dstImage->RowStride); -      if (dstImage->IsCompressed) { +      if (_mesa_is_format_compressed(dstImage->TexFormat)) {           GLubyte *temp;           /* compress image from dstData into dstImage->Data */ -         const GLenum srcFormat = convertFormat->BaseFormat; +         const GLenum srcFormat = _mesa_get_format_base_format(convertFormat);           GLint dstRowStride -            = _mesa_compressed_row_stride(dstImage->TexFormat->MesaFormat, dstWidth); +            = _mesa_format_row_stride(dstImage->TexFormat, dstWidth);           ASSERT(srcFormat == GL_RGB || srcFormat == GL_RGBA); -         dstImage->TexFormat->StoreImage(ctx, 2, dstImage->_BaseFormat, -                                         dstImage->TexFormat, -                                         dstImage->Data, -                                         0, 0, 0, /* dstX/Y/Zoffset */ -                                         dstRowStride, 0, /* strides */ -                                         dstWidth, dstHeight, 1, /* size */ -                                         srcFormat, CHAN_TYPE, -                                         dstData, /* src data, actually */ -                                         &ctx->DefaultPacking); + +         _mesa_texstore(ctx, 2, dstImage->_BaseFormat, +                        dstImage->TexFormat, +                        dstImage->Data, +                        0, 0, 0, /* dstX/Y/Zoffset */ +                        dstRowStride, 0, /* strides */ +                        dstWidth, dstHeight, 1, /* size */ +                        srcFormat, CHAN_TYPE, +                        dstData, /* src data, actually */ +                        &ctx->DefaultPacking); +           /* swap src and dest pointers */           temp = (GLubyte *) srcData;           srcData = dstData; @@ -1679,12 +1683,6 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,        }     } /* loop over mipmap levels */ - -   if (srcImage->IsCompressed) { -      /* free uncompressed image buffers */ -      _mesa_free((void *) srcData); -      _mesa_free(dstData); -   }  } | 
