If you address Brian's comments, patches 1, 4-8 are: Reviewed-by: Marek Olšák <marek.ol...@amd.com>
Marek On Wed, Jun 7, 2017 at 8:02 AM, Timothy Arceri <tarc...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev