unsigned vtx_size;
void *idxbuf;
+ int32_t idxbias;
unsigned idxsize;
float edgeflag;
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)
{
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)
{
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)
{
return;
}
ctx.idxbuf = bo->map;
+ ctx.idxbias = idxbias;
ctx.idxsize = idxsize;
- assert(idxbias == 0);
nouveau_bo_unmap(bo);
}
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;
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,