Mesa (master): st/mesa: fix zero-sized user vertex buffer bug

Brian Paul brianp at kemper.freedesktop.org
Mon Apr 4 16:43:11 PDT 2011


Module: Mesa
Branch: master
Commit: 6cab07685fa48174b310e52b26151a8fb8a8e6dc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6cab07685fa48174b310e52b26151a8fb8a8e6dc

Author: Brian Paul <brianp at vmware.com>
Date:   Mon Apr  4 17:24:09 2011 -0600

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 files 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. */



More information about the mesa-commit mailing list