mesa: stop passing state bitfield to UpdateState()
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 7 Jun 2017 02:19:13 +0000 (12:19 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 8 Jun 2017 23:13:46 +0000 (09:13 +1000)
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.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
13 files changed:
src/mesa/drivers/dri/i915/i915_context.c
src/mesa/drivers/dri/i915/intel_context.c
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/nouveau/nouveau_state.c
src/mesa/drivers/dri/r200/r200_state.c
src/mesa/drivers/dri/radeon/radeon_state.c
src/mesa/drivers/dri/swrast/swrast.c
src/mesa/drivers/osmesa/osmesa.c
src/mesa/drivers/x11/xm_dd.c
src/mesa/drivers/x11/xmesaP.h
src/mesa/main/dd.h
src/mesa/main/state.c
src/mesa/state_tracker/st_context.c

index 6c4882378f454752555d0bc6375223208f89c8ce..1406b65b654a05ba8b7a77ea74832ba978dbd90f 100644 (file)
 /* 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);
index 5607d5b5b6981cd47238070392a0f6db9259cd9f..6c59b425a91ddc57d6c4e6ee399e4b7f6a9aae84 100644 (file)
@@ -314,8 +314,9 @@ static const struct debug_control debug_control[] = {
 
 
 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)
index 92490f728faa09b07ee8bd418667d7aabeb46d68..81166450b90a0fdc87f2c688e65f1e1ccf2af3e7 100644 (file)
@@ -187,8 +187,9 @@ intel_disable_rb_aux_buffer(struct brw_context *brw, const struct brw_bo *bo)
 }
 
 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;
index de36fa41b59129088cb7850da75ea6f4c70206d3..567f32fa431d3ce27913a341dd4d0c7b4deefaf0 100644 (file)
@@ -451,8 +451,9 @@ nouveau_state_emit(struct gl_context *ctx)
 }
 
 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))
index 9fb15f24908bf9970da832b649de53fd681e8914..d5a6f0917493e084e6873d38dbc672aa00bb284e 100644 (file)
@@ -2276,8 +2276,10 @@ GLboolean r200ValidateState( struct gl_context *ctx )
 }
 
 
-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 );
index 1baf229e647fb76ba46f9adb77e61a5371c56b51..ff2a7089dd2b2a4aee565abf9108920ae836544c 100644 (file)
@@ -2044,8 +2044,10 @@ GLboolean radeonValidateState( struct gl_context *ctx )
 }
 
 
-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 );
index de1fe4c918c49bbdb3f8e569151c804cbf403937..a68f7a0b96a2bb054410930651210ddc1999d743 100644 (file)
@@ -697,8 +697,10 @@ get_string(struct gl_context *ctx, GLenum pname)
 }
 
 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 );
index a3d4facdea0b13dd775fbd2fa8a758a8cd06aed0..ed69353743a1f2637b7784e70fa4ec1e35459b5b 100644 (file)
@@ -117,7 +117,7 @@ get_string( struct gl_context *ctx, GLenum name )
 
 
 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 );
@@ -126,6 +126,11 @@ osmesa_update_state( struct gl_context *ctx, GLuint new_state )
    _vbo_InvalidateState( ctx, new_state );
 }
 
+static void
+osmesa_update_state_wrapper(struct gl_context *ctx)
+{
+   osmesa_update_state(ctx, ctx->NewState);
+}
 
 
 /**
@@ -828,7 +833,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
       _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,
index cd5809e070ee00fda6f0b5506625e7bd214a90c5..e06831ca7776ce289d9ad1e405d080489ff0cfc2 100644 (file)
@@ -678,9 +678,10 @@ enable( struct gl_context *ctx, GLenum pname, GLboolean state )
  * 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
index 9320442f46abbafb031715f470774618e82eed76..ff3ddc4ddd0ad35628ff1db346a0bbbfda2cfdea 100644 (file)
@@ -353,10 +353,6 @@ 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,
index 3f3102546dfc636337fe941489398ce9d3c34f31..0b262d0b466b508dcb4f2c2dc11a142d66e781b9 100644 (file)
@@ -93,7 +93,7 @@ struct dd_function_table {
     * 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.
index d534f554bad1d1db17e52d26de0b6d0d838a6bc2..04dafa983c5045f833628af236b529493ebe2c31 100644 (file)
@@ -415,13 +415,10 @@ _mesa_update_state_locked( struct gl_context *ctx )
     * 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;
 }
 
index 33bc16713c6112a0f49cf9031d2cb682b493a49e..0e768ea9e44dd7dcba56e4414175b2753ffee9b7 100644 (file)
@@ -182,8 +182,9 @@ st_invalidate_buffers(struct st_context *st)
  * 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) {