Fix problem in mapping vertex program outputs (found with "spring" game engine)
authorBrian <brian.paul@tungstengraphics.com>
Thu, 31 Jan 2008 21:05:04 +0000 (14:05 -0700)
committerBen Skeggs <skeggsb@gmail.com>
Fri, 15 Feb 2008 02:50:28 +0000 (13:50 +1100)
If the vertex program writes to an output that's not consumed by the
fragment program, map the vp output to an unused slot.

src/mesa/state_tracker/st_atom_shader.c

index 1ed9333556eaff4dd969d16bdd3e62708044d0e9..919691850938a553b9623a187f9ffa35c1bb345d 100644 (file)
@@ -226,9 +226,11 @@ find_translated_vp(struct st_context *st,
             GLint fpInAttrib = vp_out_to_fp_in(outAttr);
             if (fpInAttrib >= 0) {
                GLuint fpInSlot = stfp->input_to_slot[fpInAttrib];
-               GLuint vpOutSlot = stfp->fs->state.input_map[fpInSlot];
-               xvp->output_to_slot[outAttr] = vpOutSlot;
-               numVpOuts++;
+               if (fpInSlot != ~0) {
+                  GLuint vpOutSlot = stfp->fs->state.input_map[fpInSlot];
+                  xvp->output_to_slot[outAttr] = vpOutSlot;
+                  numVpOuts++;
+               }
             }
             else if (outAttr == VERT_RESULT_PSIZ ||
                      outAttr == VERT_RESULT_BFC0 ||
@@ -247,7 +249,7 @@ find_translated_vp(struct st_context *st,
        * We could use this info to do dead code elimination in the
        * vertex program.
        */
-      dummySlot = stfp->num_input_slots;
+      dummySlot = numVpOuts;
 
       /* Map vert program outputs that aren't used to the dummy slot */
       for (outAttr = 0; outAttr < VERT_RESULT_MAX; outAttr++) {