summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2016-10-19 18:14:48 +0200
committerEmil Velikov <[email protected]>2016-11-08 16:23:20 +0000
commitf8f9d7528af2619d4ac80fc2847d903d79b68de2 (patch)
tree7208a11980fe125327dc1d47a0be8a455775087f /src
parent3a030e886d459044fab3ec645c1554db3ebe05a3 (diff)
st/mesa: only set primitive_restart when the restart index is in range
Even when enabled, primitive restart has no effect when the restart index is larger than the representable values in the index buffer. Fixes GL45-CTS.gtf31.GL3Tests.primitive_restart.primitive_restart_upconvert for radeonsi VI. v2: add an explanatory comment Cc: "12.0 13.0" <[email protected]> Reviewed-by: Marek Olšák <[email protected]> (v1) (cherry picked from commit bfa50f88cea2ba9f4dc4b825828d2c8f02866fc3)
Diffstat (limited to 'src')
-rw-r--r--src/mesa/state_tracker/st_draw.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index 3db5749725e..c013d3bb26b 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -203,8 +203,19 @@ st_draw_vbo(struct gl_context *ctx,
/* The VBO module handles restart for the non-indexed GLDrawArrays
* so we only set these fields for indexed drawing:
*/
- info.primitive_restart = ctx->Array._PrimitiveRestart;
- info.restart_index = _mesa_primitive_restart_index(ctx, ib->type);
+ if (ctx->Array._PrimitiveRestart) {
+ info.restart_index = _mesa_primitive_restart_index(ctx, ib->type);
+
+ /* Enable primitive restart only when the restart index can have an
+ * effect. This is required for correctness in radeonsi VI support,
+ * though other hardware may also benefit from taking a faster,
+ * non-restart path when possible.
+ */
+ if ((ibuffer.index_size >= 4) ||
+ (ibuffer.index_size >= 2 && info.restart_index <= 0xffff) ||
+ (info.restart_index <= 0xff))
+ info.primitive_restart = true;
+ }
}
else {
/* Transform feedback drawing is always non-indexed. */