[Mesa-dev] [PATCH 1/8] nir/builder: Add support for easily building control-flow

Samuel Iglesias Gonsálvez siglesias at igalia.com
Mon Feb 27 10:44:59 UTC 2017



On 24/02/17 21:54, Jason Ekstrand wrote:
> On Fri, Feb 24, 2017 at 6:05 AM, Samuel Iglesias Gonsálvez
> <siglesias at igalia.com <mailto:siglesias at igalia.com>> wrote:
> 
> 
> 
>     On 24/02/17 02:14, Jason Ekstrand wrote:
>     > Each of the pop functions (and push_else) take a control flow
>     parameter as
>     > their second argument.  If NULL, it assumes that the builder is in
>     a block
>     > that's a direct child of the control-flow node you want to pop off the
>     > virtual stack.  This is what 90% of consumers will want.  The
>     SPIR-V pass,
>     > however, is a bit more "creative" about how it walks the CFG and
>     it needs
>     > to be able to pop multiple levels at a time, hence the argument.
>     > ---
>     >  src/compiler/nir/nir_builder.h | 95
>     ++++++++++++++++++++++++++++++++++++++++++
>     >  1 file changed, 95 insertions(+)
>     >
>     > diff --git a/src/compiler/nir/nir_builder.h
>     b/src/compiler/nir/nir_builder.h
>     > index 194d327..2eaa025 100644
>     > --- a/src/compiler/nir/nir_builder.h
>     > +++ b/src/compiler/nir/nir_builder.h
>     > @@ -81,6 +81,101 @@ nir_builder_cf_insert(nir_builder *build,
>     nir_cf_node *cf)
>     >     nir_cf_node_insert(build->cursor, cf);
>     >  }
>     >
>     > +static inline bool
>     > +nir_builder_is_inside_cf(nir_builder *build, nir_cf_node *cf_node)
>     > +{
>     > +   nir_block *block = nir_cursor_current_block(build->cursor);
>     > +   for (nir_cf_node *n = &block->cf_node; n; n = n->parent) {
>     > +      if (n == cf_node)
>     > +         return true;
>     > +   }
>     > +   return false;
>     > +}
>     > +
>     > +static inline nir_if *
>     > +nir_push_if(nir_builder *build, nir_ssa_def *condition)
>     > +{
>     > +   nir_if *nif = nir_if_create(build->shader);
>     > +   nif->condition = nir_src_for_ssa(condition);
>     > +   nir_builder_cf_insert(build, &nif->cf_node);
>     > +   build->cursor = nir_before_cf_list(&nif->then_list);
> 
>     Is this fine? In the places you replace code with this function, there
>     was nir_after_cf_list(&nif->then_list), and same for the others.
> 
> 
> it should be.  The if statement is empty so then_list has exactly one
> block with zero instructions in it.  Inserting before or after the list
> should be equivalent.  That said, I'm happy to change it to after if
> that makes more sense to someone.

OK, thanks. Then this patch is:

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 862 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170227/4b911ee0/attachment-0001.sig>


More information about the mesa-dev mailing list