st: reduce unnecessary calls to pipe->set_vertex_buffers()

This commit is contained in:
Keith Whitwell 2008-12-10 15:43:21 +00:00
parent 8627a14ec8
commit eb20e2984e

View file

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