[Mesa-dev] [PATCH v4 2/3] i965/fs: Use NIR's scalarizing abilities and stop handling vectors

Kenneth Graunke kenneth at whitecape.org
Thu Jan 29 03:41:36 PST 2015


On Wednesday, January 28, 2015 04:27:23 PM Jason Ekstrand wrote:
> On Wed, Jan 28, 2015 at 4:02 PM, Matt Turner <mattst88 at gmail.com> wrote:
> 
> > On Tue, Jan 27, 2015 at 5:31 PM, Jason Ekstrand <jason at jlekstrand.net>
> > wrote:
> > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> > b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> > > index de0d780..217fe09 100644
> > > @@ -689,9 +689,9 @@ fs_visitor::nir_emit_alu(nir_alu_instr *instr)
> > >
> > >        struct brw_reg acc = retype(brw_acc_reg(dispatch_width),
> > result.type);
> > >
> > > -      emit_percomp(MUL(acc, op[0], op[1]), instr->dest.write_mask);
> > > -      emit_percomp(MACH(reg_null_d, op[0], op[1]),
> > instr->dest.write_mask);
> > > -      emit_percomp(MOV(result, fs_reg(acc)), instr->dest.write_mask);
> >
> > Bah. How the hell did the old code pass piglit?
> >
> 
> I think channel expressions saved it.
> 
> 
> >
> > > +      emit(MUL(acc, op[0], op[1]));
> > > +      emit(MACH(reg_null_d, op[0], op[1]));
> > > +      emit(MOV(result, fs_reg(acc)));
> > >        break;
> > >     }
> > >
> > > @@ -773,72 +767,38 @@ fs_visitor::nir_emit_alu(nir_alu_instr *instr)
> > >     case nir_op_ball_fequal3:
> > >     case nir_op_ball_iequal3:
> > >     case nir_op_ball_fequal4:
> > > -   case nir_op_ball_iequal4: {
> > > -      unsigned num_components = nir_op_infos[instr->op].input_sizes[0];
> > > -      fs_reg temp = vgrf(num_components);
> > > -      emit_percomp(CMP(temp, op[0], op[1], BRW_CONDITIONAL_Z),
> > > -                   (1 << num_components) - 1);
> > > -      emit_reduction(BRW_OPCODE_AND, result, temp, num_components);
> > > -      break;
> > > -   }
> > > -
> > > +   case nir_op_ball_iequal4:
> >
> > We can save it for later, but it might be interesting to let the fs
> > backend get the vector comparisons directly, if that's possible.
> >
> > See https://bugs.freedesktop.org/show_bug.cgi?id=77456
> >
> 
> We can.  We just have to add a flag to turn that off in the
> nir_lower_alu_to_scalar pass.
> 
> 
> >
> > > @@ -867,83 +827,67 @@ fs_visitor::nir_emit_alu(nir_alu_instr *instr)
> > >        unreachable("not reached: should be handled by ldexp_to_arith()");
> > >
> > >     case nir_op_fsqrt:
> > > -      emit_math_percomp(SHADER_OPCODE_SQRT, result, op[0],
> > > -                        instr->dest.write_mask, instr->dest.saturate);
> > > +      emit_math(SHADER_OPCODE_SQRT, result, op[0])
> > > +               ->saturate = instr->dest.saturate;
> >
> > I don't really like the ->saturate = ... as a single statement. I know
> > I'm guilty of using it in a unit test recently.
> >
> 
> Yeah, I'm not sure what to do there.  I really don't like having to assign
> it to a fs_inst variable and then do the saturate.  I guess we could.  Or
> we could add something to emit_math.  Thoughts?

In the brw_eu_emit.c code I worked around this by creating a brw_last_inst
macro that always refers to the most recently emitted instruction.

Still not 100% crazy about it, but it's been pretty handy.  *shrug*.
It's an idea, anyway.

I'm not too opposed to just creating fs_inst * temporaries.

--Ken
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150129/6cfec678/attachment-0001.sig>


More information about the mesa-dev mailing list