summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Fröhlich <[email protected]>2018-03-16 06:34:35 +0100
committerMathias Fröhlich <[email protected]>2018-03-22 04:58:52 +0100
commitd3c604e12e1e2ef1e562f51e529ba18bae2d9af1 (patch)
treed78452e323095b1f2054a5cad37fc8e9634a9ded
parentc4c56ff303e39f55e7940b33e8afeafa80b26280 (diff)
mesa: Update VAO internal state when setting the _DrawVAO.
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 <[email protected]> Signed-off-by: Mathias Fröhlich <[email protected]>
-rw-r--r--src/mesa/main/arrayobj.c6
-rw-r--r--src/mesa/main/state.c12
-rw-r--r--src/mesa/vbo/vbo_exec_draw.c3
3 files changed, 13 insertions, 8 deletions
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
index 7cb98337198..0d2f7a918ac 100644
--- a/src/mesa/main/arrayobj.c
+++ b/src/mesa/main/arrayobj.c
@@ -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.
+ */
}
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index 6dd7a7ec075..e523bccd0ce 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -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;
}
diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
index 1ed9d5eac0c..3490dbe44da 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -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;