mesa: fast-track glColor and similar calls when not immediate mode rendering
authorKeith Whitwell <keith@tungstengraphics.com>
Mon, 10 Mar 2008 19:44:54 +0000 (19:44 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Mon, 10 Mar 2008 23:31:50 +0000 (23:31 +0000)
Often these are mixed in with draw arrays calls, etc.  Try not to get
the whole immediate rendering state machine going when we receive one
of these on their own.

src/mesa/vbo/vbo_exec_api.c

index b7f4d8a..35dc0e7 100644 (file)
@@ -309,16 +309,23 @@ static void vbo_exec_fixup_vertex( GLcontext *ctx,
                                   GLuint attr, GLuint sz )
 {
    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
+   static const GLfloat id[4] = { 0, 0, 0, 1 };
    int i;
 
-   if (sz > exec->vtx.attrsz[attr]) {
+   if (exec->vtx.prim_count == 0) {
+      GLfloat *current = (GLfloat *)vbo_context(ctx)->currval[attr].Ptr;
+      exec->vtx.attrptr[attr] = current;
+      memcpy(current, id, sizeof(id));
+      ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
+      return;
+   }
+   else if (sz > exec->vtx.attrsz[attr]) {
       /* New size is larger.  Need to flush existing vertices and get
        * an enlarged vertex format.
        */
       vbo_exec_wrap_upgrade_vertex( exec, attr, sz );
    }
    else if (sz < exec->vtx.active_sz[attr]) {
-      static const GLfloat id[4] = { 0, 0, 0, 1 };
 
       /* New size is smaller - just need to fill in some
        * zeros.  Don't need to flush or wrap.