implement draw_elements()
authorBrian <brian.paul@tungstengraphics.com>
Mon, 20 Aug 2007 18:52:00 +0000 (12:52 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 20 Aug 2007 18:52:00 +0000 (12:52 -0600)
src/mesa/pipe/p_context.h
src/mesa/pipe/softpipe/sp_context.c
src/mesa/pipe/softpipe/sp_draw_arrays.c
src/mesa/pipe/softpipe/sp_state.h

index 320b4877c3e0658f2bc3f0f5e0cc763494cf52eb..a3664a3b80c0b155e05f646be4d05409c21fe5d0 100644 (file)
@@ -82,6 +82,11 @@ struct pipe_context {
    void (*draw_arrays)( struct pipe_context *pipe,
                         unsigned mode, unsigned start, unsigned count);
 
+   void (*draw_elements)( struct pipe_context *pipe,
+                          struct pipe_buffer_handle *indexBuffer,
+                          unsigned indexSize,
+                          unsigned mode, unsigned start, unsigned count);
+
    /** Clear a surface to given value (no scissor; clear whole surface) */
    void (*clear)(struct pipe_context *pipe, struct pipe_surface *ps,
                  unsigned clearValue);
index ea2f0ec04f9cfac9306f9545b9f0a7b450d8cf25..e7694bbe867f6b520a0eb1ec3f98700d976c7220 100644 (file)
@@ -288,6 +288,7 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
    softpipe->pipe.draw_vb = softpipe_draw_vb;
    softpipe->pipe.draw_vertices = softpipe_draw_vertices;
    softpipe->pipe.draw_arrays = softpipe_draw_arrays;
+   softpipe->pipe.draw_elements = softpipe_draw_elements;
 
    softpipe->pipe.clear = softpipe_clear;
    softpipe->pipe.flush = softpipe_flush;
index ce5d4e0cbc7f5fa655e416cf6fa0cde557fbeaf9..6213286f4761d960baf3858f1507e939a2a1553b 100644 (file)
@@ -316,9 +316,32 @@ void
 softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
                      unsigned start, unsigned count)
 {
+   softpipe_draw_elements(pipe, NULL, 0, mode, start, count);
+}
+
+
+
+/**
+ * XXX should the element buffer be specified/bound with a separate function?
+ */
+void
+softpipe_draw_elements(struct pipe_context *pipe,
+                       struct pipe_buffer_handle *indexBuffer,
+                       unsigned indexSize,
+                       unsigned mode, unsigned start, unsigned count)
+{
+
    struct softpipe_context *sp = softpipe_context(pipe);
    struct draw_context *draw = sp->draw;
    unsigned length, first, incr, i;
+   void *mapped_indexes = NULL;
+
+   /* first, check that the primitive is not malformed */
+   draw_prim_info( mode, &first, &incr );
+   length = draw_trim( count, first, incr );
+   if (!length)
+      return;
+
 
    if (sp->dirty)
       softpipe_update_derived( sp );
@@ -336,6 +359,16 @@ softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
                                        PIPE_BUFFER_FLAG_READ);
       }
    }
+   /* Map index buffer, if present */
+   if (indexBuffer) {
+      mapped_indexes = pipe->winsys->buffer_map(pipe->winsys,
+                                                indexBuffer,
+                                                PIPE_BUFFER_FLAG_READ);
+      draw_set_element_buffer(draw, indexSize, mapped_indexes);
+   }
+   else {
+      draw_set_element_buffer(draw, 0, NULL);  /* no index/element buffer */
+   }
 
    /* tell drawing pipeline we're beginning drawing */
    draw->pipeline.first->begin( draw->pipeline.first );
@@ -345,14 +378,10 @@ softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
 
    draw_invalidate_vcache( draw );
 
-   draw_set_element_buffer(draw, 0, NULL);  /* no index/element buffer */
+   draw_set_prim( draw, mode );
 
-   draw_prim_info( mode, &first, &incr );
-   length = draw_trim( count, first, incr );
-   if (length) {
-      draw_set_prim( draw, mode );
-      draw_prim(draw, start, count);
-   }
+   /* drawing done here: */
+   draw_prim(draw, start, count);
 
    /* draw any left-over buffered prims */
    draw_flush(draw);
@@ -361,13 +390,16 @@ softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
    draw->pipeline.first->end( draw->pipeline.first );
 
    /*
-    * unmap vertex buffers
+    * unmap vertex/index buffers
     */
    for (i = 0; i < PIPE_ATTRIB_MAX; i++) {
       if (sp->vertex_buffer[i].buffer) {
          pipe->winsys->buffer_unmap(pipe->winsys, sp->vertex_buffer[i].buffer);
       }
    }
+   if (indexBuffer) {
+      pipe->winsys->buffer_unmap(pipe->winsys, indexBuffer);
+   }
 
    softpipe_unmap_surfaces(sp);
 }
index f25a20a5e3f401b4a42422f905c41269706dde0a..49fef0ddce2bfc174230e60cd3610d6d0a7bba98 100644 (file)
@@ -98,6 +98,11 @@ void softpipe_update_derived( struct softpipe_context *softpipe );
 void softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
                           unsigned start, unsigned count);
 
+void softpipe_draw_elements(struct pipe_context *pipe,
+                            struct pipe_buffer_handle *indexBuffer,
+                            unsigned indexSize,
+                            unsigned mode, unsigned start, unsigned count);
+
 
 void
 softpipe_map_surfaces(struct softpipe_context *sp);