mesa: Change args to vbo_count_tessellated_primitives.
authorPaul Berry <stereotype441@gmail.com>
Wed, 12 Dec 2012 21:37:45 +0000 (13:37 -0800)
committerPaul Berry <stereotype441@gmail.com>
Tue, 18 Dec 2012 16:31:03 +0000 (08:31 -0800)
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@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/vbo/vbo.h
src/mesa/vbo/vbo_exec.c

index 97a1077187737381784a8badc12bf85942c90c8b..1ba839c33582b653c0a1283215f065fc3bbe90ab 100644 (file)
@@ -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) {
index 04930b971da052ad3e6b8b076ee8b86aa6aea8ea..49dab23144a67ffc8073e8265aa542322ffc1d4e 100644 (file)
@@ -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,
index 361d7a3e41ab60b86f87adad29aac252551b970b..5827f90c36925c1d9508d580999f1b924fbc0ff1 100644 (file)
@@ -94,47 +94,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;
 }