On Sat, Dec 15, 2012 at 11:09 PM, Paul Berry <stereotype...@gmail.com> wrote: > 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.roman...@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);
Below, vbo_count_tessellated_primitives() returns a size_t which is 8 bytes but it gets assigned to a 32-bit uint32_t here. It's probably fine with gcc but might raise a warning with other compilers (icc, clang). Just FYI. > 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; > } I'd probably split the Mesa and i965 changes into separate patches, but it's not a big deal. Reviewed-by: Brian Paul <bri...@vmware.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev