Fixes the garbage output I was seeing with bloom enabled. Thanks! Tested-by: Alex Smith <asm...@feralinteractive.com>
On Wed, 3 Oct 2018 at 20:16, Jason Ekstrand <ja...@jlekstrand.net> wrote: > The ssa_for_alu_src helper will correctly handle swizzles and other > source modifiers for you. The expansions for unpack_half_2x16, > pack_uvec2_to_uint, and pack_uvec4_to_uint were all broken with regards > to swizzles. The brokenness of unpack_half_2x16 was causing rendering > errors in Rise of the Tomb Raider on Intel ever since c11833ab24dcba26 > which added an extra copy propagation to the optimization pipeline and > caused us to start seeing swizzles where we hadn't seen any before. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107926 > Fixes: 9ce901058f3d "nir: Add lowering of nir_op_unpack_half_2x16." > Fixes: 9b8786eba955 "nir: Add lowering support for packing opcodes." > Cc: Alex Smith <asm...@feralinteractive.com> > Cc: Matt Turner <matts...@gmail.com> > --- > src/compiler/nir/nir_lower_alu_to_scalar.c | 33 ++++++++++++---------- > 1 file changed, 18 insertions(+), 15 deletions(-) > > diff --git a/src/compiler/nir/nir_lower_alu_to_scalar.c > b/src/compiler/nir/nir_lower_alu_to_scalar.c > index 742c8d8ee66..0be3aba9456 100644 > --- a/src/compiler/nir/nir_lower_alu_to_scalar.c > +++ b/src/compiler/nir/nir_lower_alu_to_scalar.c > @@ -107,11 +107,11 @@ lower_alu_instr_scalar(nir_alu_instr *instr, > nir_builder *b) > if (!b->shader->options->lower_pack_half_2x16) > return false; > > + nir_ssa_def *src_vec2 = nir_ssa_for_alu_src(b, instr, 0); > + > nir_ssa_def *val = > - nir_pack_half_2x16_split(b, nir_channel(b, instr->src[0].src.ssa, > - > instr->src[0].swizzle[0]), > - nir_channel(b, instr->src[0].src.ssa, > - > instr->src[0].swizzle[1])); > + nir_pack_half_2x16_split(b, nir_channel(b, src_vec2, 0), > + nir_channel(b, src_vec2, 1)); > > nir_ssa_def_rewrite_uses(&instr->dest.dest.ssa, > nir_src_for_ssa(val)); > nir_instr_remove(&instr->instr); > @@ -130,9 +130,11 @@ lower_alu_instr_scalar(nir_alu_instr *instr, > nir_builder *b) > if (!b->shader->options->lower_unpack_half_2x16) > return false; > > + nir_ssa_def *packed = nir_ssa_for_alu_src(b, instr, 0); > + > nir_ssa_def *comps[2]; > - comps[0] = nir_unpack_half_2x16_split_x(b, instr->src[0].src.ssa); > - comps[1] = nir_unpack_half_2x16_split_y(b, instr->src[0].src.ssa); > + comps[0] = nir_unpack_half_2x16_split_x(b, packed); > + comps[1] = nir_unpack_half_2x16_split_y(b, packed); > nir_ssa_def *vec = nir_vec(b, comps, 2); > > nir_ssa_def_rewrite_uses(&instr->dest.dest.ssa, > nir_src_for_ssa(vec)); > @@ -144,8 +146,8 @@ lower_alu_instr_scalar(nir_alu_instr *instr, > nir_builder *b) > assert(b->shader->options->lower_pack_snorm_2x16 || > b->shader->options->lower_pack_unorm_2x16); > > - nir_ssa_def *word = > - nir_extract_u16(b, instr->src[0].src.ssa, nir_imm_int(b, 0)); > + nir_ssa_def *word = nir_extract_u16(b, nir_ssa_for_alu_src(b, > instr, 0), > + nir_imm_int(b, 0)); > nir_ssa_def *val = > nir_ior(b, nir_ishl(b, nir_channel(b, word, 1), nir_imm_int(b, > 16)), > nir_channel(b, word, 0)); > @@ -159,8 +161,8 @@ lower_alu_instr_scalar(nir_alu_instr *instr, > nir_builder *b) > assert(b->shader->options->lower_pack_snorm_4x8 || > b->shader->options->lower_pack_unorm_4x8); > > - nir_ssa_def *byte = > - nir_extract_u8(b, instr->src[0].src.ssa, nir_imm_int(b, 0)); > + nir_ssa_def *byte = nir_extract_u8(b, nir_ssa_for_alu_src(b, instr, > 0), > + nir_imm_int(b, 0)); > nir_ssa_def *val = > nir_ior(b, nir_ior(b, nir_ishl(b, nir_channel(b, byte, 3), > nir_imm_int(b, 24)), > nir_ishl(b, nir_channel(b, byte, 2), > nir_imm_int(b, 16))), > @@ -173,14 +175,15 @@ lower_alu_instr_scalar(nir_alu_instr *instr, > nir_builder *b) > } > > case nir_op_fdph: { > + nir_ssa_def *src0_vec = nir_ssa_for_alu_src(b, instr, 0); > + nir_ssa_def *src1_vec = nir_ssa_for_alu_src(b, instr, 1); > + > nir_ssa_def *sum[4]; > for (unsigned i = 0; i < 3; i++) { > - sum[i] = nir_fmul(b, nir_channel(b, instr->src[0].src.ssa, > - instr->src[0].swizzle[i]), > - nir_channel(b, instr->src[1].src.ssa, > - instr->src[1].swizzle[i])); > + sum[i] = nir_fmul(b, nir_channel(b, src0_vec, i), > + nir_channel(b, src1_vec, i)); > } > - sum[3] = nir_channel(b, instr->src[1].src.ssa, > instr->src[1].swizzle[3]); > + sum[3] = nir_channel(b, src1_vec, 3); > > nir_ssa_def *val = nir_fadd(b, nir_fadd(b, sum[0], sum[1]), > nir_fadd(b, sum[2], sum[3])); > -- > 2.17.1 > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev