r300: Fix vertex program position invariant bug, force position reading.
authorJerome Glisse <glisse@freedesktop.org>
Sun, 14 Jan 2007 18:31:30 +0000 (19:31 +0100)
committerJerome Glisse <glisse@freedesktop.org>
Sun, 14 Jan 2007 18:32:22 +0000 (19:32 +0100)
When we have a position invariant program we need to force routing the
position otherwise you may handle transform quite random data which might
be funny but unlikely what you want :).

src/mesa/drivers/dri/r300/r300_vertexprog.c

index 2492a4a3a0a8f5b7ba57f287cb7caf2a6d328874..c08c98767e518c84bbb9dd48cf61fa0c0ce3f2c5 100644 (file)
@@ -1072,6 +1072,8 @@ static void insert_wpos(struct r300_vertex_program *vp,
        vpi = &prog->Instructions[prog->NumInstructions-1];
 
        assert(vpi->Opcode == OPCODE_END);
+       /* we need position, don't we ? :) */
+       prog->InputsRead |= (1 << VERT_ATTRIB_POS);
 }
 
 static void pos_as_texcoord(struct r300_vertex_program *vp,
@@ -1101,8 +1103,9 @@ static struct r300_vertex_program *build_program(struct r300_vertex_program_key
 
        vp->wpos_idx = wpos_idx;
 
-       if(mesa_vp->IsPositionInvariant)
+       if(mesa_vp->IsPositionInvariant) {
                position_invariant(&mesa_vp->Base);
+       }
 
        if(wpos_idx > -1)
                pos_as_texcoord(vp, &mesa_vp->Base);
@@ -1158,6 +1161,10 @@ void r300_select_vertex_shader(r300ContextPtr r300)
                        wanted_key.OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);
 
        wanted_key.InputsRead = vpc->mesa_program.Base.InputsRead;
+       if(vpc->mesa_program.IsPositionInvariant) {
+               /* we wan't position don't we ? */
+               wanted_key.InputsRead |= (1 << VERT_ATTRIB_POS);
+       }
 
        for (vp = vpc->progs; vp; vp = vp->next)
                if (_mesa_memcmp(&vp->key, &wanted_key, sizeof(wanted_key)) == 0) {
@@ -1170,6 +1177,5 @@ void r300_select_vertex_shader(r300ContextPtr r300)
        vp = build_program(&wanted_key, &vpc->mesa_program, wpos_idx);
        vp->next = vpc->progs;
        vpc->progs = vp;
-
        r300->selected_vp = vp;
 }