From f5cce8929ad61449ec0e43046a9699e19a2df0ce Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Thu, 25 Jun 2020 12:26:54 +0200 Subject: [PATCH] gallium/indices: translate primitive-restart values This adds a config-option to u_primconvert that translates primitive restart values to the max-values for the index size. This allows us to support arbitrary primitive-restart indices on hardware that only supports fixed restart-indices. Reviewed-By: Mike Blumenkrantz Reviewed-by: Gert Wollny Part-of: --- src/gallium/auxiliary/indices/u_primconvert.c | 9 +++++++++ src/gallium/auxiliary/indices/u_primconvert.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/gallium/auxiliary/indices/u_primconvert.c b/src/gallium/auxiliary/indices/u_primconvert.c index 5b3c66a838c..d0a1a78e40e 100644 --- a/src/gallium/auxiliary/indices/u_primconvert.c +++ b/src/gallium/auxiliary/indices/u_primconvert.c @@ -44,6 +44,7 @@ #include "util/u_draw.h" #include "util/u_inlines.h" #include "util/u_memory.h" +#include "util/u_prim_restart.h" #include "util/u_upload_mgr.h" #include "indices/u_indices.h" @@ -152,6 +153,14 @@ util_primconvert_draw_vbo(struct primconvert_context *pc, if (info->index_size) { trans_func(src, info->start, info->count, new_info.count, info->restart_index, dst); + + if (pc->cfg.fixed_prim_restart && info->primitive_restart) { + new_info.restart_index = (1ull << (new_info.index_size * 8)) - 1; + if (info->restart_index != new_info.restart_index) + util_translate_prim_restart_data(new_info.index_size, dst, dst, + new_info.count, + info->restart_index); + } } else { gen_func(info->start, new_info.count, dst); diff --git a/src/gallium/auxiliary/indices/u_primconvert.h b/src/gallium/auxiliary/indices/u_primconvert.h index dfec9f975cb..80d25a49313 100644 --- a/src/gallium/auxiliary/indices/u_primconvert.h +++ b/src/gallium/auxiliary/indices/u_primconvert.h @@ -33,6 +33,7 @@ struct primconvert_context; struct primconvert_config { uint32_t primtypes_mask; + bool fixed_prim_restart; }; struct primconvert_context *util_primconvert_create(struct pipe_context *pipe,