llvmpipe: Fix sprite coord perspective interpolation of Q.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 6 Oct 2010 08:40:51 +0000 (09:40 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 6 Oct 2010 10:46:41 +0000 (11:46 +0100)
Q coordinate's coefficients also need to be multiplied by w, otherwise
it will have 1/w, causing problems with TXP.

src/gallium/drivers/llvmpipe/lp_setup_point.c

index c91e85f9159204ebd165584815859ab078008781..1295aeecd8799f2a6fb6aebd5b84862c41c859bb 100644 (file)
@@ -105,6 +105,8 @@ texcoord_coef(struct lp_setup_context *setup,
               unsigned sprite_coord_origin,
               boolean perspective)
 {
+   float w0 = info->v0[0][3];
+
    assert(i < 4);
 
    if (i == 0) {
@@ -118,13 +120,6 @@ texcoord_coef(struct lp_setup_context *setup,
       point->inputs.a0[slot][0] = 0.5 - (dadx * x0 + dady * y0);
 
       if (perspective) {
-         /* Divide coefficients by vertex.w here.
-          *
-          * It would be clearer to always multiply by w0 above and
-          * then divide it out for perspective projection here, but
-          * doing it this way involves less algebra.
-          */
-         float w0 = info->v0[0][3];
          point->inputs.dadx[slot][0] *= w0;
          point->inputs.dady[slot][0] *= w0;
          point->inputs.a0[slot][0] *= w0;
@@ -145,7 +140,6 @@ texcoord_coef(struct lp_setup_context *setup,
       point->inputs.a0[slot][1] = 0.5 - (dadx * x0 + dady * y0);
 
       if (perspective) {
-         float w0 = info->v0[0][3];
          point->inputs.dadx[slot][1] *= w0;
          point->inputs.dady[slot][1] *= w0;
          point->inputs.a0[slot][1] *= w0;
@@ -157,7 +151,7 @@ texcoord_coef(struct lp_setup_context *setup,
       point->inputs.dady[slot][2] = 0.0f;
    }
    else {
-      point->inputs.a0[slot][3] = 1.0f;
+      point->inputs.a0[slot][3] = perspective ? w0 : 1.0f;
       point->inputs.dadx[slot][3] = 0.0f;
       point->inputs.dady[slot][3] = 0.0f;
    }