i965: Fix haswell_upload_cut_index when there's no index buffer.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 30 May 2013 01:51:29 +0000 (18:51 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 1 Jun 2013 04:54:49 +0000 (21:54 -0700)
brw->ib.type is reset to -1 at the start of each batch.  If there's no
index buffer, it won't get updated to a sensible value, resulting in
_mesa_primitive_restart_index's "Invalid index buffer type" assertion
tripping.

Fixes a regression since 7c87a3b5dac118697a9b67caa7b6d5cab60f316d.

NOTE: This is a candidate for the 9.1 branch (and should be squashed).
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=65195
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_primitive_restart.c

index e9265388fc94f0ae408951c3619267acd2725d51..b5cfbbc4c6fe643c465444199d98fdb1a876ddd0 100644 (file)
@@ -194,9 +194,21 @@ haswell_upload_cut_index(struct brw_context *brw)
       ctx->Array._PrimitiveRestart ? HSW_CUT_INDEX_ENABLE : 0;
 
    /* BRW_NEW_INDEX_BUFFER */
+   unsigned cut_index;
+   if (brw->ib.ib) {
+      cut_index = _mesa_primitive_restart_index(ctx, brw->ib.type);
+   } else {
+      /* There's no index buffer, but primitive restart may still apply
+       * to glDrawArrays and such.  FIXED_INDEX mode only applies to drawing
+       * operations that use an index buffer, so we can ignore it and use
+       * the GL restart index directly.
+       */
+      cut_index = ctx->Array.RestartIndex;
+   }
+
    BEGIN_BATCH(2);
    OUT_BATCH(_3DSTATE_VF << 16 | cut_index_setting | (2 - 2));
-   OUT_BATCH(_mesa_primitive_restart_index(ctx, brw->ib.type));
+   OUT_BATCH(cut_index);
    ADVANCE_BATCH();
 }