[Mesa-dev] [PATCH v2 1/6] mesa: Change args to vbo_count_tessellated_primitives.

Paul Berry stereotype441 at gmail.com
Sat Dec 15 22:09:20 PST 2012


No functional change--this simply paves the way to allow futures
patches to call vbo_count_tessellated_primitives() during error
checking, before the _mesa_prim struct has been constructed.

This will be needed for GLES3, which requires draw calls to fail if
there is not enough space available in transform feedback buffers to
accommodate the primitives to be drawn.

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/dri/i965/brw_draw.c |  4 +++-
 src/mesa/vbo/vbo.h                   |  3 ++-
 src/mesa/vbo/vbo_exec.c              | 34 +++++++++++++++++++---------------
 3 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
index 97a1077..1ba839c 100644
--- a/src/mesa/drivers/dri/i965/brw_draw.c
+++ b/src/mesa/drivers/dri/i965/brw_draw.c
@@ -381,7 +381,9 @@ static void
 brw_update_primitive_count(struct brw_context *brw,
                            const struct _mesa_prim *prim)
 {
-   uint32_t count = vbo_count_tessellated_primitives(prim);
+   uint32_t count
+      = vbo_count_tessellated_primitives(prim->mode, prim->count,
+                                         prim->num_instances);
    brw->sol.primitives_generated += count;
    if (brw->intel.ctx.TransformFeedback.CurrentObject->Active &&
        !brw->intel.ctx.TransformFeedback.CurrentObject->Paused) {
diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
index 04930b9..49dab23 100644
--- a/src/mesa/vbo/vbo.h
+++ b/src/mesa/vbo/vbo.h
@@ -156,7 +156,8 @@ void vbo_check_buffers_are_unmapped(struct gl_context *ctx);
 void vbo_bind_arrays(struct gl_context *ctx);
 
 size_t
-vbo_count_tessellated_primitives(const struct _mesa_prim *prim);
+vbo_count_tessellated_primitives(GLenum mode, GLuint count,
+                                 GLuint num_instances);
 
 void
 vbo_sw_primitive_restart(struct gl_context *ctx,
diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c
index 81a4d25..33a0f09 100644
--- a/src/mesa/vbo/vbo_exec.c
+++ b/src/mesa/vbo/vbo_exec.c
@@ -98,47 +98,51 @@ void vbo_exec_invalidate_state( struct gl_context *ctx, GLuint 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.
+ * considering the drawing mode, number of vertices, and instance count,
+ * 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.
+ * This is used by driver back-ends in implementing the PRIMITIVES_GENERATED
+ * and TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN queries.  It is also used to
+ * pre-validate draw calls in GLES3 (where draw calls only succeed if there is
+ * enough room in the transform feedback buffer for the result).
  */
 size_t
-vbo_count_tessellated_primitives(const struct _mesa_prim *prim)
+vbo_count_tessellated_primitives(GLenum mode, GLuint count,
+                                 GLuint num_instances)
 {
    size_t num_primitives;
-   switch (prim->mode) {
+   switch (mode) {
    case GL_POINTS:
-      num_primitives = prim->count;
+      num_primitives = count;
       break;
    case GL_LINE_STRIP:
-      num_primitives = prim->count >= 2 ? prim->count - 1 : 0;
+      num_primitives = count >= 2 ? count - 1 : 0;
       break;
    case GL_LINE_LOOP:
-      num_primitives = prim->count >= 2 ? prim->count : 0;
+      num_primitives = count >= 2 ? count : 0;
       break;
    case GL_LINES:
-      num_primitives = prim->count / 2;
+      num_primitives = count / 2;
       break;
    case GL_TRIANGLE_STRIP:
    case GL_TRIANGLE_FAN:
    case GL_POLYGON:
-      num_primitives = prim->count >= 3 ? prim->count - 2 : 0;
+      num_primitives = count >= 3 ? count - 2 : 0;
       break;
    case GL_TRIANGLES:
-      num_primitives = prim->count / 3;
+      num_primitives = count / 3;
       break;
    case GL_QUAD_STRIP:
-      num_primitives = prim->count >= 4 ? ((prim->count / 2) - 1) * 2 : 0;
+      num_primitives = count >= 4 ? ((count / 2) - 1) * 2 : 0;
       break;
    case GL_QUADS:
-      num_primitives = (prim->count / 4) * 2;
+      num_primitives = (count / 4) * 2;
       break;
    default:
       assert(!"Unexpected primitive type in count_tessellated_primitives");
       num_primitives = 0;
       break;
    }
-   return num_primitives * prim->num_instances;
+   return num_primitives * num_instances;
 }
-- 
1.8.0.2



More information about the mesa-dev mailing list