[Mesa-dev] [PATCH 1/2] meta/blit: Add stencil texturing mode save and restore
Pohjolainen, Topi
topi.pohjolainen at intel.com
Wed May 21 11:37:30 PDT 2014
On Wed, May 21, 2014 at 11:29:02AM -0700, Eric Anholt wrote:
> Topi Pohjolainen <topi.pohjolainen at intel.com> writes:
>
> > 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.
> > + */
>
> Can you explain that some more? I'm uncomfortable with direct
> modification of the values instead of _mesa_TexParameteri, becuase it
> means that any other state update handling (like making sure that the
> call to Driver.TexParameter() has happened, or any necessary flushes)
> isn't getting done.
Glad to, if the mode was 'GL_DEPTH_COMPONENT' originally and the blit doesn't
modify it than the following issues an error:
static GLboolean
set_tex_parameteri(struct gl_context *ctx,
struct gl_texture_object *texObj,
GLenum pname, const GLint *params)
{
...
case GL_DEPTH_STENCIL_TEXTURE_MODE:
if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_stencil_texturing) {
bool stencil = params[0] == GL_STENCIL_INDEX;
if (!stencil && params[0] != GL_DEPTH_COMPONENT)
goto invalid_param;
if (texObj->StencilSampling == stencil)
return GL_FALSE;
texObj->StencilSampling = stencil;
return GL_TRUE;
}
goto invalid_pname;
>
> > + if (texObj)
> > + texObj->StencilSampling = blit->stencilSamplingSave;
More information about the mesa-dev
mailing list