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 96a1f32d304f7af0aee5cfae50166f011b43269d..481182dd8df0d21e0a08815155486a500c007c45 100644
(file)
--- a/
src/gallium/drivers/nv50/nv50_push.c
+++ b/
src/gallium/drivers/nv50/nv50_push.c
@@
-5,6
+5,7
@@
#include "nouveau/nouveau_util.h"
#include "nv50_context.h"
#include "nouveau/nouveau_util.h"
#include "nv50_context.h"
+#include "nv50_resource.h"
struct push_context {
struct nv50_context *nv50;
struct push_context {
struct nv50_context *nv50;
@@
-12,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;
@@
-106,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) {
@@
-118,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
@@
-142,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)
{
@@
-152,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)
{
@@
-162,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)
{
@@
-171,7
+204,8
@@
emit_verts(void *priv, unsigned start, unsigned count)
void
nv50_push_elements_instanced(struct pipe_context *pipe,
void
nv50_push_elements_instanced(struct pipe_context *pipe,
- struct pipe_buffer *idxbuf, unsigned idxsize,
+ struct pipe_resource *idxbuf,
+ unsigned idxsize, int idxbias,
unsigned mode, unsigned start, unsigned count,
unsigned i_start, unsigned i_count)
{
unsigned mode, unsigned start, unsigned count,
unsigned i_start, unsigned i_count)
{
@@
-193,13
+227,13
@@
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++) {
struct pipe_vertex_element *ve = &nv50->vtxelt->pipe[i];
struct pipe_vertex_buffer *vb = &nv50->vtxbuf[ve->vertex_buffer_index];
/* map vertex buffers, determine vertex size */
for (i = 0; i < nv50->vtxelt->num_elements; i++) {
struct pipe_vertex_element *ve = &nv50->vtxelt->pipe[i];
struct pipe_vertex_buffer *vb = &nv50->vtxbuf[ve->vertex_buffer_index];
- struct nouveau_bo *bo = n
ouveau_bo(vb->buffer)
;
+ struct nouveau_bo *bo = n
v50_resource(vb->buffer)->bo
;
unsigned size, nr_components, n;
if (!(nv50->vbo_fifo & (1 << i)))
unsigned size, nr_components, n;
if (!(nv50->vbo_fifo & (1 << i)))
@@
-210,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,
@@
-260,13
+294,14
@@
nv50_push_elements_instanced(struct pipe_context *pipe,
/* map index buffer, if present */
if (idxbuf) {
/* map index buffer, if present */
if (idxbuf) {
- struct nouveau_bo *bo = n
ouveau_bo(idxbuf)
;
+ struct nouveau_bo *bo = n
v50_resource(idxbuf)->bo
;
if (nouveau_bo_map(bo, NOUVEAU_BO_RD)) {
assert(bo->map);
return;
}
ctx.idxbuf = bo->map;
if (nouveau_bo_map(bo, NOUVEAU_BO_RD)) {
assert(bo->map);
return;
}
ctx.idxbuf = bo->map;
+ ctx.idxbias = idxbias;
ctx.idxsize = idxsize;
nouveau_bo_unmap(bo);
}
ctx.idxsize = idxsize;
nouveau_bo_unmap(bo);
}
@@
-275,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;
@@
-297,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);