mesa/st: fix color outputs in presence of sample mask output

Commit c5d822dad9 added support for sample mask incorrectly. It became
treated as a color output, and messed up the color output indices.
Revert the hunk that did that, and add explicit support just like for
depth/stencil writes.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Acked-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Ilia Mirkin
2014-05-23 11:18:16 -04:00
parent aa78c4586d
commit ab7bd7093d

View File

@@ -679,32 +679,36 @@ st_translate_fragment_program(struct st_context *st,
outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
} }
if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) {
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_SAMPLEMASK;
fs_output_semantic_index[fs_num_outputs] = 0;
outputMapping[FRAG_RESULT_SAMPLE_MASK] = fs_num_outputs;
fs_num_outputs++;
outputsWritten &= ~(1 << FRAG_RESULT_SAMPLE_MASK);
}
/* handle remaining outputs (color) */ /* handle remaining outputs (color) */
for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
if (outputsWritten & BITFIELD64_BIT(attr)) { if (outputsWritten & BITFIELD64_BIT(attr)) {
int semantic = TGSI_SEMANTIC_COLOR;
switch (attr) { switch (attr) {
case FRAG_RESULT_DEPTH: case FRAG_RESULT_DEPTH:
case FRAG_RESULT_STENCIL: case FRAG_RESULT_STENCIL:
case FRAG_RESULT_SAMPLE_MASK:
/* handled above */ /* handled above */
assert(0); assert(0);
break; break;
case FRAG_RESULT_COLOR: case FRAG_RESULT_COLOR:
write_all = GL_TRUE; write_all = GL_TRUE; /* fallthrough */
break; default:
case FRAG_RESULT_SAMPLE_MASK: assert(attr == FRAG_RESULT_COLOR ||
semantic = TGSI_SEMANTIC_SAMPLEMASK; (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
fs_output_semantic_index[fs_num_outputs] = numColors;
outputMapping[attr] = fs_num_outputs;
numColors++;
break; break;
} }
assert(attr == FRAG_RESULT_COLOR ||
attr == FRAG_RESULT_SAMPLE_MASK ||
(FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
fs_output_semantic_name[fs_num_outputs] = semantic;
fs_output_semantic_index[fs_num_outputs] = numColors;
outputMapping[attr] = fs_num_outputs;
numColors++;
fs_num_outputs++; fs_num_outputs++;
} }
} }