[Mesa-dev] [PATCH 4/8] vbo: use software primitive restart in the VBO module

Jordan Justen jordan.l.justen at intel.com
Fri May 11 08:15:54 PDT 2012


When PrimitiveRestartInSoftware is set, the VBO module will handle
primitive restart scenarios before calling the vbo_draw_func
drawing function.

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 src/mesa/vbo/vbo_exec_array.c |   50 ++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 13 deletions(-)

diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
index cc94e76..e584cef 100644
--- a/src/mesa/vbo/vbo_exec_array.c
+++ b/src/mesa/vbo/vbo_exec_array.c
@@ -542,6 +542,30 @@ vbo_bind_arrays(struct gl_context *ctx)
 }
 
 
+static void vbo_exec_array_draw_prims(struct gl_context *ctx,
+                                      const struct _mesa_prim *prim,
+                                      GLuint nr_prims,
+                                      const struct _mesa_index_buffer *ib,
+                                      GLboolean index_bounds_valid,
+                                      GLuint min_index,
+                                      GLuint max_index,
+                                      struct gl_transform_feedback_object *tfb_vertcount)
+{
+   struct vbo_context *vbo = vbo_context(ctx);
+
+   if ((ib != NULL) &&
+       ctx->Const.PrimitiveRestartInSoftware &&
+       ctx->Array.PrimitiveRestart) {
+      /* Handle primitive restart in software */
+      vbo_sw_primitive_restart(ctx, prim, nr_prims, ib, tfb_vertcount);
+   } else {
+      /* Call driver directly for draw_prims */
+      vbo->draw_prims(ctx, prim, nr_prims, ib,
+                      index_bounds_valid, min_index, max_index, tfb_vertcount);
+   }
+}
+
+
 /**
  * Helper function called by the other DrawArrays() functions below.
  * This is where we handle primitive restart for drawing non-indexed
@@ -600,8 +624,8 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
       if (primCount > 0) {
          /* draw one or two prims */
          check_buffers_are_unmapped(exec->array.inputs);
-         vbo->draw_prims(ctx, prim, primCount, NULL,
-                         GL_TRUE, start, start + count - 1, NULL);
+         vbo_exec_array_draw_prims(ctx, prim, primCount, NULL,
+                                   GL_TRUE, start, start + count - 1, NULL);
       }
    }
    else {
@@ -610,9 +634,9 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
       prim[0].count = count;
 
       check_buffers_are_unmapped(exec->array.inputs);
-      vbo->draw_prims(ctx, prim, 1, NULL,
-                      GL_TRUE, start, start + count - 1,
-                      NULL);
+      vbo_exec_array_draw_prims(ctx, prim, 1, NULL,
+                                GL_TRUE, start, start + count - 1,
+                                NULL);
    }
 }
 
@@ -801,8 +825,8 @@ vbo_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
     */
 
    check_buffers_are_unmapped(exec->array.inputs);
-   vbo->draw_prims( ctx, prim, 1, &ib,
-		    index_bounds_valid, start, end, NULL );
+   vbo_exec_array_draw_prims(ctx, prim, 1, &ib,
+                             index_bounds_valid, start, end, NULL );
 }
 
 
@@ -1096,8 +1120,8 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
       }
 
       check_buffers_are_unmapped(exec->array.inputs);
-      vbo->draw_prims(ctx, prim, primcount, &ib,
-		      GL_FALSE, ~0, ~0, NULL);
+      vbo_exec_array_draw_prims(ctx, prim, primcount, &ib,
+                                GL_FALSE, ~0, ~0, NULL);
    } else {
       /* render one prim at a time */
       for (i = 0; i < primcount; i++) {
@@ -1121,8 +1145,8 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
 	    prim[0].basevertex = 0;
 
          check_buffers_are_unmapped(exec->array.inputs);
-         vbo->draw_prims(ctx, prim, 1, &ib,
-                         GL_FALSE, ~0, ~0, NULL);
+         vbo_exec_array_draw_prims(ctx, prim, 1, &ib,
+                                   GL_FALSE, ~0, ~0, NULL);
       }
    }
 
@@ -1199,8 +1223,8 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
     * will be rendered. */
 
    check_buffers_are_unmapped(exec->array.inputs);
-   vbo->draw_prims(ctx, prim, 1, NULL,
-                   GL_TRUE, 0, 0, obj);
+   vbo_exec_array_draw_prims(ctx, prim, 1, NULL,
+                             GL_TRUE, 0, 0, obj);
 }
 
 /**
-- 
1.7.9.5



More information about the mesa-dev mailing list