[Mesa-stable] [PATCH 12/13] i965: If STATE_BASE_VERTEX is used, set its value

Chris Forbes chrisf at ijw.co.nz
Sat Jun 21 15:24:03 PDT 2014


This looks like it's adding a pile of uniform scanning overhead even
to draws which don't need the feature. Can we stash the index we need
earlier?

On Sat, Jun 21, 2014 at 1:01 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Cc: "10.2" <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c | 37 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
> index ac21656..dd914b6 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -40,6 +40,7 @@
>  #include "swrast/swrast.h"
>  #include "swrast_setup/swrast_setup.h"
>  #include "drivers/common/meta.h"
> +#include "program/prog_parameter.h"
>
>  #include "brw_blorp.h"
>  #include "brw_draw.h"
> @@ -392,6 +393,27 @@ static bool brw_try_draw_prims( struct gl_context *ctx,
>     bool retval = true;
>     GLuint i;
>     bool fail_next = false;
> +   GLint last_start = -1;
> +   GLint base_vertex_idx = -1;
> +
> +   struct gl_program_parameter_list *const plist =
> +      ctx->VertexProgram._Current->Base.Parameters;
> +
> +   /* Find the storage associated with STATE_BASE_VERTEX.  If there is
> +    * storage, then we'll need to update its value each time
> +    * prims[i].basevertex changes.
> +    */
> +   for (unsigned j = 0; j < plist->NumParameters; j++) {
> +      if (plist->Parameters[j].StateIndexes[0] == STATE_INTERNAL
> +          && plist->Parameters[j].StateIndexes[1] == STATE_BASE_VERTEX) {
> +         base_vertex_idx = j;
> +         break;
> +      }
> +   }
> +
> +   if (base_vertex_idx >= 0) {
> +      ctx->VertexProgram._Current->Base.Parameters->ParameterValues[base_vertex_idx][0].i = brw->basevertex;
> +   }
>
>     if (ctx->NewState)
>        _mesa_update_state( ctx );
> @@ -462,11 +484,26 @@ static bool brw_try_draw_prims( struct gl_context *ctx,
>            brw->basevertex != prims[i].basevertex) {
>           brw->num_instances = prims[i].num_instances;
>           brw->basevertex = prims[i].basevertex;
> +
> +         if (base_vertex_idx >= 0) {
> +            plist->ParameterValues[base_vertex_idx][0].i = brw->basevertex;
> +            ctx->NewState |= _NEW_PROGRAM_CONSTANTS;
> +            _mesa_update_state(ctx);
> +         }
> +
>           if (i > 0) { /* For i == 0 we just did this before the loop */
>              brw->state.dirty.brw |= BRW_NEW_VERTICES;
>              brw_merge_inputs(brw, arrays);
>           }
>        }
> +
> +      if (prims[i].start != last_start && base_vertex_idx >= 0) {
> +         plist->ParameterValues[base_vertex_idx][0].i = prims[i].start;
> +         ctx->NewState |= _NEW_PROGRAM_CONSTANTS;
> +         _mesa_update_state(ctx);
> +         last_start = prims[i].start;
> +      }
> +
>        if (brw->gen < 6)
>          brw_set_prim(brw, &prims[i]);
>        else
> --
> 1.8.1.4
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-stable


More information about the mesa-stable mailing list