Add outputs_written bitfield to pipe_shader_state, use it to determine if fragment shader writes Z.

This commit is contained in:
Brian 2007-10-03 14:43:57 -06:00
parent 65996f27f4
commit 635c4c41bd
3 changed files with 37 additions and 19 deletions

View file

@ -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];
};

View file

@ -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++) {

View file

@ -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++;
}
}