gallium: in st_draw_vbo() use ctx->Current.Attrib[] values when arrays are missing...
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 15 Aug 2008 17:50:29 +0000 (11:50 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 15 Aug 2008 17:52:28 +0000 (11:52 -0600)
fixes potential segfaults when vertex arrays are missing

src/mesa/state_tracker/st_draw.c

index cc3d7450a9f98fc87db665d56e83d49f1e0f4464..e1bc108eae232345a0495c5932aa14a0d1250f3f 100644 (file)
@@ -289,6 +289,7 @@ st_draw_vbo(GLcontext *ctx,
    for (attr = 0; attr < vp->num_inputs; attr++) {
       const GLuint mesaAttr = vp->index_to_input[attr];
       struct gl_buffer_object *bufobj = arrays[mesaAttr]->BufferObj;
+      GLsizei stride = arrays[mesaAttr]->StrideB;
 
       if (bufobj && bufobj->Name) {
          /* Attribute data is in a VBO.
@@ -307,17 +308,27 @@ st_draw_vbo(GLcontext *ctx,
          /* attribute data is in user-space memory, not a VBO */
          uint bytes;
        
-         if (!arrays[mesaAttr]->StrideB) {
-            bytes = arrays[mesaAttr]->Size
-                    * _mesa_sizeof_type(arrays[mesaAttr]->Type);
-         } else {
-            bytes = arrays[mesaAttr]->StrideB * (max_index + 1);
+         /* wrap user data */
+         if (arrays[mesaAttr]->Ptr) {
+            /* user's vertex array */
+            if (arrays[mesaAttr]->StrideB) {
+               bytes = arrays[mesaAttr]->StrideB * (max_index + 1);
+            }
+            else {
+               bytes = arrays[mesaAttr]->Size
+                  * _mesa_sizeof_type(arrays[mesaAttr]->Type);
+            }
+            vbuffer[attr].buffer = pipe_user_buffer_create(pipe,
+                           (void *) arrays[mesaAttr]->Ptr, bytes);
+         }
+         else {
+            /* no array, use ctx->Current.Attrib[] value */
+            bytes = sizeof(ctx->Current.Attrib[0]);
+            vbuffer[attr].buffer = pipe_user_buffer_create(pipe,
+                           (void *) ctx->Current.Attrib[mesaAttr], bytes);
+            stride = 0;
          }
 
-         /* wrap user data */
-         vbuffer[attr].buffer
-            = pipe_user_buffer_create(pipe, (void *) arrays[mesaAttr]->Ptr,
-                                      bytes);
          vbuffer[attr].buffer_offset = 0;
          velements[attr].src_offset = 0;
       }
@@ -325,7 +336,7 @@ st_draw_vbo(GLcontext *ctx,
       assert(velements[attr].src_offset <= 2048); /* 11-bit field */
 
       /* common-case setup */
-      vbuffer[attr].pitch = arrays[mesaAttr]->StrideB; /* in bytes */
+      vbuffer[attr].pitch = stride; /* in bytes */
       vbuffer[attr].max_index = max_index;
       velements[attr].vertex_buffer_index = attr;
       velements[attr].nr_components = arrays[mesaAttr]->Size;