implement DrawElements, still some rough spots
authorBrian <brian.paul@tungstengraphics.com>
Mon, 20 Aug 2007 18:52:33 +0000 (12:52 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 20 Aug 2007 18:52:33 +0000 (12:52 -0600)
src/mesa/state_tracker/st_draw.c

index db24b24fa7e967cf78159e77baa5ecd5017ec5f0..e82f7cff2b2c3b23bf32568687883590350cbbb4 100644 (file)
@@ -249,8 +249,41 @@ draw_vbo(GLcontext *ctx,
    }
 
    /* do actual drawing */
-   for (i = 0; i < nr_prims; i++) {
-      pipe->draw_arrays(pipe, prims[i].mode, prims[i].start, prims[i].count);
+   if (ib) {
+      /* indexed primitive */
+      struct gl_buffer_object *bufobj = ib->obj;
+      struct pipe_buffer_handle *bh = NULL;
+      unsigned indexSize;
+
+      if (bufobj && bufobj->Name) {
+         /* elements/indexes are in a real VBO */
+         struct st_buffer_object *stobj = st_buffer_object(bufobj);
+         bh = stobj->buffer;
+         switch (ib->type) {
+         case GL_UNSIGNED_INT:
+            indexSize = 4;
+            break;
+         case GL_UNSIGNED_SHORT:
+            indexSize = 2;
+            break;
+         default:
+            assert(0);
+         }
+      }
+      else {
+         assert(0);
+      }
+
+      for (i = 0; i < nr_prims; i++) {
+         pipe->draw_elements(pipe, bh, indexSize,
+                              prims[i].mode, prims[i].start, prims[i].count);
+      }
+   }
+   else {
+      /* non-indexed */
+      for (i = 0; i < nr_prims; i++) {
+         pipe->draw_arrays(pipe, prims[i].mode, prims[i].start, prims[i].count);
+      }
    }
 }