summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_atom_shader.c
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-07-05 00:53:13 +1000
committerBen Skeggs <skeggsb@gmail.com>2008-07-05 00:53:13 +1000
commit77f8167d75d0016c76812fc147c06072e5729965 (patch)
treef610929b3fa6d62013593df797b9e05d7c1452b4 /src/mesa/state_tracker/st_atom_shader.c
parent6f56b527d866506a323feb19f9d8529d40034af2 (diff)
parent194cfc7a4ed86653db34be0e331ad7c23b5334eb (diff)
Merge remote branch 'upstream/gallium-0.1' into gallium-0.1
Diffstat (limited to 'src/mesa/state_tracker/st_atom_shader.c')
-rw-r--r--src/mesa/state_tracker/st_atom_shader.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index a62ea8161c..4fa304ede0 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -175,6 +175,7 @@ find_translated_vp(struct st_context *st,
GLuint outAttr, dummySlot;
const GLbitfield outputsWritten = stvp->Base.Base.OutputsWritten;
GLuint numVpOuts = 0;
+ GLboolean emitPntSize = GL_FALSE, emitBFC0 = GL_FALSE, emitBFC1 = GL_FALSE;
/* Compute mapping of vertex program outputs to slots, which depends
* on the fragment program's input->slot mapping.
@@ -199,19 +200,28 @@ find_translated_vp(struct st_context *st,
numVpOuts++;
}
}
- else if (outAttr == VERT_RESULT_PSIZ ||
- outAttr == VERT_RESULT_BFC0 ||
- outAttr == VERT_RESULT_BFC1) {
- /* backface colors go into last slots */
- xvp->output_to_slot[outAttr] = numVpOuts++;
- }
+ else if (outAttr == VERT_RESULT_PSIZ)
+ emitPntSize = GL_TRUE;
+ else if (outAttr == VERT_RESULT_BFC0)
+ emitBFC0 = GL_TRUE;
+ else if (outAttr == VERT_RESULT_BFC1)
+ emitBFC1 = GL_TRUE;
}
- /*
- printf("output_to_slot[%d] = %d\n", outAttr,
+#if 0 /*debug*/
+ printf("assign output_to_slot[%d] = %d\n", outAttr,
xvp->output_to_slot[outAttr]);
- */
+#endif
}
+ /* must do these last */
+ if (emitPntSize)
+ xvp->output_to_slot[VERT_RESULT_PSIZ] = numVpOuts++;
+ if (emitBFC0)
+ xvp->output_to_slot[VERT_RESULT_BFC0] = numVpOuts++;
+ if (emitBFC1)
+ xvp->output_to_slot[VERT_RESULT_BFC1] = numVpOuts++;
+
+
/* Unneeded vertex program outputs will go to this slot.
* We could use this info to do dead code elimination in the
* vertex program.
@@ -224,6 +234,11 @@ find_translated_vp(struct st_context *st,
if (xvp->output_to_slot[outAttr] == UNUSED)
xvp->output_to_slot[outAttr] = dummySlot;
}
+#if 0 /*debug*/
+ printf("output_to_slot[%d] = %d\n", outAttr,
+ xvp->output_to_slot[outAttr]);
+#endif
+
}
assert(stvp->Base.Base.NumInstructions > 1);