projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
nv50: import new compiler
[mesa.git]
/
src
/
gallium
/
drivers
/
nv50
/
nv50_push.c
diff --git
a/src/gallium/drivers/nv50/nv50_push.c
b/src/gallium/drivers/nv50/nv50_push.c
index c54fed5a36fc529a82362ea878bf9949b2f8d8b1..481182dd8df0d21e0a08815155486a500c007c45 100644
(file)
--- 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;
unsigned vtx_size;
void *idxbuf;
+ int32_t idxbias;
unsigned idxsize;
float edgeflag;
unsigned idxsize;
float edgeflag;
@@
-107,7
+108,7
@@
emit_vertex(struct push_context *ctx, unsigned n)
int i;
if (ctx->edgeflag_attr < 16) {
int i;
if (ctx->edgeflag_attr < 16) {
- float *edgeflag = ctx->attr[ctx->edgeflag_attr].map +
+ float *edgeflag =
(uint8_t *)
ctx->attr[ctx->edgeflag_attr].map +
ctx->attr[ctx->edgeflag_attr].stride * n;
if (*edgeflag != ctx->edgeflag) {
ctx->attr[ctx->edgeflag_attr].stride * n;
if (*edgeflag != ctx->edgeflag) {
@@
-119,7
+120,8
@@
emit_vertex(struct push_context *ctx, unsigned n)
BEGIN_RING_NI(chan, tesla, NV50TCL_VERTEX_DATA, ctx->vtx_size);
for (i = 0; i < ctx->attr_nr; i++)
BEGIN_RING_NI(chan, tesla, NV50TCL_VERTEX_DATA, ctx->vtx_size);
for (i = 0; i < ctx->attr_nr; i++)
- ctx->attr[i].push(chan, ctx->attr[i].map + ctx->attr[i].stride * n);
+ ctx->attr[i].push(chan,
+ (uint8_t *)ctx->attr[i].map + ctx->attr[i].stride * n);
}
static void
}
static void
@@
-143,6
+145,16
@@
emit_elt08(void *priv, unsigned start, unsigned count)
emit_vertex(ctx, idxbuf[start++]);
}
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)
{
static void
emit_elt16(void *priv, unsigned start, unsigned count)
{
@@
-153,6
+165,16
@@
emit_elt16(void *priv, unsigned start, unsigned count)
emit_vertex(ctx, idxbuf[start++]);
}
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)
{
static void
emit_elt32(void *priv, unsigned start, unsigned count)
{
@@
-163,6
+185,16
@@
emit_elt32(void *priv, unsigned start, unsigned count)
emit_vertex(ctx, idxbuf[start++]);
}
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)
{
static void
emit_verts(void *priv, unsigned start, unsigned count)
{
@@
-195,7
+227,7
@@
nv50_push_elements_instanced(struct pipe_context *pipe,
ctx.idxbuf = NULL;
ctx.vtx_size = 0;
ctx.edgeflag = 0.5f;
ctx.idxbuf = NULL;
ctx.vtx_size = 0;
ctx.edgeflag = 0.5f;
- ctx.edgeflag_attr = nv50->vertprog->
cfg.edgeflag_in
;
+ ctx.edgeflag_attr = nv50->vertprog->
vp.edgeflag
;
/* map vertex buffers, determine vertex size */
for (i = 0; i < nv50->vtxelt->num_elements; i++) {
/* map vertex buffers, determine vertex size */
for (i = 0; i < nv50->vtxelt->num_elements; i++) {
@@
-212,14
+244,14
@@
nv50_push_elements_instanced(struct pipe_context *pipe,
assert(bo->map);
return;
}
assert(bo->map);
return;
}
- ctx.attr[n].map = bo->map + vb->buffer_offset + ve->src_offset;
+ ctx.attr[n].map =
(uint8_t *)
bo->map + vb->buffer_offset + ve->src_offset;
nouveau_bo_unmap(bo);
ctx.attr[n].stride = vb->stride;
ctx.attr[n].divisor = ve->instance_divisor;
if (ctx.attr[n].divisor) {
ctx.attr[n].step = i_start % ve->instance_divisor;
nouveau_bo_unmap(bo);
ctx.attr[n].stride = vb->stride;
ctx.attr[n].divisor = ve->instance_divisor;
if (ctx.attr[n].divisor) {
ctx.attr[n].step = i_start % ve->instance_divisor;
- ctx.attr[n].map
+=
i_start * vb->stride;
+ ctx.attr[n].map
= (uint8_t *)ctx.attr[n].map +
i_start * vb->stride;
}
size = util_format_get_component_bits(ve->src_format,
}
size = util_format_get_component_bits(ve->src_format,
@@
-269,8
+301,8
@@
nv50_push_elements_instanced(struct pipe_context *pipe,
return;
}
ctx.idxbuf = bo->map;
return;
}
ctx.idxbuf = bo->map;
+ ctx.idxbias = idxbias;
ctx.idxsize = idxsize;
ctx.idxsize = idxsize;
- assert(idxbias == 0);
nouveau_bo_unmap(bo);
}
nouveau_bo_unmap(bo);
}
@@
-278,12
+310,12
@@
nv50_push_elements_instanced(struct pipe_context *pipe,
s.edge = emit_edgeflag;
if (idxbuf) {
if (idxsize == 1)
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)
else
if (idxsize == 2)
- s.emit = emit_elt16;
+ s.emit =
idxbias ? emit_elt16_biased :
emit_elt16;
else
else
- s.emit = emit_elt32;
+ s.emit =
idxbias ? emit_elt32_biased :
emit_elt32;
} else
s.emit = emit_verts;
} else
s.emit = emit_verts;
@@
-300,7
+332,7
@@
nv50_push_elements_instanced(struct pipe_context *pipe,
ctx.attr[i].divisor != ++ctx.attr[i].step)
continue;
ctx.attr[i].step = 0;
ctx.attr[i].divisor != ++ctx.attr[i].step)
continue;
ctx.attr[i].step = 0;
- ctx.attr[i].map
+=
ctx.attr[i].stride;
+ ctx.attr[i].map
= (uint8_t *)ctx.attr[i].map +
ctx.attr[i].stride;
}
u_split_prim_init(&s, mode, start, count);
}
u_split_prim_init(&s, mode, start, count);