summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2016-10-07 17:33:07 +0200
committerNicolai Hähnle <[email protected]>2016-10-12 18:50:10 +0200
commit957d5410892aa7b12bb19fe081a7073861b424a6 (patch)
tree4700546c7d386f7f84293e6b1a799f1c50a71624
parent14aaaa1b4b3dfe8bec897ec0ee289a51627af7bd (diff)
st/glsl_to_tgsi: explicit handling of writemask for depth/stencil export
Reviewed-by: Edward O'Callaghan <[email protected]> Reviewed-by: Dave Airlie <[email protected]>
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index f8698929d4a..da7b83b7f08 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -2868,19 +2868,28 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
} else
l.writemask = WRITEMASK_XYZW;
}
- } else if (ir->lhs->type->is_scalar() &&
- !ir->lhs->type->is_64bit() &&
- ir->lhs->variable_referenced()->data.mode == ir_var_shader_out) {
- /* FINISHME: This hack makes writing to gl_FragDepth, which lives in the
- * FINISHME: W component of fragment shader output zero, work correctly.
- */
- l.writemask = WRITEMASK_XYZW;
} else {
int swizzles[4];
int first_enabled_chan = 0;
int rhs_chan = 0;
+ ir_variable *variable = ir->lhs->variable_referenced();
+
+ if (shader->Stage == MESA_SHADER_FRAGMENT &&
+ variable->data.mode == ir_var_shader_out &&
+ (variable->data.location == FRAG_RESULT_DEPTH ||
+ variable->data.location == FRAG_RESULT_STENCIL)) {
+ assert(ir->lhs->type->is_scalar());
+ assert(ir->write_mask == WRITEMASK_X);
- l.writemask = ir->write_mask;
+ if (variable->data.location == FRAG_RESULT_DEPTH)
+ l.writemask = WRITEMASK_Z;
+ else {
+ assert(variable->data.location == FRAG_RESULT_STENCIL);
+ l.writemask = WRITEMASK_Y;
+ }
+ } else {
+ l.writemask = ir->write_mask;
+ }
for (int i = 0; i < 4; i++) {
if (l.writemask & (1 << i)) {