summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2016-10-13 09:49:11 +0200
committerNicolai Hähnle <[email protected]>2016-10-17 19:09:37 +0200
commit57a15142037e3eea3581a6c690b8e8e93729b5b3 (patch)
treeb8f5c94e913b802a9ad92fceb092f6a8aecb1133
parente0213f36bb9e2aebd84845d3c06fcc74cc749f0f (diff)
st/mesa: fix fragment shader output mapping
Properly handle the case where there is a gap in the assigned output locations, e.g. a fragment shader writes to color buffer 2 but not to color buffers 0 & 1. Fixes GL45-CTS.gtf33.GL3Tests.explicit_attrib_location.explicit_attrib_location_pipeline. Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r--src/mesa/state_tracker/st_program.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 91887dc27db..7cc36b4c985 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -782,7 +782,6 @@ st_translate_fragment_program(struct st_context *st,
* Semantics and mapping for outputs
*/
{
- uint numColors = 0;
GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
/* if z is written, emit that first */
@@ -826,15 +825,25 @@ st_translate_fragment_program(struct st_context *st,
break;
case FRAG_RESULT_COLOR:
write_all = GL_TRUE; /* fallthrough */
- default:
+ default: {
+ int index;
assert(loc == FRAG_RESULT_COLOR ||
(FRAG_RESULT_DATA0 <= loc && loc < FRAG_RESULT_MAX));
+
+ index = (loc == FRAG_RESULT_COLOR) ? 0 : (loc - FRAG_RESULT_DATA0);
+
+ if (attr >= FRAG_RESULT_MAX) {
+ /* Secondary color for dual source blending. */
+ assert(index == 0);
+ index++;
+ }
+
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
- fs_output_semantic_index[fs_num_outputs] = numColors;
+ fs_output_semantic_index[fs_num_outputs] = index;
outputMapping[attr] = fs_num_outputs;
- numColors++;
break;
}
+ }
fs_num_outputs++;
}