On Wed, Dec 16, 2015 at 3:47 PM, Kristian Høgsberg <k...@bitplanet.net> wrote: > From: Kristian Høgsberg Kristensen <k...@bitplanet.net> > > If we're doing an indirect draw, prims[i].basevertex is always 0 and the > real base vertex value is in the indirect parameter buffer. We try to > avoid flagging BRW_NEW_VERTICES if prims[i].basevertex doesn't change, > which then breaks down for indirect draws. Thus, if a program uses base > vertex or base instance, and the draw call is indirect, always flag > BRW_NEW_VERTICES. A new piglit test, > spec/ARB_shader_draw_parameters/drawid-indirect-vertexid tests this. > --- > src/mesa/drivers/dri/i965/brw_draw.c | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c > b/src/mesa/drivers/dri/i965/brw_draw.c > index b0a162a..8737c64 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw.c > +++ b/src/mesa/drivers/dri/i965/brw_draw.c > @@ -491,9 +491,29 @@ brw_try_draw_prims(struct gl_context *ctx, > } > } > > - brw->draw.params.gl_basevertex = > + /* Determine if we need to flag BRW_NEW_VERTICES for updating the > + * gl_BaseVertexARB or gl_BaseInstanceARB values. For indirect draw, we > + * always flag if the shader uses one of the values. For direct draws, > + * we only flag if the values change. > + */ > + const int new_basevertex = > prims[i].indexed ? prims[i].basevertex : prims[i].start; > - brw->draw.params.gl_baseinstance = prims[i].base_instance; > + const int new_baseinstance = prims[i].base_instance; > + if (i > 0) { > + const bool uses_draw_parameters = > + brw->vs.prog_data->uses_basevertex || > + brw->vs.prog_data->uses_baseinstance; > + > + if ((uses_draw_parameters && prims[i].is_indirect) || > + (brw->vs.prog_data->uses_basevertex && > + brw->draw.params.gl_basevertex != new_basevertex) || > + (brw->vs.prog_data->uses_baseinstance && > + brw->draw.params.gl_baseinstance != new_baseinstance)) > + brw->ctx.NewDriverState |= BRW_NEW_VERTICES; > + } > + > + brw->draw.params.gl_basevertex = new_basevertex; > + brw->draw.params.gl_baseinstance = new_baseinstance; > drm_intel_bo_unreference(brw->draw.draw_params_bo); > > if (prims[i].is_indirect) { > -- > 2.5.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Reviewed-by: Anuj Phogat <anuj.pho...@gmail.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev