[Mesa-dev] [PATCH V2 4/8] mesa: stop passing state bitfield to UpdateState()

Timothy Arceri tarceri at itsqueeze.com
Wed Jun 7 23:39:26 UTC 2017


The code comment which seems to have been added in cab974cf6c2db
(from year 2000) says:

   "Set ctx->NewState to zero to avoid recursion if
   Driver.UpdateState() has to call FLUSH_VERTICES().  (fixed?)"

As far as I can tell nothing in any of the UpdateState() calls
should cause it to be called recursively.

V2: add a wrapper around the osmesa update function so it can still
    be used internally.
---
 src/mesa/drivers/dri/i915/i915_context.c     | 4 +++-
 src/mesa/drivers/dri/i915/intel_context.c    | 3 ++-
 src/mesa/drivers/dri/i965/brw_context.c      | 3 ++-
 src/mesa/drivers/dri/nouveau/nouveau_state.c | 3 ++-
 src/mesa/drivers/dri/r200/r200_state.c       | 4 +++-
 src/mesa/drivers/dri/radeon/radeon_state.c   | 4 +++-
 src/mesa/drivers/dri/swrast/swrast.c         | 4 +++-
 src/mesa/drivers/osmesa/osmesa.c             | 9 +++++++--
 src/mesa/drivers/x11/xm_dd.c                 | 5 +++--
 src/mesa/drivers/x11/xmesaP.h                | 4 ----
 src/mesa/main/dd.h                           | 2 +-
 src/mesa/main/state.c                        | 7 ++-----
 src/mesa/state_tracker/st_context.c          | 3 ++-
 13 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c
index 6c48823..1406b65 100644
--- a/src/mesa/drivers/dri/i915/i915_context.c
+++ b/src/mesa/drivers/dri/i915/i915_context.c
@@ -45,22 +45,24 @@
 #include "i915_reg.h"
 #include "i915_program.h"
 
 /***************************************
  * Mesa's Driver Functions
  ***************************************/
 
 /* Override intel default.
  */
 static void
-i915InvalidateState(struct gl_context * ctx, GLuint new_state)
+i915InvalidateState(struct gl_context * ctx)
 {
+   GLuint new_state = ctx->NewState;
+
    _swrast_InvalidateState(ctx, new_state);
    _swsetup_InvalidateState(ctx, new_state);
    _vbo_InvalidateState(ctx, new_state);
    _tnl_InvalidateState(ctx, new_state);
    _tnl_invalidate_vertex_state(ctx, new_state);
    intel_context(ctx)->NewGLState |= new_state;
 
    /* Todo: gather state values under which tracked parameters become
     * invalidated, add callbacks for things like
     * ProgramLocalParameters, etc.
diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c
index 5607d5b..6c59b42 100644
--- a/src/mesa/drivers/dri/i915/intel_context.c
+++ b/src/mesa/drivers/dri/i915/intel_context.c
@@ -307,22 +307,23 @@ static const struct debug_control debug_control[] = {
    { "sync",  DEBUG_SYNC},
    { "dri",   DEBUG_DRI },
    { "stats", DEBUG_STATS },
    { "wm",    DEBUG_WM },
    { "aub",   DEBUG_AUB },
    { NULL,    0 }
 };
 
 
 static void
-intelInvalidateState(struct gl_context * ctx, GLuint new_state)
+intelInvalidateState(struct gl_context * ctx)
 {
+   GLuint new_state = ctx->NewState;
     struct intel_context *intel = intel_context(ctx);
 
     if (ctx->swrast_context)
        _swrast_InvalidateState(ctx, new_state);
    _vbo_InvalidateState(ctx, new_state);
 
    intel->NewGLState |= new_state;
 
    if (intel->vtbl.invalidate_state)
       intel->vtbl.invalidate_state( intel, new_state );
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index 3e3fe2d..8525d53 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -215,22 +215,23 @@ intel_texture_view_requires_resolve(struct brw_context *brw,
               _mesa_get_format_name(intel_tex->mt->format));
 
    if (intel_disable_rb_aux_buffer(brw, intel_tex->mt->bo))
       perf_debug("Sampling renderbuffer with non-compressible format - "
                  "turning off compression");
 
    return true;
 }
 
 static void
-intel_update_state(struct gl_context * ctx, GLuint new_state)
+intel_update_state(struct gl_context * ctx)
 {
+   GLuint new_state = ctx->NewState;
    struct brw_context *brw = brw_context(ctx);
    struct intel_texture_object *tex_obj;
    struct intel_renderbuffer *depth_irb;
 
    if (ctx->swrast_context)
       _swrast_InvalidateState(ctx, new_state);
    _vbo_InvalidateState(ctx, new_state);
 
    brw->NewGLState |= new_state;
 
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c
index de36fa4..567f32f 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_state.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c
@@ -444,22 +444,23 @@ nouveau_state_emit(struct gl_context *ctx)
 
 	while ((i = nouveau_next_dirty_state(ctx)) >= 0) {
 		BITSET_CLEAR(nctx->dirty, i);
 		drv->emit[i](ctx, i);
 	}
 
 	BITSET_ZERO(nctx->dirty);
 }
 
 static void
-nouveau_update_state(struct gl_context *ctx, GLbitfield new_state)
+nouveau_update_state(struct gl_context *ctx)
 {
+	GLbitfield new_state = ctx->NewState;
 	int i;
 
 	if (new_state & (_NEW_PROJECTION | _NEW_MODELVIEW))
 		context_dirty(ctx, PROJECTION);
 
 	if (new_state & _NEW_MODELVIEW)
 		context_dirty(ctx, MODELVIEW);
 
 	if (new_state & _NEW_TEXTURE_MATRIX) {
 		for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
diff --git a/src/mesa/drivers/dri/r200/r200_state.c b/src/mesa/drivers/dri/r200/r200_state.c
index 9fb15f2..d5a6f09 100644
--- a/src/mesa/drivers/dri/r200/r200_state.c
+++ b/src/mesa/drivers/dri/r200/r200_state.c
@@ -2269,22 +2269,24 @@ GLboolean r200ValidateState( struct gl_context *ctx )
 	 r200SetupVertexProg( ctx );
       }
       else TCL_FALLBACK(ctx, R200_TCL_FALLBACK_VERTEX_PROGRAM, 0);
    }
 
    rmesa->radeon.NewGLState = 0;
    return GL_TRUE;
 }
 
 
-static void r200InvalidateState( struct gl_context *ctx, GLuint new_state )
+static void r200InvalidateState(struct gl_context *ctx)
 {
+   GLuint new_state = ctx->NewState;
+
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
 
    _swrast_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
    _vbo_InvalidateState( ctx, new_state );
    _tnl_InvalidateState( ctx, new_state );
    R200_CONTEXT(ctx)->radeon.NewGLState |= new_state;
 
    if (new_state & _NEW_PROGRAM)
       rmesa->curr_vp_hw = NULL;
diff --git a/src/mesa/drivers/dri/radeon/radeon_state.c b/src/mesa/drivers/dri/radeon/radeon_state.c
index 1baf229..ff2a708 100644
--- a/src/mesa/drivers/dri/radeon/radeon_state.c
+++ b/src/mesa/drivers/dri/radeon/radeon_state.c
@@ -2037,22 +2037,24 @@ GLboolean radeonValidateState( struct gl_context *ctx )
 	 radeonUpdateClipPlanes( ctx );
    }
 
 
    rmesa->radeon.NewGLState = 0;
 
    return GL_TRUE;
 }
 
 
-static void radeonInvalidateState( struct gl_context *ctx, GLuint new_state )
+static void radeonInvalidateState(struct gl_context *ctx)
 {
+   GLuint new_state = ctx->NewState;
+
    _swrast_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
    _vbo_InvalidateState( ctx, new_state );
    _tnl_InvalidateState( ctx, new_state );
    R100_CONTEXT(ctx)->radeon.NewGLState |= new_state;
 }
 
 
 /* A hack.  Need a faster way to find this out.
  */
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index de1fe4c..a68f7a0 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -690,22 +690,24 @@ get_string(struct gl_context *ctx, GLenum pname)
 	case GL_VENDOR:
 	    return (const GLubyte *) swrast_vendor_string;
 	case GL_RENDERER:
 	    return (const GLubyte *) swrast_renderer_string;
 	default:
 	    return NULL;
     }
 }
 
 static void
-update_state( struct gl_context *ctx, GLuint new_state )
+update_state(struct gl_context *ctx)
 {
+    GLuint new_state = ctx->NewState;
+
     /* not much to do here - pass it on */
     _swrast_InvalidateState( ctx, new_state );
     _swsetup_InvalidateState( ctx, new_state );
     _vbo_InvalidateState( ctx, new_state );
     _tnl_InvalidateState( ctx, new_state );
 }
 
 static void
 viewport(struct gl_context *ctx)
 {
diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c
index a3d4fac..ed69353 100644
--- a/src/mesa/drivers/osmesa/osmesa.c
+++ b/src/mesa/drivers/osmesa/osmesa.c
@@ -110,29 +110,34 @@ get_string( struct gl_context *ctx, GLenum name )
 #else
          return (const GLubyte *) "Mesa OffScreen";
 #endif
       default:
          return NULL;
    }
 }
 
 
 static void
-osmesa_update_state( struct gl_context *ctx, GLuint new_state )
+osmesa_update_state(struct gl_context *ctx, GLuint new_state)
 {
    /* easy - just propogate */
    _swrast_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
    _tnl_InvalidateState( ctx, new_state );
    _vbo_InvalidateState( ctx, new_state );
 }
 
+static void
+osmesa_update_state_wrapper(struct gl_context *ctx)
+{
+   osmesa_update_state(ctx, ctx->NewState);
+}
 
 
 /**
  * Macros for optimized line/triangle rendering.
  * Only for 8-bit channel, RGBA, BGRA, ARGB formats.
  */
 
 #define PACK_RGBA(DST, R, G, B, A)	\
 do {					\
    (DST)[osmesa->rInd] = R;		\
@@ -821,21 +826,21 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
                                                );
       if (!osmesa->gl_visual) {
          free(osmesa);
          return NULL;
       }
 
       /* Initialize device driver function table */
       _mesa_init_driver_functions(&functions);
       /* override with our functions */
       functions.GetString = get_string;
-      functions.UpdateState = osmesa_update_state;
+      functions.UpdateState = osmesa_update_state_wrapper;
 
       if (!_mesa_initialize_context(&osmesa->mesa,
                                     api_profile,
                                     osmesa->gl_visual,
                                     sharelist ? &sharelist->mesa
                                               : (struct gl_context *) NULL,
                                     &functions)) {
          _mesa_destroy_visual( osmesa->gl_visual );
          free(osmesa);
          return NULL;
diff --git a/src/mesa/drivers/x11/xm_dd.c b/src/mesa/drivers/x11/xm_dd.c
index cd5809e..e06831c 100644
--- a/src/mesa/drivers/x11/xm_dd.c
+++ b/src/mesa/drivers/x11/xm_dd.c
@@ -671,23 +671,24 @@ enable( struct gl_context *ctx, GLenum pname, GLboolean state )
       default:
          ;  /* silence compiler warning */
    }
 }
 
 
 /**
  * Called when the driver should update its state, based on the new_state
  * flags.
  */
-void
-xmesa_update_state( struct gl_context *ctx, GLbitfield new_state )
+static void
+xmesa_update_state(struct gl_context *ctx)
 {
+   GLbitfield new_state = ctx->NewState;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
 
    /* Propagate statechange information to swrast and swrast_setup
     * modules.  The X11 driver has no internal GL-dependent state.
     */
    _swrast_InvalidateState( ctx, new_state );
    _tnl_InvalidateState( ctx, new_state );
    _vbo_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
 
diff --git a/src/mesa/drivers/x11/xmesaP.h b/src/mesa/drivers/x11/xmesaP.h
index 6cd020f..40d6734 100644
--- a/src/mesa/drivers/x11/xmesaP.h
+++ b/src/mesa/drivers/x11/xmesaP.h
@@ -347,24 +347,20 @@ xmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
                       GLuint *width, GLuint *height);
 
 extern void
 xmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer);
 
 extern void
 xmesa_init_driver_functions( XMesaVisual xmvisual,
                              struct dd_function_table *driver );
 
 extern void
-xmesa_update_state( struct gl_context *ctx, GLbitfield new_state );
-
-
-extern void
 xmesa_MapRenderbuffer(struct gl_context *ctx,
                       struct gl_renderbuffer *rb,
                       GLuint x, GLuint y, GLuint w, GLuint h,
                       GLbitfield mode,
                       GLubyte **mapOut, GLint *rowStrideOut);
 
 extern void
 xmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb);
 
 extern void
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 3f31025..0b262d0 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -86,21 +86,21 @@ struct dd_function_table {
     * returned.
     */
    const GLubyte * (*GetString)( struct gl_context *ctx, GLenum name );
 
    /**
     * Notify the driver after Mesa has made some internal state changes.  
     *
     * This is in addition to any state change callbacks Mesa may already have
     * made.
     */
-   void (*UpdateState)( struct gl_context *ctx, GLbitfield new_state );
+   void (*UpdateState)(struct gl_context *ctx);
 
    /**
     * This is called whenever glFinish() is called.
     */
    void (*Finish)( struct gl_context *ctx );
 
    /**
     * This is called whenever glFlush() is called.
     */
    void (*Flush)( struct gl_context *ctx );
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index 73872b8..1de1d69 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -408,27 +408,24 @@ _mesa_update_state_locked( struct gl_context *ctx )
       _mesa_update_vao_client_arrays(ctx, ctx->Array.VAO);
 
  out:
    new_prog_state |= update_program_constants(ctx);
 
    /*
     * Give the driver a chance to act upon the new_state flags.
     * The driver might plug in different span functions, for example.
     * Also, this is where the driver can invalidate the state of any
     * active modules (such as swrast_setup, swrast, tnl, etc).
-    *
-    * Set ctx->NewState to zero to avoid recursion if
-    * Driver.UpdateState() has to call FLUSH_VERTICES().  (fixed?)
     */
-   new_state = ctx->NewState | new_prog_state;
+   ctx->NewState |= new_prog_state;
+   ctx->Driver.UpdateState(ctx);
    ctx->NewState = 0;
-   ctx->Driver.UpdateState(ctx, new_state);
    ctx->Array.VAO->NewArrays = 0x0;
 }
 
 
 /* This is the usual entrypoint for state updates:
  */
 void
 _mesa_update_state( struct gl_context *ctx )
 {
    _mesa_lock_context_textures(ctx);
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 3207e95..058d9c3 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -158,22 +158,23 @@ st_get_active_states(struct gl_context *ctx)
 
    /* Mark non-shader-resource shader states as "always active". */
    return active_shader_states | ~ST_ALL_SHADER_RESOURCES;
 }
 
 
 /**
  * Called via ctx->Driver.UpdateState()
  */
 static void
-st_invalidate_state(struct gl_context * ctx, GLbitfield new_state)
+st_invalidate_state(struct gl_context * ctx)
 {
+   GLbitfield new_state = ctx->NewState;
    struct st_context *st = st_context(ctx);
 
    if (new_state & _NEW_BUFFERS) {
       st_invalidate_buffers(st);
    } else {
       /* These set a subset of flags set by _NEW_BUFFERS, so we only have to
        * check them when _NEW_BUFFERS isn't set.
        */
       if (new_state & (_NEW_DEPTH |
                        _NEW_STENCIL))
-- 
2.9.4



More information about the mesa-dev mailing list