[Mesa-dev] [PATCH 04/11] nir: Add a pass to lower TES patch_vertices intrinsics to a constant.

Jason Ekstrand jason at jlekstrand.net
Mon Jan 9 16:40:10 UTC 2017


For similar compute-related things (workgroup sizes) we handle this
directly in nir_lower_system_values.

On Sun, Jan 8, 2017 at 9:39 PM, Dave Airlie <airlied at gmail.com> wrote:

> On 9 January 2017 at 15:26, Kenneth Graunke <kenneth at whitecape.org> wrote:
> > In Vulkan, we always have both the TCS and TES available in the same
> > pipeline, so we can simply use the TCS OutputVertices execution mode
> > value as the TES PatchVertices built-in.
> >
> > For GLSL, we handle this in the linker.  But we could use this pass
> > in the case when both TCS and TES are linked together, if we wanted.
> >
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
>
> Reviewed-by: Dave Airlie <airlied at redhat.com>
> though I'd like someone more NIR focused to also look at it.
>
> Dave.
>
> > ---
> >  src/compiler/Makefile.sources               |  1 +
> >  src/compiler/nir/nir.h                      |  1 +
> >  src/compiler/nir/nir_lower_patch_vertices.c | 53
> +++++++++++++++++++++++++++++
> >  3 files changed, 55 insertions(+)
> >  create mode 100644 src/compiler/nir/nir_lower_patch_vertices.c
> >
> > diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.
> sources
> > index 52f6e5428f4..7479afae047 100644
> > --- a/src/compiler/Makefile.sources
> > +++ b/src/compiler/Makefile.sources
> > @@ -218,6 +218,7 @@ NIR_FILES = \
> >         nir/nir_lower_io_to_scalar.c \
> >         nir/nir_lower_io_types.c \
> >         nir/nir_lower_passthrough_edgeflags.c \
> > +       nir/nir_lower_patch_vertices.c \
> >         nir/nir_lower_phis_to_scalar.c \
> >         nir/nir_lower_regs_to_ssa.c \
> >         nir/nir_lower_returns.c \
> > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> > index d17924c2aac..cb8f7749745 100644
> > --- a/src/compiler/nir/nir.h
> > +++ b/src/compiler/nir/nir.h
> > @@ -2464,6 +2464,7 @@ void nir_lower_two_sided_color(nir_shader
> *shader);
> >  void nir_lower_clamp_color_outputs(nir_shader *shader);
> >
> >  void nir_lower_passthrough_edgeflags(nir_shader *shader);
> > +void nir_lower_tes_patch_vertices(nir_shader *tes, unsigned
> patch_vertices);
> >
> >  typedef struct nir_lower_wpos_ytransform_options {
> >     int state_tokens[5];
> > diff --git a/src/compiler/nir/nir_lower_patch_vertices.c
> b/src/compiler/nir/nir_lower_patch_vertices.c
> > new file mode 100644
> > index 00000000000..d196576b993
> > --- /dev/null
> > +++ b/src/compiler/nir/nir_lower_patch_vertices.c
> > @@ -0,0 +1,53 @@
> > +/*
> > + * Copyright © 2016 Intel Corporation
> > + *
> > + * Permission is hereby granted, free of charge, to any person
> obtaining a
> > + * copy of this software and associated documentation files (the
> "Software"),
> > + * to deal in the Software without restriction, including without
> limitation
> > + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the
> next
> > + * paragraph) shall be included in all copies or substantial portions
> of the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
> SHALL
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> DEALINGS
> > + * IN THE SOFTWARE.
> > + */
> > +
> > +#include "nir_builder.h"
> > +
> > +void
> > +nir_lower_tes_patch_vertices(nir_shader *tes_nir, unsigned
> patch_vertices)
> > +{
> > +   nir_foreach_function(function, tes_nir) {
> > +      if (function->impl) {
> > +         nir_foreach_block(block, function->impl) {
> > +            nir_builder b;
> > +            nir_builder_init(&b, function->impl);
> > +            nir_foreach_instr_safe(instr, block) {
> > +               if (instr->type == nir_instr_type_intrinsic) {
> > +                  nir_intrinsic_instr *intr =
> nir_instr_as_intrinsic(instr);
> > +                  if (intr->intrinsic != nir_intrinsic_load_patch_
> vertices_in)
> > +                     continue;
> > +
> > +                  b.cursor = nir_before_instr(&intr->instr);
> > +                  nir_ssa_def *val = nir_imm_int(&b, patch_vertices);
> > +                  nir_ssa_def_rewrite_uses(&intr->dest.ssa,
> > +                                           nir_src_for_ssa(val));
> > +                  nir_instr_remove(instr);
> > +               }
> > +            }
> > +         }
> > +
> > +         nir_metadata_preserve(function->impl,
> nir_metadata_block_index |
> > +                                               nir_metadata_dominance);
> > +      }
> > +   }
> > +}
> > --
> > 2.11.0
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> 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/20170109/7a141c01/attachment.html>


More information about the mesa-dev mailing list