[Mesa-dev] [PATCH 4/4] i965: use cut index to handle primitive restart when possible

Jordan Justen jordan.l.justen at intel.com
Sun May 13 07:06:27 PDT 2012


If the primitive restart index and the primitive type can
be handled by the cut index feature, then use the hardware
to handle the primitive restart feature.

The VBO module's software handling of primitive restart is
used as a fall back.

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 src/mesa/drivers/dri/i965/brw_primitive_restart.c |   68 ++++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c
index 20a9226..f4c8f4e 100644
--- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c
+++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c
@@ -31,6 +31,56 @@
 #include "brw_context.h"
 #include "brw_draw.h"
 
+static bool can_cut_index_handle_restart_index(struct gl_context *ctx,
+                                               const struct _mesa_index_buffer *ib)
+{
+   bool cut_index_will_work;
+
+   switch (ib->type) {
+   case GL_UNSIGNED_BYTE:
+      cut_index_will_work = (ctx->Array.RestartIndex & 0xff) == 0xff;
+      break;
+   case GL_UNSIGNED_SHORT:
+      cut_index_will_work = (ctx->Array.RestartIndex & 0xffff) == 0xffff;
+      break;
+   case GL_UNSIGNED_INT:
+      cut_index_will_work = ctx->Array.RestartIndex == 0xffffffff;
+      break;
+   default:
+      cut_index_will_work = false;
+      assert(0);
+   }
+
+   return cut_index_will_work;
+}
+
+static bool can_cut_index_handle_prims(struct gl_context *ctx,
+                                       const struct _mesa_prim *prim,
+                                       GLuint nr_prims)
+{
+   for ( ; nr_prims > 0; nr_prims--) {
+      switch(prim->mode) {
+      case GL_POINTS:
+      case GL_LINES:
+      case GL_LINE_STRIP:
+      case GL_TRIANGLES:
+      case GL_TRIANGLE_STRIP:
+         /* Cut index supports these primitive types */
+         break;
+      default:
+         /* Cut index does not support these primitive types */
+      //case GL_LINE_LOOP:
+      //case GL_TRIANGLE_FAN:
+      //case GL_QUADS:
+      //case GL_QUAD_STRIP:
+      //case GL_POLYGON:
+         return false;
+      }
+   }
+
+   return true;
+}
+
 bool brw_handle_primitive_restart(struct gl_context *ctx,
                                   const struct _mesa_prim *prim,
                                   GLuint nr_prims,
@@ -70,7 +120,23 @@ bool brw_handle_primitive_restart(struct gl_context *ctx,
     */
    brw->prim_restart.in_progress = true;
 
-   vbo_sw_primitive_restart(ctx, prim, nr_prims, ib);
+   if (!can_cut_index_handle_restart_index(ctx, ib)) {
+      /* The primitive restart index can't be handled, so take
+       * the software path
+       */
+      vbo_sw_primitive_restart(ctx, prim, nr_prims, ib);
+   } else if (can_cut_index_handle_prims(ctx, prim, nr_prims)) {
+      /* Cut index should work for primitive restart, so use it
+       */
+      brw->prim_restart.enable_cut_index = true;
+      brw_draw_prims(ctx, prim, nr_prims, ib, GL_FALSE, -1, -1, NULL);
+      brw->prim_restart.enable_cut_index = false;
+   } else {
+      /* Not all the primitive draw modes are supported by the cut index,
+       * so take the software path
+       */
+      vbo_sw_primitive_restart(ctx, prim, nr_prims, ib);
+   }
 
    brw->prim_restart.in_progress = false;
 
-- 
1.7.9.5



More information about the mesa-dev mailing list