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 <i...@freedesktop.org> wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > Cc: "10.2" <mesa-sta...@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-sta...@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-stable _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev