[Mesa-dev] [PATCH 2/2] mesa: Only flag _NEW_TEXTURE on texture updates when a texture changes.

Stéphane Marchesin stephane.marchesin at gmail.com
Wed Feb 15 18:33:55 PST 2012


On Wed, Feb 15, 2012 at 18:01, Eric Anholt <eric at anholt.net> wrote:
> There are three reasons left for this function flagging it:
> Re-computing completeness (and therefore the number of levels),
> binding a new current texture object, or you're doing some sort of
> fixed function (and nobody cares).  For other cases, like rebinding a
> shader, we no longer trigger the driver recomputing every piece of
> texture state.
>
> Improves a VS state change microbenchmark by 14.8284% +/- 1.02% (n=10)
> on gen7.  On the other hand, it causes GPU hangs on nexuiz.  Any clue
> why this might be insufficient?
> ---
>  src/mesa/main/texstate.c |   34 ++++++++++++++++++++++++++--------
>  1 files changed, 26 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
> index 2dbf530..86b8b3d 100644
> --- a/src/mesa/main/texstate.c
> +++ b/src/mesa/main/texstate.c
> @@ -577,7 +577,6 @@ update_texture_state( struct gl_context *ctx )
>     */
>
>    /* TODO: only set this if there are actual changes */

I think that comment should go away too.

> -   ctx->NewState |= _NEW_TEXTURE;
>
>    /*
>     * Update texture unit state.
> @@ -588,6 +587,7 @@ update_texture_state( struct gl_context *ctx )
>       GLbitfield enabledFragTargets = 0x0;
>       GLbitfield enabledTargets = 0x0;
>       GLuint texIndex;
> +      struct gl_texture_object *oldObj = texUnit->_Current;
>
>       /* Get the bitmask of texture target enables.
>        * enableBits will be a mask of the TEXTURE_*_BIT flags indicating
> @@ -609,10 +609,18 @@ update_texture_state( struct gl_context *ctx )
>
>       enabledTargets = enabledVertTargets | enabledFragTargets;
>
> +      /* This is not flagged with _NEW_TEXTURE, because the test for changing of
> +       * the _Current texture object will cover every case where _ReallyEnabled
> +       * could have changed.
> +       */
>       texUnit->_ReallyEnabled = 0x0;
>
>       if (enabledTargets == 0x0) {
>          /* neither vertex nor fragment processing uses this unit */
> +        if (texUnit->_ReallyEnabled) {
> +           ctx->NewState |= _NEW_TEXTURE;
> +           texUnit->_ReallyEnabled = 0x0;
> +        }
>          continue;
>       }
>
> @@ -626,6 +634,10 @@ update_texture_state( struct gl_context *ctx )
>          if (enabledTargets & (1 << texIndex)) {
>             struct gl_texture_object *texObj = texUnit->CurrentTex[texIndex];
>             if (!texObj->_Complete) {
> +              /* While _Complete is only consumed by us, this call also updates
> +                 _MaxLevel, which drivers do need to see.
> +               */
> +              ctx->NewState |= _NEW_TEXTURE;
>                _mesa_test_texobj_completeness(ctx, texObj);
>             }
>             if (texObj->_Complete) {
> @@ -652,22 +664,26 @@ update_texture_state( struct gl_context *ctx )
>             _mesa_reference_texobj(&texUnit->_Current, texObj);
>             texUnit->_ReallyEnabled = 1 << texTarget;
>          }
> -         else {
> -            /* fixed-function: texture unit is really disabled */
> -            continue;
> -         }
>       }
> +
> +      if (oldObj != texUnit->_Current)
> +        ctx->NewState |= _NEW_TEXTURE;
>    }
>
>
>    /* Determine which texture coordinate sets are actually needed */
>    if (fprog) {
>       const GLuint coordMask = (1 << MAX_TEXTURE_COORD_UNITS) - 1;
> +      GLuint new_coord_units = ((fprog->InputsRead >> FRAG_ATTRIB_TEX0) &
> +                               coordMask);
>       /* Note that this gets consumed by update_ffvs_texture_state(). */
> -      ctx->Texture._EnabledCoordUnits
> -         = (fprog->InputsRead >> FRAG_ATTRIB_TEX0) & coordMask;
> +      if (ctx->Texture._EnabledCoordUnits != new_coord_units) {
> +        ctx->NewState |= _NEW_TEXTURE;
> +        ctx->Texture._EnabledCoordUnits = new_coord_units;
> +      }
>    }
>    else {
> +      ctx->NewState |= _NEW_TEXTURE;
>       update_fffs_texture_state(ctx);
>    }
>
> @@ -675,8 +691,10 @@ update_texture_state( struct gl_context *ctx )
>     * program.  Those state flags are only used in the case of fixed function
>     * vertex shading, in the tnl pipeline or ff_vertex_shader.
>     */
> -   if (!vprog)
> +   if (!vprog) {
> +      ctx->NewState |= _NEW_TEXTURE;
>       update_ffvs_texture_state(ctx);
> +   }
>  }
>
>
> --
> 1.7.9
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list