summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2013-05-24 09:28:56 -0700
committerKenneth Graunke <[email protected]>2013-06-05 11:10:22 -0700
commit232f4ca7c1b1873289e35a9a9eeaacf7acf00cca (patch)
treea55d63121d9d1abdcf949eaea559307c120ae291 /src/mesa
parentf1c0c7b3b341abe4ad3f31ef3066ef6bb428b692 (diff)
i965: Use the correct restart index for fixed index mode on Haswell.
The code that updates the ctx->Array._RestartIndex derived state mashed it to 0xFFFFFFFF when GL_PRIMITIVE_RESTART_FIXED_INDEX was enabled regardless of the index buffer type. It's supposed to be 0xFF for byte, 0xFFFF for short, or 0xFFFFFFFF for integer types. The new _mesa_primitive_restart_index() helper gets this right. The hardware appears to compare against the full 32-bit value some of the time, causing primitive restart not to occur when it should. The fact that it works some of the time is rather frightening. Fixes sporadic failures in the ES 3 instanced_arrays_primitive_restart conformance test when run in combination with other tests. (cherry picked from commit 7c87a3b5dac118697a9b67caa7b6d5cab60f316d and commit 4405ff4055685841c9d9545da52c7edc8708b14b, squashed together) Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_primitive_restart.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c
index 10581b3b36c..1d2fb22fd9b 100644
--- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c
+++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c
@@ -27,6 +27,7 @@
#include "main/imports.h"
#include "main/bufferobj.h"
+#include "main/varray.h"
#include "brw_context.h"
#include "brw_defines.h"
@@ -197,16 +198,29 @@ haswell_upload_cut_index(struct brw_context *brw)
const unsigned cut_index_setting =
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(ctx->Array._RestartIndex);
+ OUT_BATCH(cut_index);
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,