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

Marek Olšák maraeo at gmail.com
Thu Jun 8 20:56:07 UTC 2017


If you address Brian's comments, patches 1, 4-8 are:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Jun 7, 2017 at 8:02 AM, Timothy Arceri <tarceri at itsqueeze.com> 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 )
>  {
> --
> 2.9.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list