diff options
author | Brian <[email protected]> | 2007-10-03 14:43:57 -0600 |
---|---|---|
committer | Brian <[email protected]> | 2007-10-03 14:43:57 -0600 |
commit | 635c4c41bdf111462939da292d65328595d314e8 (patch) | |
tree | 99753f7b6d8ad6d8f90d08e8076c2fecd3cf9e7c | |
parent | 65996f27f48e2212bf36e515aba82b6876398bfd (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.h | 4 | ||||
-rwxr-xr-x | src/mesa/pipe/softpipe/sp_quad_fs.c | 3 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_program.c | 49 |
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++; } } |