diff options
Diffstat (limited to 'src/mesa/pipe/softpipe/sp_draw_arrays.c')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_draw_arrays.c | 67 |
1 files changed, 51 insertions, 16 deletions
diff --git a/src/mesa/pipe/softpipe/sp_draw_arrays.c b/src/mesa/pipe/softpipe/sp_draw_arrays.c index bb32553cf4..52a54a2c96 100644 --- a/src/mesa/pipe/softpipe/sp_draw_arrays.c +++ b/src/mesa/pipe/softpipe/sp_draw_arrays.c @@ -65,6 +65,32 @@ static struct softpipe_context *sp_global = NULL; +static INLINE unsigned +compute_clipmask(float cx, float cy, float cz, float cw) +{ + unsigned mask; +#if defined(macintosh) || defined(__powerpc__) + /* on powerpc cliptest is 17% faster in this way. */ + mask = (((cw < cx) << CLIP_RIGHT_SHIFT)); + mask |= (((cw < -cx) << CLIP_LEFT_SHIFT)); + mask |= (((cw < cy) << CLIP_TOP_SHIFT)); + mask |= (((cw < -cy) << CLIP_BOTTOM_SHIFT)); + mask |= (((cw < cz) << CLIP_FAR_SHIFT)); + mask |= (((cw < -cz) << CLIP_NEAR_SHIFT)); +#else /* !defined(macintosh)) */ + mask = 0x0; + if (-cx + cw < 0) mask |= CLIP_RIGHT_BIT; + if ( cx + cw < 0) mask |= CLIP_LEFT_BIT; + if (-cy + cw < 0) mask |= CLIP_TOP_BIT; + if ( cy + cw < 0) mask |= CLIP_BOTTOM_BIT; + if (-cz + cw < 0) mask |= CLIP_FAR_BIT; + if ( cz + cw < 0) mask |= CLIP_NEAR_BIT; +#endif /* defined(macintosh) */ + return mask; +} + + + /** * Transform vertices with the current vertex program/shader * Up to four vertices can be shaded at a time. @@ -126,6 +152,12 @@ run_vertex_program(struct draw_context *draw, machine.Inputs[0].xyzw[1].f[j] = vIn[1]; /*Y*/ machine.Inputs[0].xyzw[2].f[j] = vIn[2]; /*Z*/ machine.Inputs[0].xyzw[3].f[j] = 1.0; /*W*/ + + machine.Inputs[3].xyzw[0].f[j] = cIn[0]; + machine.Inputs[3].xyzw[1].f[j] = cIn[1]; + machine.Inputs[3].xyzw[2].f[j] = cIn[2]; + machine.Inputs[3].xyzw[3].f[j] = 1.0; + #if 0 printf("VS Input %d: %f %f %f %f\n", j, vIn[0], vIn[1], vIn[2], 1.0); @@ -158,21 +190,24 @@ run_vertex_program(struct draw_context *draw, for (j = 0; j < count; j++) { float x, y, z, w; - x = outputs[0].xyzw[0].f[j]; - y = outputs[0].xyzw[1].f[j]; - z = outputs[0].xyzw[2].f[j]; - w = outputs[0].xyzw[3].f[j]; + x = vOut[j]->clip[0] = outputs[0].xyzw[0].f[j]; + y = vOut[j]->clip[1] = outputs[0].xyzw[1].f[j]; + z = vOut[j]->clip[2] = outputs[0].xyzw[2].f[j]; + w = vOut[j]->clip[3] = outputs[0].xyzw[3].f[j]; + + vOut[j]->clipmask = compute_clipmask(x, y, z, w); + vOut[j]->edgeflag = 0; /* divide by w */ - x /= w; - y /= w; - z /= w; w = 1.0 / w; - - /* Viewport */ - vOut[j]->data[0][0] = scale[0] * x + trans[0]; - vOut[j]->data[0][1] = scale[1] * y + trans[1]; - vOut[j]->data[0][2] = scale[2] * z + trans[2]; + x *= w; + y *= w; + z *= w; + + /* Viewport mapping */ + vOut[j]->data[0][0] = x * scale[0] + trans[0]; + vOut[j]->data[0][1] = y * scale[1] + trans[1]; + vOut[j]->data[0][2] = z * scale[2] + trans[2]; vOut[j]->data[0][3] = w; #if 0 printf("wincoord: %f %f %f\n", @@ -180,10 +215,10 @@ run_vertex_program(struct draw_context *draw, vOut[j]->data[0][1], vOut[j]->data[0][2]); #endif - vOut[j]->data[1][0] = 1.0; - vOut[j]->data[1][1] = 1.0; - vOut[j]->data[1][2] = 1.0; - vOut[j]->data[1][3] = 1.0; + vOut[j]->data[1][0] = outputs[1].xyzw[0].f[j]; + vOut[j]->data[1][1] = outputs[1].xyzw[1].f[j]; + vOut[j]->data[1][2] = outputs[1].xyzw[2].f[j]; + vOut[j]->data[1][3] = outputs[1].xyzw[3].f[j]; } #if 0 |