[Mesa-dev] [PATCH 1/2] meta/blit: Add stencil texturing mode save and restore

Kenneth Graunke kenneth at whitecape.org
Wed May 21 14:32:45 PDT 2014


On 05/21/2014 02:57 AM, Topi Pohjolainen wrote:
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> Cc: "10.2" <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/drivers/common/meta.h      |  4 ++--
>  src/mesa/drivers/common/meta_blit.c | 15 ++++++++++++++-
>  2 files changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
> index 007f104..765f8df 100644
> --- a/src/mesa/drivers/common/meta.h
> +++ b/src/mesa/drivers/common/meta.h
> @@ -270,7 +270,7 @@ struct blit_state
>  struct fb_tex_blit_state
>  {
>     GLint baseLevelSave, maxLevelSave;
> -   GLuint sampler, samplerSave;
> +   GLuint sampler, samplerSave, stencilSamplingSave;
>     GLuint tempTex;
>  };
>  
> @@ -407,7 +407,7 @@ _mesa_meta_fb_tex_blit_begin(const struct gl_context *ctx,
>                               struct fb_tex_blit_state *blit);
>  
>  extern void
> -_mesa_meta_fb_tex_blit_end(const struct gl_context *ctx, GLenum target,
> +_mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target,
>                             struct fb_tex_blit_state *blit);
>  
>  extern GLboolean
> diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c
> index e10a181..59f7e70 100644
> --- a/src/mesa/drivers/common/meta_blit.c
> +++ b/src/mesa/drivers/common/meta_blit.c
> @@ -441,6 +441,7 @@ blitframebuffer_texture(struct gl_context *ctx,
>  
>     fb_tex_blit.baseLevelSave = texObj->BaseLevel;
>     fb_tex_blit.maxLevelSave = texObj->MaxLevel;
> +   fb_tex_blit.stencilSamplingSave = texObj->StencilSampling;
>  
>     if (glsl_version) {
>        setup_glsl_blit_framebuffer(ctx, blit, rb, target);
> @@ -567,7 +568,7 @@ _mesa_meta_fb_tex_blit_begin(const struct gl_context *ctx,
>  }
>  
>  void
> -_mesa_meta_fb_tex_blit_end(const struct gl_context *ctx, GLenum target,
> +_mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target,
>                             struct fb_tex_blit_state *blit)
>  {
>     /* Restore texture object state, the texture binding will
> @@ -576,6 +577,18 @@ _mesa_meta_fb_tex_blit_end(const struct gl_context *ctx, GLenum target,
>     if (target != GL_TEXTURE_RECTANGLE_ARB) {
>        _mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, blit->baseLevelSave);
>        _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, blit->maxLevelSave);
> +
> +      if (ctx->Extensions.ARB_stencil_texturing) {
> +         struct gl_texture_object *texObj =
> +            _mesa_get_current_tex_object(ctx, target);
> +
> +         /* One cannot use _mesa_TexParameteri() in case the stencil indexing
> +          * wasn't modified during the blit. Hence write the saved value
> +          * directly.
> +          */
> +         if (texObj)
> +            texObj->StencilSampling = blit->stencilSamplingSave;
> +      }
>     }
>  
>     _mesa_BindSampler(ctx->Texture.CurrentUnit, blit->samplerSave);
> 


Hey Topi,

The usual pattern for this kind of stuff is:

if (texObj->StencilSampling != blit->stencilSamplingSave) {
   _mesa_TexParameteri(target, GL_DEPTH_STENCIL_TEXTURE_MODE,
                       blit->stencilSamplingSave ? GL_STENCIL_INDEX :
GL_DEPTH_COMPONENT);
}

In other words, if we changed it, put the old value back.  Presumably,
we shouldn't be changing it for RGBA buffers and the like (where it
would be invalid).

Would that work instead?

--Ken

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140521/792fba56/attachment.sig>


More information about the mesa-dev mailing list