We were passing src0 alpha and oMask in reverse order. There seems to be no good way to pass them in the correct order to the new-style LOAD_PAYLOAD (how surprising) because src0 alpha is per-channel while oMask is not. Just split src0 alpha in fixed-width registers and pass them to LOAD_PAYLOAD as if they were part of the header as work-around for now.
I've written a piglit test that demonstrates the problem by using gl_SampleMask from a fragment shader with multiple color outputs [1]. [1] http://lists.freedesktop.org/archives/piglit/2015-July/016499.html --- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 94d6a58..304ae74 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -1535,6 +1535,19 @@ fs_visitor::emit_single_fb_write(const fs_builder &bld, length++; } + if (src0_alpha.file != BAD_FILE && color0.file != BAD_FILE) { + /* Neat, we need to chop the src0 alpha component and pass it as part of + * the header even though it has per-channel semantics, because the next + * optional field is header-like and LOAD_PAYLOAD requires all such + * fields to form a contiguous segment at the beginning of the message. + */ + for (unsigned i = 0; i < exec_size / 8; i++) { + setup_color_payload(&sources[length], src0_alpha, 1, 8, + use_2nd_half || i == 1); + length++; + } + } + prog_data->uses_omask = prog->OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK); if (prog_data->uses_omask) { @@ -1561,19 +1574,14 @@ fs_visitor::emit_single_fb_write(const fs_builder &bld, offset(this->outputs[0], bld, 3), 1, exec_size, false); length += 4; - } else if (color1.file == BAD_FILE) { - if (src0_alpha.file != BAD_FILE) { - setup_color_payload(&sources[length], src0_alpha, 1, exec_size, false); - length++; - } - - setup_color_payload(&sources[length], color0, components, - exec_size, use_2nd_half); - length += 4; } else { setup_color_payload(&sources[length], color0, components, exec_size, use_2nd_half); length += 4; + + } + + if (color1.file != BAD_FILE) { setup_color_payload(&sources[length], color1, components, exec_size, use_2nd_half); length += 4; -- 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev