diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/main/mipmap.c | 117 | ||||
| -rw-r--r-- | src/mesa/main/mipmap.h | 11 | 
2 files changed, 81 insertions, 47 deletions
| diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c index b3e40c2da9..9d57f424fd 100644 --- a/src/mesa/main/mipmap.c +++ b/src/mesa/main/mipmap.c @@ -843,6 +843,70 @@ make_2d_stack_mipmap(GLenum datatype, GLuint comps, GLint border,  /** + * Down-sample a texture image to produce the next lower mipmap level. + */ +void +_mesa_generate_mipmap_level(GLenum target, +                            GLenum datatype, GLuint comps, +                            GLint border, +                            GLint srcWidth, GLint srcHeight, GLint srcDepth, +                            const GLubyte *srcData, +                            GLint srcRowStride, +                            GLint dstWidth, GLint dstHeight, GLint dstDepth, +                            GLubyte *dstData, +                            GLint dstRowStride) +{ +   /* +    * We use simple 2x2 averaging to compute the next mipmap level. +    */ +   switch (target) { +   case GL_TEXTURE_1D: +      make_1d_mipmap(datatype, comps, border, +                     srcWidth, srcData, +                     dstWidth, dstData); +      break; +   case GL_TEXTURE_2D: +   case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: +   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: +   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: +   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: +   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: +   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: +      make_2d_mipmap(datatype, comps, border, +                     srcWidth, srcHeight, srcData, srcRowStride, +                     dstWidth, dstHeight, dstData, dstRowStride); +      break; +   case GL_TEXTURE_3D: +      make_3d_mipmap(datatype, comps, border, +                     srcWidth, srcHeight, srcDepth, +                     srcData, srcRowStride, +                     dstWidth, dstHeight, dstDepth, +                     dstData, dstRowStride); +      break; +   case GL_TEXTURE_1D_ARRAY_EXT: +      make_1d_stack_mipmap(datatype, comps, border, +                           srcWidth, srcData, srcRowStride, +                           dstWidth, dstHeight, +                           dstData, dstRowStride); +      break; +   case GL_TEXTURE_2D_ARRAY_EXT: +      make_2d_stack_mipmap(datatype, comps, border, +                           srcWidth, srcHeight, +                           srcData, srcRowStride, +                           dstWidth, dstHeight, +                           dstDepth, dstData, dstRowStride); +      break; +   case GL_TEXTURE_RECTANGLE_NV: +      /* no mipmaps, do nothing */ +      break; +   default: +      _mesa_problem(ctx, "bad dimensions in _mesa_generate_mipmaps"); +      return; +   } +} + + +/**   * For GL_SGIX_generate_mipmap:   * Generate a complete set of mipmaps from texObj's base-level image.   * Stop at texObj's MaxLevel or when we get to the 1x1 texture. @@ -1034,53 +1098,12 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,           dstData = (GLubyte *) dstImage->Data;        } -      /* -       * We use simple 2x2 averaging to compute the next mipmap level. -       */ -      switch (target) { -         case GL_TEXTURE_1D: -            make_1d_mipmap(datatype, comps, border, -                           srcWidth, srcData, -                           dstWidth, dstData); -            break; -         case GL_TEXTURE_2D: -         case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: -         case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: -         case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: -         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: -         case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: -         case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: -            make_2d_mipmap(datatype, comps, border, -                           srcWidth, srcHeight, srcData, srcImage->RowStride, -                           dstWidth, dstHeight, dstData, dstImage->RowStride); -            break; -         case GL_TEXTURE_3D: -            make_3d_mipmap(datatype, comps, border, -                           srcWidth, srcHeight, srcDepth, -			   srcData, srcImage->RowStride, -                           dstWidth, dstHeight, dstDepth, -			   dstData, dstImage->RowStride); -            break; -         case GL_TEXTURE_1D_ARRAY_EXT: -            make_1d_stack_mipmap(datatype, comps, border, -                                 srcWidth, srcData, srcImage->RowStride, -                                 dstWidth, dstHeight, -				 dstData, dstImage->RowStride); -            break; -         case GL_TEXTURE_2D_ARRAY_EXT: -            make_2d_stack_mipmap(datatype, comps, border, -                                 srcWidth, srcHeight, -				 srcData, srcImage->RowStride, -                                 dstWidth, dstHeight, -				 dstDepth, dstData, dstImage->RowStride); -            break; -         case GL_TEXTURE_RECTANGLE_NV: -            /* no mipmaps, do nothing */ -            break; -         default: -            _mesa_problem(ctx, "bad dimensions in _mesa_generate_mipmaps"); -            return; -      } +      _mesa_generate_mipmap_level(target, datatype, comps, border, +                                  srcWidth, srcHeight, srcDepth,  +                                  srcData, srcImage->RowStride, +                                  dstWidth, dstHeight, dstDepth,  +                                  dstData, dstImage->RowStride); +        if (dstImage->IsCompressed) {           GLubyte *temp; diff --git a/src/mesa/main/mipmap.h b/src/mesa/main/mipmap.h index 46e16902c8..b6491f5507 100644 --- a/src/mesa/main/mipmap.h +++ b/src/mesa/main/mipmap.h @@ -28,6 +28,17 @@  #include "mtypes.h" + +extern void +_mesa_generate_mipmap_level(GLenum target, +                            GLenum datatype, GLuint comps, +                            GLint border, +                            GLint srcWidth, GLint srcHeight, GLint srcDepth, +                            const GLubyte *srcData, +                            GLint dstWidth, GLint dstHeight, GLint dstDepth, +                            GLubyte *dstData); + +  extern void  _mesa_generate_mipmap(GLcontext *ctx, GLenum target,                        struct gl_texture_object *texObj); | 
