Mesa (primitive-restart): draw: Fix restart loop and add support for non-indexed restart.

Brian Paul brianp at kemper.freedesktop.org
Tue Jul 20 15:08:03 UTC 2010


Module: Mesa
Branch: primitive-restart
Commit: 0596a39f21a2fbcb133a4158d98eadb66a96d000
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0596a39f21a2fbcb133a4158d98eadb66a96d000

Author: Chia-I Wu <olv at lunarg.com>
Date:   Sun Jul 18 14:12:43 2010 +0800

draw: Fix restart loop and add support for non-indexed restart.

The restart loop should run from "start" to "start+count-1".  Also, add
support for non-indexed restart.

Signed-off-by: Brian Paul <brianp at vmware.com>

---

 src/gallium/auxiliary/draw/draw_pt.c |   43 +++++++++++++++++++++++++--------
 1 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c
index d89d583..9ebda72 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -299,8 +299,7 @@ draw_print_arrays(struct draw_context *draw, uint prim, int start, uint count)
 /** Helper code for below */
 #define PRIM_RESTART_LOOP(elements) \
    do { \
-      unsigned i, cur_start = start, cur_count = 0; \
-      for (i = start; i < count; i++) { \
+      for (i = start; i < end; i++) { \
          if (elements[i] == draw->restart_index) { \
             if (cur_count > 0) { \
                /* draw elts up to prev pos */ \
@@ -321,17 +320,41 @@ draw_print_arrays(struct draw_context *draw, uint prim, int start, uint count)
 
 
 /**
- * For drawing indexed prims with primitive restart enabled.
+ * For drawing prims with primitive restart enabled.
  * Scan for restart indexes and draw the runs of elements between
  * the restarts.
  */
 static void
-draw_elements_restart(struct draw_context *draw, unsigned prim,
-                      unsigned start, unsigned count)
+draw_pt_arrays_restart(struct draw_context *draw, unsigned prim,
+                       unsigned start, unsigned count)
 {
+   const unsigned end = start + count;
+   unsigned i, cur_start, cur_count;
+
    assert(draw->primitive_restart);
-   assert(draw->pt.user.elts);
 
+   /* non-indexed prims */
+   if (!draw->pt.user.elts) {
+      cur_start = start;
+
+      /* there may be two runs of elements */
+      i = draw->restart_index;
+      if (start <= i && end > i) {
+         cur_count = i - start;
+         if (cur_count > 0)
+            draw_pt_arrays(draw, prim, cur_start, cur_count);
+         cur_start = i + 1;
+      }
+
+      cur_count = end - cur_start;
+      if (cur_count > 0)
+         draw_pt_arrays(draw, prim, cur_start, cur_count);
+
+      return;
+   }
+
+   cur_start = start;
+   cur_count = 0;
    switch (draw->pt.user.eltSize) {
    case 1:
       {
@@ -416,11 +439,9 @@ draw_arrays_instanced(struct draw_context *draw,
    for (instance = 0; instance < instanceCount; instance++) {
       draw->instance_id = instance + startInstance;
 
-      /* Check if primitive restart is enabled and we're drawing an
-       * indexed primitive.
-       */
-      if (draw->primitive_restart && draw->pt.user.elts) {
-         draw_elements_restart(draw, mode, start, count);
+      /* Check if primtive restart is enabled. */
+      if (draw->primitive_restart) {
+         draw_pt_arrays_restart(draw, mode, start, count);
       }
       else {
          draw_pt_arrays(draw, mode, start, count);




More information about the mesa-commit mailing list