diff options
author | Nicolai Hähnle <[email protected]> | 2016-10-13 09:49:11 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-10-17 19:09:37 +0200 |
commit | 57a15142037e3eea3581a6c690b8e8e93729b5b3 (patch) | |
tree | b8f5c94e913b802a9ad92fceb092f6a8aecb1133 | |
parent | e0213f36bb9e2aebd84845d3c06fcc74cc749f0f (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.c | 17 |
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++; } |