On Thu, May 23, 2013 at 3:46 PM, Kenneth Graunke <kenn...@whitecape.org> wrote: > According to the documentation: "The Cut Index is compared to the > fetched (and possibly-sign-extended) vertex index, and if these values > are equal, the current primitive topology is terminated. Note that, > for index buffers <32bpp, it is possible to set the Cut Index to a > (large) value that will never match a sign-extended vertex index." > > This suggests that we should not set the value to 0xFFFFFFFF for > unsigned byte or short index buffers, but rather 0xFF or 0xFFFF.
I was wondering what the GL spec had to say about this situation. For example, what should happen if the index is 0x100, and bytes are used. Should it effectively disable prim-restart? Should it use 0xff, or 0x00? Unfortunately, I didn't find anything concrete. Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com> > Fixes sporadic failures in the ES 3 instanced_arrays_primitive_restart > conformance test when run in combination with other tests. No Piglit > regressions. > > Cc: Ian Romanick <i...@freedesktop.org > Cc: Paul Berry <stereotype...@gmail.com> > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > --- > src/mesa/drivers/dri/i965/brw_primitive_restart.c | 27 > ++++++++++++++++------- > 1 file changed, 19 insertions(+), 8 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c > b/src/mesa/drivers/dri/i965/brw_primitive_restart.c > index f824915..cf4a1ea 100644 > --- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c > +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c > @@ -183,19 +183,30 @@ haswell_upload_cut_index(struct brw_context *brw) > if (!intel->is_haswell) > return; > > - const unsigned cut_index_setting = > - ctx->Array._PrimitiveRestart ? HSW_CUT_INDEX_ENABLE : 0; > - > - BEGIN_BATCH(2); > - OUT_BATCH(_3DSTATE_VF << 16 | cut_index_setting | (2 - 2)); > - OUT_BATCH(ctx->Array._RestartIndex); > - ADVANCE_BATCH(); > + if (ctx->Array._PrimitiveRestart) { > + int cut_index = ctx->Array._RestartIndex; > + > + if (brw->ib.type == GL_UNSIGNED_BYTE) > + cut_index &= 0xff; > + else if (brw->ib.type == GL_UNSIGNED_SHORT) > + cut_index &= 0xffff; > + > + BEGIN_BATCH(2); > + OUT_BATCH(_3DSTATE_VF << 16 | HSW_CUT_INDEX_ENABLE | (2 - 2)); > + OUT_BATCH(cut_index); > + ADVANCE_BATCH(); > + } else { > + BEGIN_BATCH(2); > + OUT_BATCH(_3DSTATE_VF << 16 | (2 - 2)); > + OUT_BATCH(0); > + ADVANCE_BATCH(); > + } > } > > const struct brw_tracked_state haswell_cut_index = { > .dirty = { > .mesa = _NEW_TRANSFORM, > - .brw = 0, > + .brw = BRW_NEW_INDEX_BUFFER, > .cache = 0, > }, > .emit = haswell_upload_cut_index, > -- > 1.8.2.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev