Mesa (master): mesa: Add count_tessellated_primitives() function.

Paul Berry stereotype441 at kemper.freedesktop.org
Tue Dec 20 23:41:22 UTC 2011


Module: Mesa
Branch: master
Commit: dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Mon Dec 19 11:47:14 2011 -0800

mesa: Add count_tessellated_primitives() function.

This function computes the number of primitives that will be generated
when the given drawing operation is performed.  It accounts for the
tessellation that is performed on line strips, line loops, triangle
strips, triangle fans, quads, quad strips, and polygons, so it is
suitable for implementing the primitive counters needed by transform
feedback.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/vbo/vbo.h      |    3 ++
 src/mesa/vbo/vbo_exec.c |   48 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
index f357657..7384790 100644
--- a/src/mesa/vbo/vbo.h
+++ b/src/mesa/vbo/vbo.h
@@ -137,6 +137,9 @@ void vbo_check_buffers_are_unmapped(struct gl_context *ctx);
 
 void vbo_bind_arrays(struct gl_context *ctx);
 
+size_t
+count_tessellated_primitives(const struct _mesa_prim *prim);
+
 void GLAPIENTRY
 _es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
 
diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c
index e8d5b39..05c3ec1 100644
--- a/src/mesa/vbo/vbo_exec.c
+++ b/src/mesa/vbo/vbo_exec.c
@@ -90,3 +90,51 @@ void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint new_state )
 
    _ae_invalidate_state(ctx, new_state);
 }
+
+
+/**
+ * Figure out the number of transform feedback primitives that will be output
+ * by the given _mesa_prim command, assuming that no geometry shading is done
+ * and primitive restart is not used.
+ *
+ * This is intended for use by driver back-ends in implementing the
+ * PRIMITIVES_GENERATED and TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN queries.
+ */
+size_t
+count_tessellated_primitives(const struct _mesa_prim *prim)
+{
+   size_t num_primitives;
+   switch (prim->mode) {
+   case GL_POINTS:
+      num_primitives = prim->count;
+      break;
+   case GL_LINE_STRIP:
+      num_primitives = prim->count >= 2 ? prim->count - 1 : 0;
+      break;
+   case GL_LINE_LOOP:
+      num_primitives = prim->count >= 2 ? prim->count : 0;
+      break;
+   case GL_LINES:
+      num_primitives = prim->count / 2;
+      break;
+   case GL_TRIANGLE_STRIP:
+   case GL_TRIANGLE_FAN:
+   case GL_POLYGON:
+      num_primitives = prim->count >= 3 ? prim->count - 2 : 0;
+      break;
+   case GL_TRIANGLES:
+      num_primitives = prim->count / 3;
+      break;
+   case GL_QUAD_STRIP:
+      num_primitives = prim->count >= 4 ? ((prim->count / 2) - 1) * 2 : 0;
+      break;
+   case GL_QUADS:
+      num_primitives = (prim->count / 4) * 2;
+      break;
+   default:
+      assert(!"Unexpected primitive type in count_tessellated_primitives");
+      num_primitives = 0;
+      break;
+   }
+   return num_primitives * prim->num_instances;
+}




More information about the mesa-commit mailing list