mesa/st: cope with non-ibo index data in st_draw_feedback.c
authorKeith Whitwell <keithw@vmware.com>
Thu, 7 May 2009 10:46:08 +0000 (11:46 +0100)
committerKeith Whitwell <keithw@vmware.com>
Fri, 8 May 2009 13:57:30 +0000 (14:57 +0100)
Previously only non-indexed or indicies-in-a-vbo cases were handled in
this code.  This change adds the missing regular indices-in-memory
case.

src/mesa/state_tracker/st_draw_feedback.c

index e533afd051e578b23bdce0254d8699c005b005a3..32502a9cda4752951d8fc77b65477a7bfa83ef25 100644 (file)
@@ -196,13 +196,10 @@ st_feedback_draw_vbo(GLcontext *ctx,
    draw_set_vertex_elements(draw, vp->num_inputs, velements);
 
    if (ib) {
-      unsigned indexSize;
       struct gl_buffer_object *bufobj = ib->obj;
-      struct st_buffer_object *stobj = st_buffer_object(bufobj);
+      unsigned indexSize;
       void *map;
 
-      index_buffer_handle = stobj->buffer;
-
       switch (ib->type) {
       case GL_UNSIGNED_INT:
          indexSize = 4;
@@ -215,9 +212,19 @@ st_feedback_draw_vbo(GLcontext *ctx,
         return;
       }
 
-      map = pipe_buffer_map(pipe->screen, index_buffer_handle,
-                            PIPE_BUFFER_USAGE_CPU_READ);
-      draw_set_mapped_element_buffer(draw, indexSize, map);
+      if (bufobj && bufobj->Name) {
+         struct st_buffer_object *stobj = st_buffer_object(bufobj);
+
+         index_buffer_handle = stobj->buffer;
+
+         map = pipe_buffer_map(pipe->screen, index_buffer_handle,
+                               PIPE_BUFFER_USAGE_CPU_READ);
+
+         draw_set_mapped_element_buffer(draw, indexSize, map);
+      }
+      else {
+         draw_set_mapped_element_buffer(draw, indexSize, (void *) ib->ptr);
+      }
    }
    else {
       /* no index/element buffer */
@@ -252,7 +259,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
          draw_set_mapped_vertex_buffer(draw, i, NULL);
       }
    }
-   if (ib) {
+   if (index_buffer_handle) {
       pipe_buffer_unmap(pipe->screen, index_buffer_handle);
       draw_set_mapped_element_buffer(draw, 0, NULL);
    }