[Mesa-dev] [PATCH 1/4] i965/fs: Use sample interpolation for interpolateAtCentroid in persample mode

Jason Ekstrand jason at jlekstrand.net
Wed Sep 14 20:31:43 UTC 2016


On Wed, Sep 14, 2016 at 1:29 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:

> On Wed, Sep 14, 2016 at 10:45 AM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > From the ARB_gpu_shader5 spec:
> >
> >    The built-in functions interpolateAtCentroid() and
> interpolateAtSample()
> >    will sample variables as though they were declared with the "centroid"
> >    or "sample" qualifiers, respectively.
> >
> > When running with persample dispatch forced by the API, we interpolate
> > anything that isn't flat as if it's qualified by "sample".  In order to
> > keep interpolateAtCentroid() consistent with the "centroid" qualifier, we
> > need to make interpolateAtCentroid() do sample interpolation instead.
> > Nothing in the GLSL spec guarantees that the result of
> > interpolateAtCentroid is uniform across samples in any way, so this is a
> > perfectly fine thing to do.
> >
> This explanation sounds good to me. To be consistent with what
> we do in case of per sample interpolation, shouldn't we do sample
> interpolation in case of InterpolateAtOffset() too? This series
> doesn't seem to include it.
>

No.  interpolateAtOffset ask that the input be interpolated at a particular
offset relative to the pixel center.  I believe we have to respect that.


> > Fixes 8 of the new dEQP-VK.pipeline.multisample_interpolation.* Vulkan
> CTS
> > tests that specifically validate consistency between the "sample"
> qualifier
> > and interpolateAtSample()
> >
> > Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs.cpp | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > index 75642d3..9dbb699 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > @@ -6497,6 +6497,32 @@ brw_nir_set_default_interpolation(const struct
> gen_device_info *devinfo,
> >           var->data.sample = false;
> >        }
> >     }
> > +
> > +   if (per_sample_interpolation) {
> > +      nir_foreach_block(block, nir_shader_get_entrypoint(nir)) {
> > +         nir_foreach_instr(instr, block) {
> > +            if (instr->type != nir_instr_type_intrinsic)
> > +               continue;
> > +
> > +            nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
> > +            if (intrin->intrinsic != nir_intrinsic_interp_var_at_
> centroid)
> > +               continue;
> > +
> > +            nir_variable *var = intrin->variables[0]->var;
> > +            if (var->data.interpolation == INTERP_MODE_FLAT)
> > +               continue;
> > +
> > +            /* The description of the interpolateAtCentroid intrinsic
> is that
> > +             * it interpolates the variable as if it had the "centroid"
> > +             * qualifier.  When executing with
> per_sample_interpolation, this
> > +             * is equivalent to having the "sample" qualifier.  Just
> convert
> > +             * it to a load_var instead.
> > +             */
> > +            assert(var->data.sample);
> > +            intrin->intrinsic = nir_intrinsic_load_var;
> > +         }
> > +      }
> > +   }
> >  }
> >
> >  /**
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > 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/20160914/1719dc99/attachment.html>


More information about the mesa-dev mailing list