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

Brian Paul brian.e.paul at gmail.com
Sun Dec 16 07:59:45 PST 2012


On Sat, Dec 15, 2012 at 11:09 PM, Paul Berry <stereotype441 at 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.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);

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 <brianp at vmware.com>


More information about the mesa-dev mailing list