[Mesa-dev] [PATCH 1/2] i965/fs: fix precision of f2b

Jason Ekstrand jason at jlekstrand.net
Thu Feb 25 17:14:22 UTC 2016


On Thu, Feb 25, 2016 at 8:19 AM, Matt Turner <mattst88 at gmail.com> wrote:

> On Thu, Feb 25, 2016 at 2:15 AM, Iago Toral Quiroga <itoral at igalia.com>
> wrote:
> > From the OpenGL 4.2 spec:
> >
> > "When a constructor is used to convert any integer or floating-point
> type to a
> >  bool, 0 and 0.0 are converted to false, and non-zero values are
> converted to
> >  true."
> >
> > Thus, even the smallest non-zero floating value should be translated to
> true.
> > This behavior has been verified also with proprietary NVIDIA drivers.
>
> Ooh, interesting.
>
> > Currently, we implement this conversion as a cmp.nz operation with
> floats,
> > subject to floating-point precision limitations, and as a result,
> relatively
> > small non-zero floating point numbers return false instead of true.
> >
> > This patch fixes the problem by getting rid of the sign bit (to cover
> the case
> > of -0.0) and testing the result against 0u using an integer comparison
> instead.
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 15 ++++++++++++---
> >  1 file changed, 12 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> > index db20c71..7d62d7e 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> > @@ -913,9 +913,18 @@ fs_visitor::nir_emit_alu(const fs_builder &bld,
> nir_alu_instr *instr)
> >        bld.MOV(result, negate(op[0]));
> >        break;
> >
> > -   case nir_op_f2b:
> > -      bld.CMP(result, op[0], brw_imm_f(0.0f), BRW_CONDITIONAL_NZ);
> > -      break;
> > +   case nir_op_f2b: {
> > +      /* Because comparing to 0.0f is subject to precision limitations,
> do the
> > +       * comparison using integers (we need to get rid of the sign bit
> for that)
> > +       */
> > +      if (devinfo->gen >= 8)
> > +         op[0] = resolve_source_modifiers(op[0]);
>

Hrm... I'm not sure what I think about this.  Neither abs nor neg *should*
affect f2b since zero/non-zero should just pass through.  However,
resolving the source modifiers could affect if they, for instance, flushed
dnorms.  Incidentally, this means we probably want a NIR optimization to
get rid of neg and abs right before != 0 if we can.


>
> Oh, good thinking.
>
> > +      op[0] = retype(op[0], BRW_REGISTER_TYPE_UD);
> > +      bld.AND(op[0], op[0], brw_imm_ud(0x7FFFFFFFu));
> > +      bld.CMP(result, op[0], brw_imm_ud(0u), BRW_CONDITIONAL_NZ);
>
> The cmod_propagation is going to turn this into an AND.NZ, which we
> may as well just do here:
>
>    set_condmod(BRW_CONDITIONAL_NZ,
>                           bld.AND(result, op[0], brw_imm_ud(0x7FFFFFFFu));
>
> > +       break;
>
> Bad indentation.
>
> With those two things changed in both patches, they are
>
> Reviewed-by: Matt Turner <mattst88 at gmail.com>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160225/1d98b62d/attachment-0001.html>


More information about the mesa-dev mailing list