summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nv50/nv50_push.c
diff options
context:
space:
mode:
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>2010-04-20 21:18:15 +0200
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>2010-04-20 22:07:58 +0200
commit3c9df0bda67cdcbc340a4f20997f7a3345cbe9cb (patch)
tree3882dae688fa0540617398a18a56901048d86af2 /src/gallium/drivers/nv50/nv50_push.c
parentcaa05ef41996f7d0ac6b77f2fe86b1771cb10e43 (diff)
nv50: support vertex index bias
Diffstat (limited to 'src/gallium/drivers/nv50/nv50_push.c')
-rw-r--r--src/gallium/drivers/nv50/nv50_push.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/gallium/drivers/nv50/nv50_push.c b/src/gallium/drivers/nv50/nv50_push.c
index c54fed5a36..244242b843 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;
@@ -144,6 +145,16 @@ emit_elt08(void *priv, unsigned start, unsigned count)
}
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)
{
struct push_context *ctx = priv;
@@ -154,6 +165,16 @@ emit_elt16(void *priv, unsigned start, unsigned count)
}
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)
{
struct push_context *ctx = priv;
@@ -164,6 +185,16 @@ emit_elt32(void *priv, unsigned start, unsigned count)
}
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)
{
while (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;