diff options
author | Ilia Mirkin <[email protected]> | 2014-12-04 00:45:45 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-12-06 18:18:50 -0500 |
commit | c416f49ebe69436e4fd96f738249be8f8d511447 (patch) | |
tree | fdc62967ec556b3b2a760bbbe23587fc2fc76698 /src/gallium | |
parent | b38b40d7bbff7b9f24ee9b03ececf44dfbf7539e (diff) |
freedreno/a3xx: handle index_bias (i.e. base_vertex)
Signed-off-by: Ilia Mirkin <[email protected]>
Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/freedreno/a3xx/fd3_draw.c | 16 |
1 files 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 */ |