summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2016-10-19 18:14:48 +0200
committerEmil Velikov <emil.l.velikov@gmail.com>2016-10-24 09:05:18 +0100
commitba6efd48c3ab36ea532d0b1b2f5493b6d9b1937b (patch)
tree7f14b539898504c04bd75ac0bb83a17add3f9a59
parent13f685cf11847ceda63d726031b56a7411f1a087 (diff)
downloadexternal_mesa3d-ba6efd48c3ab36ea532d0b1b2f5493b6d9b1937b.zip
external_mesa3d-ba6efd48c3ab36ea532d0b1b2f5493b6d9b1937b.tar.gz
external_mesa3d-ba6efd48c3ab36ea532d0b1b2f5493b6d9b1937b.tar.bz2
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" <mesa-stable@lists.freedesktop.org> Reviewed-by: Marek Olšák <marek.olsak@amd.com> (v1) (cherry picked from commit bfa50f88cea2ba9f4dc4b825828d2c8f02866fc3)
-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 f4af23d..5dcaff0 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -205,8 +205,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. */