vbo: bind arrays only when necessary
authorMarek Olšák <maraeo@gmail.com>
Sat, 12 Feb 2011 02:57:19 +0000 (03:57 +0100)
committerMarek Olšák <maraeo@gmail.com>
Mon, 14 Feb 2011 20:50:07 +0000 (21:50 +0100)
We don't need to call bind_arrays in the vbo module if the states
which the function depends on are not dirty.

src/mesa/main/mtypes.h
src/mesa/main/state.c
src/mesa/vbo/vbo_exec_array.c

index 09e17d9110516de95592a5391cef08c4df1a398a..b7473e1ca8d7f4524b7df4d57351921ed7167e6c 100644 (file)
@@ -1643,6 +1643,7 @@ struct gl_array_attrib
    GLuint RestartIndex;
 
    GLbitfield NewState;                /**< mask of _NEW_ARRAY_* values */
+   GLboolean RebindArrays; /**< whether the VBO module should rebind arrays */
 
    /* GL_ARB_vertex_buffer_object */
    struct gl_buffer_object *ArrayBufferObj;
index cce1b464f0cae2ccb56ff1d1f02717b776539188..502c429294cc556667e9176abcf2110c8b444bf4 100644 (file)
@@ -662,6 +662,8 @@ _mesa_update_state_locked( struct gl_context *ctx )
    ctx->NewState = 0;
    ctx->Driver.UpdateState(ctx, new_state);
    ctx->Array.NewState = 0;
+   if (!ctx->Array.RebindArrays)
+      ctx->Array.RebindArrays = (new_state & (_NEW_ARRAY | _NEW_PROGRAM)) != 0;
 }
 
 
index 80085c17c5cd13aa4712a6b28935e31d81e65703..6749541b77f473de3f7e6083d53abe72ad9c7bc0 100644 (file)
@@ -502,8 +502,13 @@ recalculate_input_bindings(struct gl_context *ctx)
 static void
 bind_arrays(struct gl_context *ctx)
 {
+   if (!ctx->Array.RebindArrays) {
+      return;
+   }
+
    bind_array_obj(ctx);
    recalculate_input_bindings(ctx);
+   ctx->Array.RebindArrays = GL_FALSE;
 }