From c416f49ebe69436e4fd96f738249be8f8d511447 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 4 Dec 2014 00:45:45 -0500 Subject: [PATCH] freedreno/a3xx: handle index_bias (i.e. base_vertex) Signed-off-by: Ilia Mirkin Reviewed-by: Rob Clark --- src/gallium/drivers/freedreno/a3xx/fd3_draw.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c index b06d4253a99..cf704ba26af 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c @@ -42,6 +42,16 @@ #include "fd3_format.h" #include "fd3_zsa.h" +static inline uint32_t +add_sat(uint32_t a, int32_t b) +{ + int64_t ret = (uint64_t)a + (int64_t)b; + if (ret > ~0U) + return ~0U; + if (ret < 0) + return 0; + return (uint32_t)ret; +} static void draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, @@ -58,10 +68,10 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring, OUT_RING(ring, 0x0000000b); /* PC_VERTEX_REUSE_BLOCK_CNTL */ OUT_PKT0(ring, REG_A3XX_VFD_INDEX_MIN, 4); - OUT_RING(ring, info->min_index); /* VFD_INDEX_MIN */ - OUT_RING(ring, info->max_index); /* VFD_INDEX_MAX */ + OUT_RING(ring, add_sat(info->min_index, info->index_bias)); /* VFD_INDEX_MIN */ + OUT_RING(ring, add_sat(info->max_index, info->index_bias)); /* VFD_INDEX_MAX */ OUT_RING(ring, info->start_instance); /* VFD_INSTANCEID_OFFSET */ - OUT_RING(ring, info->start); /* VFD_INDEX_OFFSET */ + OUT_RING(ring, info->indexed ? info->index_bias : info->start); /* VFD_INDEX_OFFSET */ OUT_PKT0(ring, REG_A3XX_PC_RESTART_INDEX, 1); OUT_RING(ring, info->primitive_restart ? /* PC_RESTART_INDEX */ -- 2.30.2