<p dir="ltr"><br>
On Dec 18, 2014 5:25 PM, "Connor Abbott" <<a href="mailto:cwabbott0@gmail.com">cwabbott0@gmail.com</a>> wrote:<br>
><br>
> On Thu, Dec 18, 2014 at 8:15 PM, Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
> > ---<br>
> >  src/glsl/nir/nir.h | 43 +++++++++++++++++++++++++++++++++----------<br>
> >  1 file changed, 33 insertions(+), 10 deletions(-)<br>
> ><br>
> > diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h<br>
> > index 19781c1..aa128ad 100644<br>
> > --- a/src/glsl/nir/nir.h<br>
> > +++ b/src/glsl/nir/nir.h<br>
> > @@ -98,7 +98,7 @@ typedef struct nir_constant {<br>
> >      * Value of the constant.<br>
> >      *<br>
> >      * The field used to back the values supplied by the constant is determined<br>
> > -    * by the type associated with the \c ir_instruction.  Constants may be<br>
> > +    * by the type associated with the \c nir_variable.  Constants may be<br>
> >      * scalars, vectors, or matrices.<br>
> >      */<br>
> >     union nir_constant_data value;<br>
> > @@ -175,7 +175,7 @@ typedef struct {<br>
> >        /**<br>
> >         * Interpolation mode for shader inputs / outputs<br>
> >         *<br>
> > -       * \sa ir_variable_interpolation<br>
> > +       * \sa glsl_interp_qualifier<br>
> >         */<br>
> >        unsigned interpolation:2;<br>
> ><br>
> > @@ -494,8 +494,8 @@ typedef struct {<br>
> >      */<br>
> >     /*@{*/<br>
> >     /**<br>
> > -    * For inputs interpreted as a floating point, flips the sign bit. For inputs<br>
> > -    * interpreted as an integer, performs the two's complement negation.<br>
> > +    * For inputs interpreted as floating point, flips the sign bit. For<br>
> > +    * inputs interpreted as integers, performs the two's complement negation.<br>
> >      */<br>
> >     bool negate;<br>
> ><br>
> > @@ -584,8 +584,8 @@ typedef struct {<br>
> >     unsigned output_size;<br>
> ><br>
> >     /**<br>
> > -    * The type of vector that the instruction outputs. Note that this<br>
> > -    * determines whether the saturate modifier is allowed.<br>
> > +    * The type of vector that the instruction outputs. Note that the<br>
> > +    * staurate modifier is only allowed on outputs with the float type.<br>
> >      */<br>
> ><br>
> >     nir_alu_type output_type;<br>
> > @@ -596,9 +596,9 @@ typedef struct {<br>
> >     unsigned input_sizes[4];<br>
> ><br>
> >     /**<br>
> > -    * The type of vector that each input takes. Note that negate is only<br>
> > -    * allowed on inputs with int or float type, and behaves differently on the<br>
> > -    * two, and absolute value is only allowed on float type inputs.<br>
> > +    * The type of vector that each input takes. Note that negate and<br>
> > +    * absolute value are only allowed on inputs with int or float type and<br>
> > +    * behave differently on the two.<br>
> >      */<br>
> >     nir_alu_type input_types[4];<br>
> ><br>
> > @@ -698,6 +698,22 @@ typedef enum {<br>
> >  #undef INTRINSIC<br>
> >  #undef LAST_INTRINSIC<br>
> ><br>
> > +/** Represents an intrinsic<br>
> > + *<br>
> > + * An intrinsic is an instruction type for handling all of the little<br>
> > + * special cases that we have to represent in the IR.  This provides us<br>
> > + * with a single instruction type for handling a lot of different cases.<br>
> > + * This way, optimization passes can look for intrinsics and, for the most<br>
> > + * part, completely ignore them.  Some special cases such as phi nodes and<br>
> > + * parallel copies really do need their own instruction type, but most<br>
> > + * things can be intrinsics.<br>
><br>
> I think I would put things a little differently: intrinsics are for<br>
> loads, stores, or really anything we don't need to special-case that<br>
> requires some kind of dependency on the outside world, or rather<br>
> anything which doesn't merely consume some SSA values to produce<br>
> another SSA value. Feel free to say something like this in addition to<br>
> what you said, replacing what you said, or not at all. Also, I think<br>
> textures are a special case too (I originally wanted to use intrinsics<br>
> for them, but the combinatorial explosion was too much to deal with).</p>
<p dir="ltr">Sure, I can rework that</p>
<p dir="ltr">><br>
> > + *<br>
> > + * Each intrinsic has some number of constant indices, some number of<br>
> > + * variables, and some number of sources.  What these sources, variables,<br>
> > + * and indices mean depends on the intrinsic and is documented with the<br>
> > + * intrinsic declaration in nir_intrinsics.h.  Intrinsics are the only type<br>
> > + * of instruction that can operate on variables.<br>
><br>
> (except for textures)</p>
<p dir="ltr">Of course</p>
<p dir="ltr">><br>
> > + */<br>
> >  typedef struct {<br>
> >     nir_instr instr;<br>
> ><br>
> > @@ -705,7 +721,14 @@ typedef struct {<br>
> ><br>
> >     nir_dest dest;<br>
> ><br>
> > -   /** number of components if this is a vectorized intrinsic */<br>
> > +   /** number of components if this is a vectorized intrinsic<br>
> > +    *<br>
> > +    * Similarly to ALU operations, some intrinsics are vectorized.<br>
> > +    * An intrinsic is vectorized if nir_intrinsic_infos.dest_components == 0.<br>
> > +    * For vectorized intrinsics, the num_components field specifies the<br>
> > +    * number of destination components and the number of source components<br>
> > +    * for all sources with nir_intrinsic_infos.src_components[i] == 0.<br>
> > +    */<br>
> >     uint8_t num_components;<br>
> ><br>
> >     int const_index[3];<br>
> > --<br>
> > 2.2.0<br>
> ><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>