From: Christoph Bumiller Date: Tue, 20 Apr 2010 19:18:15 +0000 (+0200) Subject: nv50: support vertex index bias X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3c9df0bda67cdcbc340a4f20997f7a3345cbe9cb;p=mesa.git nv50: support vertex index bias --- diff --git a/src/gallium/drivers/nv50/nv50_push.c b/src/gallium/drivers/nv50/nv50_push.c index c54fed5a36f..244242b8434 100644 --- a/src/gallium/drivers/nv50/nv50_push.c +++ b/src/gallium/drivers/nv50/nv50_push.c @@ -13,6 +13,7 @@ struct push_context { unsigned vtx_size; void *idxbuf; + int32_t idxbias; unsigned idxsize; float edgeflag; @@ -143,6 +144,16 @@ emit_elt08(void *priv, unsigned start, unsigned count) emit_vertex(ctx, idxbuf[start++]); } +static void +emit_elt08_biased(void *priv, unsigned start, unsigned count) +{ + struct push_context *ctx = priv; + uint8_t *idxbuf = ctx->idxbuf; + + while (count--) + emit_vertex(ctx, idxbuf[start++] + ctx->idxbias); +} + static void emit_elt16(void *priv, unsigned start, unsigned count) { @@ -153,6 +164,16 @@ emit_elt16(void *priv, unsigned start, unsigned count) emit_vertex(ctx, idxbuf[start++]); } +static void +emit_elt16_biased(void *priv, unsigned start, unsigned count) +{ + struct push_context *ctx = priv; + uint16_t *idxbuf = ctx->idxbuf; + + while (count--) + emit_vertex(ctx, idxbuf[start++] + ctx->idxbias); +} + static void emit_elt32(void *priv, unsigned start, unsigned count) { @@ -163,6 +184,16 @@ emit_elt32(void *priv, unsigned start, unsigned count) emit_vertex(ctx, idxbuf[start++]); } +static void +emit_elt32_biased(void *priv, unsigned start, unsigned count) +{ + struct push_context *ctx = priv; + uint32_t *idxbuf = ctx->idxbuf; + + while (count--) + emit_vertex(ctx, idxbuf[start++] + ctx->idxbias); +} + static void emit_verts(void *priv, unsigned start, unsigned count) { @@ -269,8 +300,8 @@ nv50_push_elements_instanced(struct pipe_context *pipe, return; } ctx.idxbuf = bo->map; + ctx.idxbias = idxbias; ctx.idxsize = idxsize; - assert(idxbias == 0); nouveau_bo_unmap(bo); } @@ -278,12 +309,12 @@ nv50_push_elements_instanced(struct pipe_context *pipe, s.edge = emit_edgeflag; if (idxbuf) { if (idxsize == 1) - s.emit = emit_elt08; + s.emit = idxbias ? emit_elt08_biased : emit_elt08; else if (idxsize == 2) - s.emit = emit_elt16; + s.emit = idxbias ? emit_elt16_biased : emit_elt16; else - s.emit = emit_elt32; + s.emit = idxbias ? emit_elt32_biased : emit_elt32; } else s.emit = emit_verts; diff --git a/src/gallium/drivers/nv50/nv50_vbo.c b/src/gallium/drivers/nv50/nv50_vbo.c index 911eabca1cf..34719c956a0 100644 --- a/src/gallium/drivers/nv50/nv50_vbo.c +++ b/src/gallium/drivers/nv50/nv50_vbo.c @@ -401,14 +401,17 @@ nv50_draw_elements_instanced(struct pipe_context *pipe, if (!nv50_state_validate(nv50, 13 + 16*3)) return; - assert(indexBias == 0); - if (nv50->vbo_fifo) { nv50_push_elements_instanced(pipe, indexBuffer, indexSize, indexBias, mode, start, count, startInstance, instanceCount); return; - } else + } + + /* indices are uint32 internally, so large indexBias means negative */ + BEGIN_RING(chan, tesla, NV50TCL_VB_ELEMENT_BASE, 1); + OUT_RING (chan, indexBias); + if (!(indexBuffer->bind & PIPE_BIND_INDEX_BUFFER) || indexSize == 1) { nv50_draw_elements_inline(pipe, indexBuffer, indexSize, mode, start, count, startInstance,