freedreno/a3xx: handle index_bias (i.e. base_vertex)
authorIlia Mirkin <imirkin@alum.mit.edu>
Thu, 4 Dec 2014 05:45:45 +0000 (00:45 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 6 Dec 2014 23:18:50 +0000 (18:18 -0500)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_draw.c

index b06d4253a99356c175d670a0d22f30e0373a6b8d..cf704ba26af810122e6f861531df7aaaae5210ad 100644 (file)
 #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 */