summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2007-10-03 14:43:57 -0600
committerBrian <brian.paul@tungstengraphics.com>2007-10-03 14:43:57 -0600
commit635c4c41bdf111462939da292d65328595d314e8 (patch)
tree99753f7b6d8ad6d8f90d08e8076c2fecd3cf9e7c
parent65996f27f48e2212bf36e515aba82b6876398bfd (diff)
Add outputs_written bitfield to pipe_shader_state, use it to determine if fragment shader writes Z.
-rw-r--r--src/mesa/pipe/p_state.h4
-rwxr-xr-xsrc/mesa/pipe/softpipe/sp_quad_fs.c3
-rw-r--r--src/mesa/state_tracker/st_program.c49
3 files changed, 37 insertions, 19 deletions
diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h
index ac9d7009cc0..64c5f13f232 100644
--- a/src/mesa/pipe/p_state.h
+++ b/src/mesa/pipe/p_state.h
@@ -150,13 +150,11 @@ struct pipe_shader_state {
#endif
void *executable;
- /** These fields somewhat constitute the shader "signature" */
ubyte num_inputs;
ubyte num_outputs;
-
+ uint outputs_written; /**< bitmask */
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
-
ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
};
diff --git a/src/mesa/pipe/softpipe/sp_quad_fs.c b/src/mesa/pipe/softpipe/sp_quad_fs.c
index d9349a22807..2b0c4366bd9 100755
--- a/src/mesa/pipe/softpipe/sp_quad_fs.c
+++ b/src/mesa/pipe/softpipe/sp_quad_fs.c
@@ -116,8 +116,7 @@ shade_quad(
sizeof( quad->outputs.color ) );
/* Z */
- if (qss->stage.softpipe->fs->output_semantic_name[0]
- == TGSI_SEMANTIC_POSITION) {
+ if (qss->stage.softpipe->fs->outputs_written & 0x1) {
/* output[0] is new Z */
uint i;
for (i = 0; i < 4; i++) {
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 807cd8cb052..86aaaad6bb3 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -160,6 +160,8 @@ st_translate_vertex_program(struct st_context *st,
defaultOutputMapping[attr] = slot;
}
+ vs.outputs_written |= (1 << slot);
+
/*
printf("Output %u -> slot %u\n", attr, slot);
*/
@@ -346,21 +348,40 @@ st_translate_fragment_program(struct st_context *st,
/*
* Semantics for outputs
*/
- for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
- if (stfp->Base.Base.OutputsWritten & (1 << attr)) {
- switch (attr) {
- case FRAG_RESULT_DEPR:
- fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
- outputMapping[attr] = fs.num_outputs;
- break;
- case FRAG_RESULT_COLR:
- fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
- outputMapping[attr] = fs.num_outputs;
- break;
- default:
- assert(0);
+ {
+ uint numColors = 0;
+ GLbitfield outputsWritten = stfp->Base.Base.OutputsWritten;
+
+ /* output[0] is always Z, but may not really be written */
+ fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
+ fs.output_semantic_index[fs.num_outputs] = 0;
+ outputMapping[FRAG_RESULT_DEPR] = fs.num_outputs;
+ fs.num_outputs++;
+
+ if (outputsWritten & (1 << FRAG_RESULT_DEPR)) {
+ fs.outputs_written |= 0x1;
+ outputsWritten &= ~(1 << FRAG_RESULT_DEPR);
+ }
+
+ /* color outputs begin at output [1] */
+ for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
+ if (outputsWritten & (1 << attr)) {
+ switch (attr) {
+ case FRAG_RESULT_DEPR:
+ assert(0);
+ break;
+ case FRAG_RESULT_COLR:
+ fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
+ fs.output_semantic_index[fs.num_outputs] = numColors;
+ outputMapping[attr] = fs.num_outputs;
+ fs.outputs_written |= (0x2 << numColors);
+ numColors++;
+ break;
+ default:
+ assert(0);
+ }
+ fs.num_outputs++;
}
- fs.num_outputs++;
}
}