[Mesa-dev] [PATCH] meta: save and restore swizzle for _GenerateMipmap

Ian Romanick idr at freedesktop.org
Tue Jun 10 10:00:30 PDT 2014


On 06/09/2014 07:48 AM, Robert Bragg wrote:
> This makes sure to use a no-op swizzle while iteratively rendering each
> level of a mipmap otherwise we may loose components and effectively
> apply the swizzle twice by the time these levels are sampled.

Right... the swizzle state shouldn't affect mipmap generation at all.
One minor nit below, but otherwise

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

I second Chris's request for a piglit test.  It should be pretty easy to
clone one of the existing tests/fbo/fbo-generatemipmap-*.c tests and
modify it to test this case.

> ---
>  src/mesa/drivers/common/meta_generate_mipmap.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/src/mesa/drivers/common/meta_generate_mipmap.c b/src/mesa/drivers/common/meta_generate_mipmap.c
> index d12806c..4b1718d 100644
> --- a/src/mesa/drivers/common/meta_generate_mipmap.c
> +++ b/src/mesa/drivers/common/meta_generate_mipmap.c
> @@ -43,6 +43,7 @@
>  #include "main/varray.h"
>  #include "main/viewport.h"
>  #include "drivers/common/meta.h"
> +#include "program/prog_instruction.h"
>  
>  
>  /**
> @@ -168,6 +169,8 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
>     GLenum faceTarget;
>     GLuint dstLevel;
>     GLuint samplerSave;
> +   GLint swizzle[4];
> +   GLboolean swizzleSaved = GL_FALSE;
>  
>     if (fallback_required(ctx, target, texObj)) {
>        _mesa_generate_mipmap(ctx, target, texObj);
> @@ -231,6 +234,13 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
>  
>     _mesa_TexParameteri(target, GL_GENERATE_MIPMAP, GL_FALSE);
>  
> +   if (texObj->_Swizzle != SWIZZLE_NOOP) {
> +      static const GLint swizzleNoop[4] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA };
> +      memcpy(swizzle, texObj->Swizzle, sizeof(swizzle));
> +      swizzleSaved = GL_TRUE;
> +      _mesa_TexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzleNoop);
> +   }
> +
>     /* Silence valgrind warnings about reading uninitialized stack. */
>     memset(verts, 0, sizeof(verts));
>  
> @@ -347,4 +357,6 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
>     _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, maxLevelSave);
>     if (genMipmapSave)
>        _mesa_TexParameteri(target, GL_GENERATE_MIPMAP, genMipmapSave);
> +   if (swizzleSaved)
> +      _mesa_TexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
>  }
> 



More information about the mesa-dev mailing list