From bfa50f88cea2ba9f4dc4b825828d2c8f02866fc3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Wed, 19 Oct 2016 18:14:48 +0200 Subject: [PATCH] st/mesa: only set primitive_restart when the restart index is in range MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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" Reviewed-by: Marek Olšák (v1) --- src/mesa/state_tracker/st_draw.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index f4af23da97f..5dcaff09c03 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. */ -- 2.30.2