summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2012-12-12 13:37:45 -0800
committerPaul Berry <[email protected]>2012-12-18 08:31:03 -0800
commit61c1b065fbdd224fa547f035991210859c7af310 (patch)
treeeceab4048cced598108409d2295287b0c5333ebb /src/mesa
parent8cf552b1823e6c0ea8ce0465937920b4cab83465 (diff)
mesa: Change args to vbo_count_tessellated_primitives.
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 <[email protected]> Reviewed-by: Jordan Justen <[email protected]> Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw.c4
-rw-r--r--src/mesa/vbo/vbo.h3
-rw-r--r--src/mesa/vbo/vbo_exec.c34
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 97a10771877..1ba839c3358 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 04930b971da..49dab23144a 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 361d7a3e41a..5827f90c369 100644
--- a/src/mesa/vbo/vbo_exec.c
+++ b/src/mesa/vbo/vbo_exec.c
@@ -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;
}