[Mesa-dev] [PATCH 2/2] meta: Fix restoring of fixed function texture enables.

Brian Paul brianp at vmware.com
Fri Nov 11 12:46:40 PST 2011


On 11/11/2011 11:31 AM, Eric Anholt wrote:
> If they were disabled on entry, and we enabled one (like for
> BlitFramebuffer), we wouldn't disable it on the way out.  Retain the
> attempted optimization here (don't keep calling to set each bit for
> changes that won't matter) by just setting the bits directly with
> appropriate flushing.
>
> Fixes misrendering on the second draw of piglit fbo-blit.
> ---
>   src/mesa/drivers/common/meta.c |   36 +++++++++---------------------------
>   1 files changed, 9 insertions(+), 27 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index f9b582d..259041f 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -887,35 +887,17 @@ _mesa_meta_end(struct gl_context *ctx)
>            _mesa_reference_texobj(&save->CurrentTexture[tgt], NULL);
>         }
>
> -      /* Re-enable textures, texgen */
> +      /* Restore fixed function texture enables, texgen */
>         for (u = 0; u<  ctx->Const.MaxTextureUnits; u++) {
> -         if (save->TexEnabled[u]) {
> -            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
> -
> -            if (save->TexEnabled[u]&  TEXTURE_1D_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_TRUE);
> -            if (save->TexEnabled[u]&  TEXTURE_2D_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_TRUE);
> -            if (save->TexEnabled[u]&  TEXTURE_3D_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_TRUE);
> -            if (save->TexEnabled[u]&  TEXTURE_CUBE_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_TRUE);
> -            if (save->TexEnabled[u]&  TEXTURE_RECT_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_TRUE);
> -         }
> -
> -         if (save->TexGenEnabled[u]) {
> -            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
> +	 if (ctx->Texture.Unit[u].Enabled != save->TexEnabled[u]) {
> +	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
> +	    ctx->Texture.Unit[u].Enabled = save->TexEnabled[u];
> +	 }
>
> -            if (save->TexGenEnabled[u]&  S_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_TRUE);
> -            if (save->TexGenEnabled[u]&  T_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_TRUE);
> -            if (save->TexGenEnabled[u]&  R_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_TRUE);
> -            if (save->TexGenEnabled[u]&  Q_BIT)
> -               _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_TRUE);
> -         }
> +	 if (ctx->Texture.Unit[u].TexGenEnabled != save->TexGenEnabled[u]) {
> +	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
> +	    ctx->Texture.Unit[u].TexGenEnabled = save->TexGenEnabled[u];
> +	 }
>         }
>
>         /* restore current unit state */

That's much nicer.

Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list