[Mesa-dev] [PATCH 2/7] i965/gen7: Make primitives_written counting work.

Paul Berry stereotype441 at gmail.com
Thu Dec 22 17:36:30 PST 2011


On 22 December 2011 16:54, Eric Anholt <eric at anholt.net> wrote:

> The code was relying on gs.prog_data's copy of the
> number-of-verts-per-prim, which segfaulted on gen7 since it doesn't
> make a GS program.  We can easily calculate that value right here.
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c |   33
> +++++++++++++++++++++++++++------
>  1 files changed, 27 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c
> b/src/mesa/drivers/dri/i965/brw_draw.c
> index 082bb9a..c116d39 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -379,6 +379,30 @@ static void
> brw_postdraw_set_buffers_need_resolve(struct brw_context *brw)
>    }
>  }
>
> +static int
> +verts_per_prim(GLenum mode)
> +{
> +   switch (mode) {
> +   case GL_POINTS:
> +      return 1;
> +   case GL_LINE_STRIP:
> +   case GL_LINE_LOOP:
> +   case GL_LINES:
> +      return 2;
> +   case GL_TRIANGLE_STRIP:
> +   case GL_TRIANGLE_FAN:
> +   case GL_POLYGON:
> +   case GL_TRIANGLES:
> +   case GL_QUADS:
> +   case GL_QUAD_STRIP:
> +      return 3;
> +   default:
> +      _mesa_problem(NULL,
> +                   "unknown prim type in transform feedback primitive
> count");
> +      return 0;
> +   }
> +}
> +
>  /**
>  * Update internal counters based on the the drawing operation described in
>  * prim.
> @@ -397,14 +421,11 @@ brw_update_primitive_count(struct brw_context *brw,
>        * able to reload SVBI 0 with the correct value in case we have to
> start
>        * a new batch buffer.
>        */
> -      unsigned svbi_postincrement_value =
> -         brw->gs.prog_data->svbi_postincrement_value;
> +      unsigned verts = verts_per_prim(prim->mode);
>       uint32_t space_avail =
> -         (brw->sol.svbi_0_max_index - brw->sol.svbi_0_starting_index)
> -         / svbi_postincrement_value;
> +         (brw->sol.svbi_0_max_index - brw->sol.svbi_0_starting_index) /
> verts;
>       uint32_t primitives_written = MIN2 (space_avail, count);
> -      brw->sol.svbi_0_starting_index +=
> -         svbi_postincrement_value * primitives_written;
> +      brw->sol.svbi_0_starting_index += verts;
>

This should be "brw->sol.svbi_0_starting_index += verts *
primitives_written".

With that change, this is
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20111222/6af4af63/attachment.html>


More information about the mesa-dev mailing list