diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.c | 4 | ||||
-rw-r--r-- | src/mesa/vbo/vbo.h | 3 | ||||
-rw-r--r-- | 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 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; } |