summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/draw/draw_vs_sse.c
diff options
context:
space:
mode:
authorZack Rusin <zack@tungstengraphics.com>2008-04-12 21:52:46 -0400
committerKeith Whitwell <keith@tungstengraphics.com>2008-04-14 11:00:35 +0100
commit3f7a3dd58c0ce2719af83ff1d89a26185d08c04c (patch)
treeefc128ea3e61e6e8ec6d18786590a89761775ffa /src/gallium/auxiliary/draw/draw_vs_sse.c
parent808f968f3ad0cb32e86f517753d5715d00e9ec2c (diff)
Make shaders operate on a block of memory instead of arrays of vertex_header's
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_vs_sse.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_sse.c56
1 files changed, 34 insertions, 22 deletions
diff --git a/src/gallium/auxiliary/draw/draw_vs_sse.c b/src/gallium/auxiliary/draw/draw_vs_sse.c
index 6e8d2021f5..c877f5ee3a 100644
--- a/src/gallium/auxiliary/draw/draw_vs_sse.c
+++ b/src/gallium/auxiliary/draw/draw_vs_sse.c
@@ -83,7 +83,7 @@ vs_sse_run( struct draw_vertex_shader *base,
struct draw_context *draw,
const unsigned *elts,
unsigned count,
- struct vertex_header *vOut[] )
+ void *vOut )
{
struct draw_sse_vertex_shader *shader = (struct draw_sse_vertex_shader *)base;
struct tgsi_exec_machine *machine = &draw->machine;
@@ -135,16 +135,18 @@ vs_sse_run( struct draw_vertex_shader *base,
for (j = 0; j < max_vertices; j++) {
unsigned slot;
float x, y, z, w;
+ struct vertex_header *out =
+ draw_header_from_block(vOut, i + j);
- x = vOut[i + j]->clip[0] = machine->Outputs[0].xyzw[0].f[j];
- y = vOut[i + j]->clip[1] = machine->Outputs[0].xyzw[1].f[j];
- z = vOut[i + j]->clip[2] = machine->Outputs[0].xyzw[2].f[j];
- w = vOut[i + j]->clip[3] = machine->Outputs[0].xyzw[3].f[j];
+ x = out->clip[0] = machine->Outputs[0].xyzw[0].f[j];
+ y = out->clip[1] = machine->Outputs[0].xyzw[1].f[j];
+ z = out->clip[2] = machine->Outputs[0].xyzw[2].f[j];
+ w = out->clip[3] = machine->Outputs[0].xyzw[3].f[j];
if (!draw->rasterizer->bypass_clipping) {
- vOut[i + j]->clipmask = compute_clipmask(vOut[i + j]->clip, draw->plane,
- draw->nr_planes);
- clipped += vOut[i + j]->clipmask;
+ out->clipmask = compute_clipmask(out->clip, draw->plane,
+ draw->nr_planes);
+ clipped += out->clipmask;
/* divide by w */
w = 1.0f / w;
@@ -153,33 +155,43 @@ vs_sse_run( struct draw_vertex_shader *base,
z *= w;
}
else {
- vOut[i + j]->clipmask = 0;
+ out->clipmask = 0;
}
- vOut[j]->edgeflag = 1;
+ out->edgeflag = 1;
if (!draw->identity_viewport) {
/* Viewport mapping */
- vOut[i + j]->data[0][0] = x * scale[0] + trans[0];
- vOut[i + j]->data[0][1] = y * scale[1] + trans[1];
- vOut[i + j]->data[0][2] = z * scale[2] + trans[2];
- vOut[i + j]->data[0][3] = w;
+ out->data[0][0] = x * scale[0] + trans[0];
+ out->data[0][1] = y * scale[1] + trans[1];
+ out->data[0][2] = z * scale[2] + trans[2];
+ out->data[0][3] = w;
}
else {
- vOut[i + j]->data[0][0] = x;
- vOut[i + j]->data[0][1] = y;
- vOut[i + j]->data[0][2] = z;
- vOut[i + j]->data[0][3] = w;
+ out->data[0][0] = x;
+ out->data[0][1] = y;
+ out->data[0][2] = z;
+ out->data[0][3] = w;
}
/* Remaining attributes are packed into sequential post-transform
* vertex attrib slots.
*/
for (slot = 1; slot < draw->num_vs_outputs; slot++) {
- vOut[i + j]->data[slot][0] = machine->Outputs[slot].xyzw[0].f[j];
- vOut[i + j]->data[slot][1] = machine->Outputs[slot].xyzw[1].f[j];
- vOut[i + j]->data[slot][2] = machine->Outputs[slot].xyzw[2].f[j];
- vOut[i + j]->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j];
+ out->data[slot][0] = machine->Outputs[slot].xyzw[0].f[j];
+ out->data[slot][1] = machine->Outputs[slot].xyzw[1].f[j];
+ out->data[slot][2] = machine->Outputs[slot].xyzw[2].f[j];
+ out->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j];
}
+#if 0 /*DEBUG*/
+ printf("%d) Post xform vert:\n", i + j);
+ for (slot = 0; slot < draw->num_vs_outputs; slot++) {
+ printf("\t%d: %f %f %f %f\n", slot,
+ out->data[slot][0],
+ out->data[slot][1],
+ out->data[slot][2],
+ out->data[slot][3]);
+ }
+#endif
}
}
return clipped != 0;