nvfx: draw: make perspective corrective texturing work
authorLuca Barbieri <luca@luca-barbieri.com>
Mon, 22 Feb 2010 12:15:24 +0000 (13:15 +0100)
committerYounes Manton <younes.m@gmail.com>
Mon, 15 Mar 2010 04:03:04 +0000 (00:03 -0400)
We must divide everything in the position by w, and emit position as
a 4-component vector.

Not sure why we must divide, but it works (see progs/redbook/checker).

src/gallium/drivers/nvfx/nvfx_draw.c

index 494d5435d6310c8fc7c617e0b4cf0c2393ecaf74..4e0575885d5066bf7fc3cba289ba68c19dd92b1f 100644 (file)
@@ -67,6 +67,13 @@ nvfx_render_vertex(struct nvfx_context *nvfx, const struct vertex_header *v)
                        OUT_RING  (chan, fui(v->data[idx][2]));
                        OUT_RING  (chan, fui(v->data[idx][3]));
                        break;
+               case 0xff:
+                       BEGIN_RING(chan, eng3d, NV34TCL_VTX_ATTR_4F_X(hw), 4);
+                       OUT_RING  (chan, fui(v->data[idx][0] / v->data[idx][3]));
+                       OUT_RING  (chan, fui(v->data[idx][1] / v->data[idx][3]));
+                       OUT_RING  (chan, fui(v->data[idx][2] / v->data[idx][3]));
+                       OUT_RING  (chan, fui(1.0f / v->data[idx][3]));
+                       break;
                case EMIT_4UB:
                        BEGIN_RING(chan, eng3d, NV34TCL_VTX_ATTR_4UB(hw), 1);
                        OUT_RING  (chan, pack_ub4(float_to_ubyte(v->data[idx][0]),
@@ -330,7 +337,7 @@ nvfx_state_vtxfmt_validate(struct nvfx_context *nvfx)
                emit_attrib(nvfx, 5, EMIT_1F, TGSI_SEMANTIC_FOG, 0);
        }
 
-       emit_attrib(nvfx, 0, EMIT_3F, TGSI_SEMANTIC_POSITION, 0);
+       emit_attrib(nvfx, 0, 0xff, TGSI_SEMANTIC_POSITION, 0);
 
        return FALSE;
 }