diff options
author | Nicolai Hähnle <[email protected]> | 2016-10-07 17:33:07 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-10-12 18:50:10 +0200 |
commit | 957d5410892aa7b12bb19fe081a7073861b424a6 (patch) | |
tree | 4700546c7d386f7f84293e6b1a799f1c50a71624 | |
parent | 14aaaa1b4b3dfe8bec897ec0ee289a51627af7bd (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.cpp | 25 |
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)) { |