Previous code was trying to optimise to call set_vertex_buffers on
big packets, and thus avoids as many calls as possible.
However in practice doing so won't be faster (drivers implement
set_vertex_buffers by a loop over the buffers we want to bind)
When we want to unbind a buffer, we were calling set_vertex_buffers
on a buffer with vtxbuf->buffer = NULL. It works on some drivers,
but not on all of them, because it isn't in Gallium spec.
This patch fixes that.
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
uint32_t mask = state->changed.vtxbuf;
unsigned i;
unsigned start;
- unsigned count = 0;
DBG("mask=%x\n", mask);
for (i = 0; mask; mask >>= 1, ++i) {
if (mask & 1) {
- if (!count)
- start = i;
- ++count;
- } else {
- if (count)
- pipe->set_vertex_buffers(pipe, start, count,
- &state->vtxbuf[start]);
- count = 0;
+ if (state->vtxbuf[i].buffer)
+ pipe->set_vertex_buffers(pipe, i, 1, &state->vtxbuf[i]);
+ else
+ pipe->set_vertex_buffers(pipe, i, 1, NULL);
}
}
- if (count)
- pipe->set_vertex_buffers(pipe, start, count, &state->vtxbuf[start]);
state->changed.vtxbuf = 0;
}