[Mesa-dev] [PATCH v2 32/53] intel/fs: Mark LINTERP opcode as writing accumulator on platforms without PLN
Jason Ekstrand
jason at jlekstrand.net
Sat May 26 18:51:45 UTC 2018
On Sat, May 26, 2018 at 11:10 AM, Francisco Jerez <currojerez at riseup.net>
wrote:
> Jason Ekstrand <jason at jlekstrand.net> writes:
>
> > From: Francisco Jerez <currojerez at riseup.net>
> >
> > When we don't have PLN (gen4 and gen11+), we implement LINTERP as either
> > LINE+MAC or a pair of MADs. In both cases, the accumulator is written
> > by the first of the two instructions and read by the second. Even
> > though the accumulator value isn't actually ever used from a logical
> > instruction perspective, it is trashed so we need to make the scheduler
> > aware. Otherwise, the scheduler could end up re-ordering instructions
> > and putting a LINTERP between another an instruction which writes the
> > accumulator and another which tries to use that result.
> >
> > Cc: mesa-stable at lists.freedesktop.org
> > ---
> > src/intel/compiler/brw_shader.cpp | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/intel/compiler/brw_shader.cpp b/src/intel/compiler/brw_
> shader.cpp
> > index 141b64e..dfd2c5c 100644
> > --- a/src/intel/compiler/brw_shader.cpp
> > +++ b/src/intel/compiler/brw_shader.cpp
> > @@ -984,7 +984,8 @@ backend_instruction::writes_accumulator_implicitly(const
> struct gen_device_info
> > return writes_accumulator ||
> > (devinfo->gen < 6 &&
> > ((opcode >= BRW_OPCODE_ADD && opcode < BRW_OPCODE_NOP) ||
> > - (opcode >= FS_OPCODE_DDX_COARSE && opcode <=
> FS_OPCODE_LINTERP)));
> > + (opcode >= FS_OPCODE_DDX_COARSE && opcode <=
> FS_OPCODE_LINTERP))) ||
> > + (opcode == FS_OPCODE_LINTERP && !devinfo->has_pln);
>
> The devinfo->has_pln condition is technically inaccurate, because even
> SNB will fall back to the non-PLN path which overwrites the accumulator
> for certain valid IR, which yeah I'm aware is not *typically*
> encountered before this series,
I'm pretty sure it's impossible before this series because, without SIMD32,
the barycentric coordinates always start at g2 and get incremented by 2
every time. The only other way to get something into the coordinates
source of the PLN is with a pixel interpolator message. For that, the
register allocator has a workaround to ensure that it's assigned an even
register on SNB. One of the early patches in my series replaces the broken
gen4.5-6 PLN fall-back (it didn't work in SIMD16 because it assumed the
wrong register layout for coordinates) with an assert and Jenkins is just
fine with the assert.
> but why make things more inaccurate than
> the original only to revert back to a devinfo->gen based check in
> PATCHv2 33?
>
See above.
> I think I'd squash the last hunk of PATCHv2 33 into this one which would
> give you something functionally equivalent to v1 but updated to handle
> Gen11 correctly.
>
> > }
> >
> > bool
> > --
> > 2.5.0.400.gff86faf
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180526/33a9e32a/attachment.html>
More information about the mesa-dev
mailing list