From 6cab07685fa48174b310e52b26151a8fb8a8e6dc Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 4 Apr 2011 17:24:09 -0600 Subject: [PATCH] st/mesa: fix zero-sized user vertex buffer bug Commit 4c4ab5668cd6df573db7b065f0493fb80ac70ab8 didn't properly handle the stride==0 case. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=35961 --- src/mesa/state_tracker/st_draw.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 40afa43..0eab4f7 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -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. */ -- 2.7.4