st/mesa: fix zero-sized user vertex buffer bug

Commit 4c4ab5668c didn't properly
handle the stride==0 case.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=35961
This commit is contained in:
Brian Paul 2011-04-04 17:24:09 -06:00
parent e397b3a7c0
commit 6cab07685f

View file

@ -406,26 +406,36 @@ setup_non_interleaved_attribs(struct gl_context *ctx,
}
else {
/* wrap user data */
uint bytes;
void *ptr;
if (arrays[mesaAttr]->Ptr) {
uint divisor = arrays[mesaAttr]->InstanceDivisor;
uint length = (divisor ? num_instances / divisor : max_index) + 1;
vbuffer[attr].buffer =
pipe_user_buffer_create(pipe->screen,
(void *) arrays[mesaAttr]->Ptr,
stride * length,
PIPE_BIND_VERTEX_BUFFER);
if (stride == 0) {
bytes = _mesa_sizeof_type(arrays[mesaAttr]->Type)
* arrays[mesaAttr]->Size;
}
else {
uint divisor = arrays[mesaAttr]->InstanceDivisor;
uint length = (divisor ? num_instances / divisor : max_index) + 1;
bytes = stride * length;
}
ptr = (void *) arrays[mesaAttr]->Ptr;
}
else {
/* no array, use ctx->Current.Attrib[] value */
uint bytes = sizeof(ctx->Current.Attrib[0]);
vbuffer[attr].buffer =
pipe_user_buffer_create(pipe->screen,
(void *) ctx->Current.Attrib[mesaAttr],
bytes,
PIPE_BIND_VERTEX_BUFFER);
bytes = sizeof(ctx->Current.Attrib[0]);
ptr = (void *) ctx->Current.Attrib[mesaAttr];
stride = 0;
}
assert(ptr);
assert(bytes);
vbuffer[attr].buffer =
pipe_user_buffer_create(pipe->screen, ptr, bytes,
PIPE_BIND_VERTEX_BUFFER);
vbuffer[attr].buffer_offset = 0;
/* Track user vertex buffers. */