st: reduce unnecessary calls to pipe->set_vertex_buffers()
authorKeith Whitwell <keith@tungstengraphics.com>
Wed, 10 Dec 2008 15:43:21 +0000 (15:43 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 11 Dec 2008 14:02:10 +0000 (14:02 +0000)
src/mesa/state_tracker/st_draw.c

index 8f27076848a3a7d418faa5a0635afb37d8c8f0eb..3229e93248468abd00e85462da8c03db38ecd37d 100644 (file)
@@ -409,6 +409,7 @@ setup_non_interleaved_attribs(GLcontext *ctx,
                               const struct st_vertex_program *vp,
                               const struct gl_client_array **arrays,
                               GLuint max_index,
+                              GLboolean *userSpace,
                               struct pipe_vertex_buffer vbuffer[],
                               struct pipe_vertex_element velements[])
 {
@@ -420,6 +421,8 @@ setup_non_interleaved_attribs(GLcontext *ctx,
       struct gl_buffer_object *bufobj = arrays[mesaAttr]->BufferObj;
       GLsizei stride = arrays[mesaAttr]->StrideB;
 
+      *userSpace = GL_FALSE;
+
       if (bufobj && bufobj->Name) {
          /* Attribute data is in a VBO.
           * Recall that for VBOs, the gl_client_array->Ptr field is
@@ -439,6 +442,8 @@ setup_non_interleaved_attribs(GLcontext *ctx,
          uint bytes;
          /*printf("user-space array %d stride %d\n", attr, stride);*/
        
+         *userSpace = GL_TRUE;
+
          /* wrap user data */
          if (arrays[mesaAttr]->Ptr) {
             /* user's vertex array */
@@ -555,7 +560,7 @@ st_draw_vbo(GLcontext *ctx,
    else {
       /*printf("Draw non-interleaved\n");*/
       setup_non_interleaved_attribs(ctx, vp, arrays, max_index,
-                                    vbuffer, velements);
+                                    &userSpace, vbuffer, velements);
       num_vbuffers = vp->num_inputs;
       num_velements = vp->num_inputs;
    }
@@ -665,13 +670,17 @@ st_draw_vbo(GLcontext *ctx,
    }
 
    /* unreference buffers (frees wrapped user-space buffer objects) */
-   for (attr = 0; attr < num_vbuffers; attr++) {
-      pipe_buffer_reference(pipe->screen, &vbuffer[attr].buffer, NULL);
-      assert(!vbuffer[attr].buffer);
+   if (userSpace) 
+   {
+      for (attr = 0; attr < num_vbuffers; attr++) {
+         pipe_buffer_reference(pipe->screen, &vbuffer[attr].buffer, NULL);
+         assert(!vbuffer[attr].buffer);
+      }
+      pipe->set_vertex_buffers(pipe, 0, NULL);
    }
-   pipe->set_vertex_buffers(pipe, num_vbuffers, vbuffer);
 }
 
+
 void st_init_draw( struct st_context *st )
 {
    GLcontext *ctx = st->ctx;