glsl: Fix gl_program::OutputsWritten computation for dual-source blending.
authorFrancisco Jerez <currojerez@riseup.net>
Sat, 20 Aug 2016 21:55:19 +0000 (14:55 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 30 Aug 2016 23:54:19 +0000 (16:54 -0700)
commitfd04d048aec8f850d77f6908c0d13f88195df0da
treec039c7718cb365e730ba35631630613c267b155d
parent965934f38ab36b77672b70693b5b7b9c983f852b
glsl: Fix gl_program::OutputsWritten computation for dual-source blending.

In the fragment shader OutputsWritten is a bitset of FRAG_RESULT_*
enumerants, which represent the location of each color output written
by the shader.  The secondary and primary color outputs of a given
render target using dual-source blending have the same location, so
the 'idx' computation below will give the wrong bit as result if the
'var->data.index' term is non-zero -- E.g. if the shader writes the
primary and secondary colors of the FRAG_RESULT_COLOR output,
ir_set_program_inouts will think that the shader writes both
FRAG_RESULT_COLOR and FRAG_RESULT_SAMPLE_MASK, which is just bogus.

That would cause the brw_wm_prog_key::nr_color_regions computation
done in the i965 driver during fragment shader precompilation to be
wrong, which currently leads to unnecessary recompilation of shaders
that use dual-source blending, and triggers an assertion failure in
fs_visitor::emit_fb_writes() on my i965-fb-fetch branch.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/compiler/glsl/ir_set_program_inouts.cpp
src/mesa/state_tracker/st_program.c