mesa: Update VAO internal state when setting the _DrawVAO.
authorMathias Fröhlich <mathias.froehlich@web.de>
Fri, 16 Mar 2018 05:34:35 +0000 (06:34 +0100)
committerMathias Fröhlich <Mathias.Froehlich@gmx.net>
Thu, 22 Mar 2018 03:58:52 +0000 (04:58 +0100)
Update the VAO internal state on Array._DrawVAO instead of
Array.VAO. Also the VAO internal state update gets triggered now
by a change of Array._DrawVAO instead of the _NEW_ARRAY state flag.
Also no driver looks at any VAO's NewArrays value from within
the Driver.UpdateState callback. So it should be safe to move
this update into the _mesa_set_draw_vao method.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
src/mesa/main/arrayobj.c
src/mesa/main/state.c
src/mesa/vbo/vbo_exec_draw.c

index 7cb983371984eed73c4e91164db7203794afaa9a..0d2f7a918ac05b93242311c9fd73e38c49244dd0 100644 (file)
@@ -461,6 +461,12 @@ _mesa_update_vao_derived_arrays(struct gl_context *ctx,
 {
    /* Make sure we do not run into problems with shared objects */
    assert(!vao->SharedAndImmutable || vao->NewArrays == 0);
+
+   /*
+    * Stay tuned, the next series scans for duplicate bindings in this
+    * function. So that drivers can easily know the minimum unique set
+    * of bindings.
+    */
 }
 
 
index 6dd7a7ec07516b43f0353e7d9226f12155f95609..e523bccd0ce375a258220dc14367191f5a20e4c3 100644 (file)
@@ -360,9 +360,6 @@ _mesa_update_state_locked( struct gl_context *ctx )
          update_program(ctx);
    }
 
-   if (new_state & _NEW_ARRAY)
-      _mesa_update_vao_derived_arrays(ctx, ctx->Array.VAO);
-
  out:
    new_prog_state |= update_program_constants(ctx);
 
@@ -377,7 +374,6 @@ _mesa_update_state_locked( struct gl_context *ctx )
     */
    ctx->Driver.UpdateState(ctx);
    ctx->NewState = 0;
-   ctx->Array.VAO->NewArrays = 0x0;
 }
 
 
@@ -496,8 +492,14 @@ _mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
    struct gl_vertex_array_object **ptr = &ctx->Array._DrawVAO;
    if (*ptr != vao) {
       _mesa_reference_vao_(ctx, ptr, vao);
+
       ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-   } else if (vao->NewArrays) {
+   }
+
+   if (vao->NewArrays) {
+      _mesa_update_vao_derived_arrays(ctx, vao);
+      vao->NewArrays = 0;
+
       ctx->NewDriverState |= ctx->DriverFlags.NewArray;
    }
 
index 1ed9d5eac0c5a01151e253cbfff9a3597726bb60..3490dbe44da101751c7f4e1ff3f0eb100a772634 100644 (file)
@@ -231,9 +231,6 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
    assert(!_mesa_is_bufferobj(exec->vtx.bufferobj) ||
           (vao_enabled & ~vao->VertexAttribBufferMask) == 0);
 
-   _mesa_update_vao_derived_arrays(ctx, vao);
-   vao->NewArrays = 0;
-
    _mesa_set_draw_vao(ctx, vao, _vbo_get_vao_filter(mode));
    /* The exec VAO is not immutable, so we need to set manually */
    ctx->NewDriverState |= ctx->DriverFlags.NewArray;