[Mesa-dev] [PATCH 8/8] mesa: rework _ae_invalidate_state() so that it just sets a dirty flag

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Jun 7 11:33:21 UTC 2017


Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

On 06/07/2017 08:02 AM, Timothy Arceri wrote:
> ---
>   src/mesa/main/api_arrayelt.c | 26 +++++++++++++-------------
>   src/mesa/main/api_arrayelt.h |  2 +-
>   src/mesa/vbo/vbo_context.h   |  9 +++++----
>   3 files changed, 19 insertions(+), 18 deletions(-)
> 
> diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c
> index c973c5e..4611e24 100644
> --- a/src/mesa/main/api_arrayelt.c
> +++ b/src/mesa/main/api_arrayelt.c
> @@ -58,26 +58,27 @@ typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
>   typedef struct {
>      const struct gl_array_attributes *array;
>      const struct gl_vertex_buffer_binding *binding;
>      attrib_func func;
>      GLuint index;
>   } AEattrib;
>   
>   typedef struct {
>      AEarray arrays[32];
>      AEattrib attribs[VERT_ATTRIB_MAX + 1];
> -   GLbitfield NewState;
>   
>      /* List of VBOs we need to map before executing ArrayElements */
>      struct gl_buffer_object *vbo[VERT_ATTRIB_MAX];
>      GLuint nr_vbos;
>      GLboolean mapped_vbos;  /**< Any currently mapped VBOs? */
> +
> +   bool dirty_state;
>   } AEcontext;
>   
>   
>   /** Cast wrapper */
>   static inline AEcontext *
>   AE_CONTEXT(struct gl_context *ctx)
>   {
>      return (AEcontext *) ctx->aelt_context;
>   }
>   
> @@ -89,21 +90,21 @@ AE_CONTEXT(struct gl_context *ctx)
>    */
>   static inline int
>   TYPE_IDX(GLenum t)
>   {
>      return t == GL_DOUBLE ? 7 : t & 7;
>   }
>   
>   
>   bool
>   _ae_is_state_dirty(struct gl_context *ctx) {
> -   return AE_CONTEXT(ctx)->NewState;
> +   return AE_CONTEXT(ctx)->dirty_state;
>   }
>   
>   
>   #define NUM_TYPES 8
>   
>   
>   static const int ColorFuncs[2][NUM_TYPES] = {
>      {
>         _gloffset_Color3bv,
>         _gloffset_Color3ubv,
> @@ -1510,21 +1511,21 @@ _ae_create_context(struct gl_context *ctx)
>      FogCoordFuncs[3] = -1;
>      FogCoordFuncs[4] = -1;
>      FogCoordFuncs[5] = -1;
>      FogCoordFuncs[6] = _gloffset_FogCoordfvEXT;
>      FogCoordFuncs[7] = _gloffset_FogCoorddv;
>   
>      ctx->aelt_context = calloc(1, sizeof(AEcontext));
>      if (!ctx->aelt_context)
>         return GL_FALSE;
>   
> -   AE_CONTEXT(ctx)->NewState = ~0;
> +   AE_CONTEXT(ctx)->dirty_state = true;
>      return GL_TRUE;
>   }
>   
>   
>   void
>   _ae_destroy_context(struct gl_context *ctx)
>   {
>      if (AE_CONTEXT(ctx)) {
>         free(ctx->aelt_context);
>         ctx->aelt_context = NULL;
> @@ -1689,38 +1690,38 @@ _ae_update_state(struct gl_context *ctx)
>         aa++;
>      }
>   
>      check_vbo(actx, vao->IndexBufferObj);
>   
>      assert(at - actx->attribs <= VERT_ATTRIB_MAX);
>      assert(aa - actx->arrays < 32);
>      at->func = NULL;  /* terminate the list */
>      aa->offset = -1;  /* terminate the list */
>   
> -   actx->NewState = 0;
> +   actx->dirty_state = false;
>   }
>   
>   
>   /**
>    * Before replaying glArrayElements calls we need to map (for reading) any
>    * VBOs referenced by the enabled vertex arrays.
>    */
>   void
>   _ae_map_vbos(struct gl_context *ctx)
>   {
>      AEcontext *actx = AE_CONTEXT(ctx);
>      GLuint i;
>   
>      if (actx->mapped_vbos)
>         return;
>   
> -   if (actx->NewState)
> +   if (actx->dirty_state)
>         _ae_update_state(ctx);
>   
>      for (i = 0; i < actx->nr_vbos; i++)
>         ctx->Driver.MapBufferRange(ctx, 0,
>   				 actx->vbo[i]->Size,
>   				 GL_MAP_READ_BIT,
>   				 actx->vbo[i],
>                                    MAP_INTERNAL);
>   
>      if (actx->nr_vbos)
> @@ -1733,21 +1734,21 @@ _ae_map_vbos(struct gl_context *ctx)
>    */
>   void
>   _ae_unmap_vbos(struct gl_context *ctx)
>   {
>      AEcontext *actx = AE_CONTEXT(ctx);
>      GLuint i;
>   
>      if (!actx->mapped_vbos)
>         return;
>   
> -   assert (!actx->NewState);
> +   assert (!actx->dirty_state);
>   
>      for (i = 0; i < actx->nr_vbos; i++)
>         ctx->Driver.UnmapBuffer(ctx, actx->vbo[i], MAP_INTERNAL);
>   
>      actx->mapped_vbos = GL_FALSE;
>   }
>   
>   
>   /**
>    * Called via glArrayElement() and glDrawArrays().
> @@ -1766,21 +1767,21 @@ _ae_ArrayElement(GLint elt)
>      GLboolean do_map;
>   
>      /* If PrimitiveRestart is enabled and the index is the RestartIndex
>       * then we call PrimitiveRestartNV and return.
>       */
>      if (ctx->Array.PrimitiveRestart && (elt == ctx->Array.RestartIndex)) {
>         CALL_PrimitiveRestartNV((struct _glapi_table *)disp, ());
>         return;
>      }
>   
> -   if (actx->NewState) {
> +   if (actx->dirty_state) {
>         assert(!actx->mapped_vbos);
>         _ae_update_state(ctx);
>      }
>   
>      /* Determine if we need to map/unmap VBOs */
>      do_map = actx->nr_vbos && !actx->mapped_vbos;
>   
>      if (do_map)
>         _ae_map_vbos(ctx);
>   
> @@ -1801,37 +1802,36 @@ _ae_ArrayElement(GLint elt)
>            + elt * aa->binding->Stride;
>         CALL_by_offset(disp, (array_func), aa->offset, ((const void *) src));
>      }
>   
>      if (do_map)
>         _ae_unmap_vbos(ctx);
>   }
>   
>   
>   void
> -_ae_invalidate_state(struct gl_context *ctx, GLbitfield new_state)
> +_ae_invalidate_state(struct gl_context *ctx)
>   {
>      AEcontext *actx = AE_CONTEXT(ctx);
>   
>      /* Only interested in this subset of mesa state.  Need to prune
>       * this down as both tnl/ and the drivers can raise statechanges
>       * for arcane reasons in the middle of seemingly atomic operations
>       * like DrawElements, over which we'd like to keep a known set of
>       * arrays and vbo's mapped.
>       *
>       * Luckily, neither the drivers nor tnl muck with the state that
>       * concerns us here:
>       */
> -   new_state &= _NEW_ARRAY | _NEW_PROGRAM;
> -   if (new_state) {
> -      assert(!actx->mapped_vbos);
> -      actx->NewState |= new_state;
> -   }
> +   assert(ctx->NewState & (_NEW_ARRAY | _NEW_PROGRAM));
> +
> +   assert(!actx->mapped_vbos);
> +   actx->dirty_state = true;
>   }
>   
>   
>   void
>   _mesa_install_arrayelt_vtxfmt(struct _glapi_table *disp,
>                                 const GLvertexformat *vfmt)
>   {
>      SET_ArrayElement(disp, vfmt->ArrayElement);
>   }
> diff --git a/src/mesa/main/api_arrayelt.h b/src/mesa/main/api_arrayelt.h
> index 9ae79a9..965e0ad 100644
> --- a/src/mesa/main/api_arrayelt.h
> +++ b/src/mesa/main/api_arrayelt.h
> @@ -26,21 +26,21 @@
>   
>   #ifndef API_ARRAYELT_H
>   #define API_ARRAYELT_H
>   
>   
>   #include "main/mtypes.h"
>   
>   
>   extern GLboolean _ae_create_context( struct gl_context *ctx );
>   extern void _ae_destroy_context( struct gl_context *ctx );
> -extern void _ae_invalidate_state( struct gl_context *ctx, GLbitfield new_state );
> +extern void _ae_invalidate_state(struct gl_context *ctx);
>   extern bool _ae_is_state_dirty(struct gl_context *ctx);
>   extern void GLAPIENTRY _ae_ArrayElement( GLint elt );
>   
>   /* May optionally be called before a batch of element calls:
>    */
>   extern void _ae_map_vbos( struct gl_context *ctx );
>   extern void _ae_unmap_vbos( struct gl_context *ctx );
>   
>   extern void
>   _mesa_install_arrayelt_vtxfmt(struct _glapi_table *disp,
> diff --git a/src/mesa/vbo/vbo_context.h b/src/mesa/vbo/vbo_context.h
> index 0418643..2a762c8 100644
> --- a/src/mesa/vbo/vbo_context.h
> +++ b/src/mesa/vbo/vbo_context.h
> @@ -91,28 +91,29 @@ static inline struct vbo_context *vbo_context(struct gl_context *ctx)
>      return ctx->vbo_context;
>   }
>   
>   
>   static inline void
>   vbo_exec_invalidate_state(struct gl_context *ctx)
>   {
>      struct vbo_context *vbo = vbo_context(ctx);
>      struct vbo_exec_context *exec = &vbo->exec;
>   
> -   if (!exec->validating && ctx->NewState & (_NEW_PROGRAM | _NEW_ARRAY)) {
> -      exec->array.recalculate_inputs = GL_TRUE;
> +   if (ctx->NewState & (_NEW_PROGRAM | _NEW_ARRAY)) {
> +      if (!exec->validating)
> +         exec->array.recalculate_inputs = GL_TRUE;
> +
> +      _ae_invalidate_state(ctx);
>      }
>   
>      if (ctx->NewState & _NEW_EVAL)
>         exec->eval.recalculate_maps = GL_TRUE;
> -
> -   _ae_invalidate_state(ctx, ctx->NewState);
>   }
>   
>   
>   /**
>    * Return VP_x token to indicate whether we're running fixed-function
>    * vertex transformation, an NV vertex program or ARB vertex program/shader.
>    */
>   static inline enum vp_mode
>   get_program_mode( struct gl_context *ctx )
>   {
> 


More information about the mesa-dev mailing list