LGTM On Fri, Nov 2, 2018 at 8:37 AM Timothy Arceri <tarc...@itsqueeze.com> wrote:
> We cannot use nir_build_alu() to create the new alu as it has no > way to know how many components of the src we will use. This > results in it guessing the max number of components from one of > its inputs. > > Fixes the following CTS tests: > > > dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag > > dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom > > dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_tessc > > dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_vert > > V2: use nir_src_for_ssa() in clone > > Fixes: 2975422ceb6c ("nir: propagates if condition evaluation down some > alu chains") > --- > src/compiler/nir/nir_opt_if.c | 31 ++++++++++++++++++++++++++++++- > 1 file changed, 30 insertions(+), 1 deletion(-) > > diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c > index ed93cac9ce9..8a971c43f24 100644 > --- a/src/compiler/nir/nir_opt_if.c > +++ b/src/compiler/nir/nir_opt_if.c > @@ -391,6 +391,34 @@ evaluate_if_condition(nir_if *nif, nir_cursor cursor, > bool *value) > } > } > > +static nir_ssa_def * > +clone_alu_and_replace_src_defs(nir_builder *b, const nir_alu_instr *alu, > + nir_ssa_def **src_defs) > +{ > + nir_alu_instr *nalu = nir_alu_instr_create(b->shader, alu->op); > + nalu->exact = alu->exact; > + > + nir_ssa_dest_init(&nalu->instr, &nalu->dest.dest, > + alu->dest.dest.ssa.num_components, > + alu->dest.dest.ssa.bit_size, alu->dest.dest.ssa.name > ); > + > + nalu->dest.saturate = alu->dest.saturate; > + nalu->dest.write_mask = alu->dest.write_mask; > + > + for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) { > + assert(alu->src[i].src.is_ssa); > + nalu->src[i].src = nir_src_for_ssa(src_defs[i]); > + nalu->src[i].negate = alu->src[i].negate; > + nalu->src[i].abs = alu->src[i].abs; > + memcpy(nalu->src[i].swizzle, alu->src[i].swizzle, > + sizeof(nalu->src[i].swizzle)); > + } > + > + nir_builder_instr_insert(b, &nalu->instr); > + > + return &nalu->dest.dest.ssa;; > +} > + > /* > * This propagates if condition evaluation down the chain of some alu > * instructions. For example by checking the use of some of the following > alu > @@ -456,7 +484,8 @@ propagate_condition_eval(nir_builder *b, nir_if *nif, > nir_src *use_src, > def[i] = alu->src[i].src.ssa; > } > } > - nir_ssa_def *nalu = nir_build_alu(b, alu->op, def[0], def[1], def[2], > def[3]); > + > + nir_ssa_def *nalu = clone_alu_and_replace_src_defs(b, alu, def); > > /* Rewrite use to use new alu instruction */ > nir_src new_src = nir_src_for_ssa(nalu); > -- > 2.19.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev