st/mesa: fix zero-sized user vertex buffer bug
authorBrian Paul <brianp@vmware.com>
Mon, 4 Apr 2011 23:24:09 +0000 (17:24 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 4 Apr 2011 23:42:43 +0000 (17:42 -0600)
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

index 40afa43..0eab4f7 100644 (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. */