i965/vec4: don't copy ATTR into 3src instructions with complex swizzles
authorMatt Turner <mattst88@gmail.com>
Mon, 18 Jan 2016 01:30:14 +0000 (20:30 -0500)
committerMatt Turner <mattst88@gmail.com>
Fri, 5 Feb 2016 17:33:19 +0000 (09:33 -0800)
commit9f2e22bf343b21d6b44e6a502f00a86d169f5ade
tree02fe6791a1b259c8cd984dca22537e37a9a1d8fd
parent1106e79ed97809ef8f880cccc6cb65fefa709785
i965/vec4: don't copy ATTR into 3src instructions with complex swizzles

The vec4 backend, at the end, does this:

    if (inst->is_3src()) {
       for (int i = 0; i < 3; i++) {
          if (inst->src[i].vstride == BRW_VERTICAL_STRIDE_0)
             assert(brw_is_single_value_swizzle(inst->src[i].swizzle));

So make sure that we use the same conditions when trying to
copy-propagate. UNIFORMs will be converted to vstride 0 in
convert_to_hw_regs, but so will ATTRs when interleaved (as will happen
in a GS with multiple attributes). Since the vstride is not set at
copy-prop time, infer it by inspecting dispatch_mode and reject ATTRs if
they have non-scalar swizzles and are interleaved.

Fixes assertion errors in dolphin-generated geometry shaders (or
misrendering on opt builds) on Sandybridge or on IVB/HSW with
INTEL_DEBUG=nodualobj.

Co-authored-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93418
Cc: "11.0 11.1" <mesa-stable@lists.freedesktop.org>
src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp