[Mesa-dev] [PATCH 15/28] glsl: add support for packing varyings with explicit locations

Anuj Phogat anuj.phogat at gmail.com
Wed Jan 20 15:04:23 PST 2016


On Wed, Jan 20, 2016 at 1:53 PM, Timothy Arceri
<timothy.arceri at collabora.com> wrote:
> On Wed, 2016-01-20 at 09:32 -0800, Anuj Phogat wrote:
>> On Mon, Dec 28, 2015 at 9:00 PM, Timothy Arceri
>> <timothy.arceri at collabora.com> wrote:
>> > ---
>> >  src/glsl/lower_packed_varyings.cpp | 45
>> > +++++++++++++++++++++++++++-----------
>> >  1 file changed, 32 insertions(+), 13 deletions(-)
>> >
>> > diff --git a/src/glsl/lower_packed_varyings.cpp
>> > b/src/glsl/lower_packed_varyings.cpp
>> > index d91aa22..2899846 100644
>> > --- a/src/glsl/lower_packed_varyings.cpp
>> > +++ b/src/glsl/lower_packed_varyings.cpp
>> > @@ -178,11 +178,13 @@ private:
>> >     void bitwise_assign_unpack(ir_rvalue *lhs, ir_rvalue *rhs);
>> >     unsigned lower_rvalue(ir_rvalue *rvalue, unsigned
>> > fine_location,
>> >                           ir_variable *unpacked_var, const char
>> > *name,
>> > -                         bool gs_input_toplevel, unsigned
>> > vertex_index);
>> > +                         bool gs_input_toplevel, unsigned
>> > vertex_index,
>> > +                         bool explicit_location);
>> >     unsigned lower_arraylike(ir_rvalue *rvalue, unsigned
>> > array_size,
>> >                              unsigned fine_location,
>> >                              ir_variable *unpacked_var, const char
>> > *name,
>> > -                            bool gs_input_toplevel, unsigned
>> > vertex_index);
>> > +                            bool gs_input_toplevel, unsigned
>> > vertex_index,
>> > +                            bool explicit_location);
>> >     ir_dereference *get_packed_varying_deref(unsigned location,
>> >                                              ir_variable
>> > *unpacked_var,
>> >                                              const char *name,
>> > @@ -294,7 +296,8 @@ lower_packed_varyings_visitor::run(struct
>> > gl_shader *shader)
>> >
>> >        /* Recursively pack or unpack it. */
>> >        this->lower_rvalue(deref, var->data.location * 4 + var
>> > ->data.location_frac, var,
>> > -                         var->name, this->gs_input_vertices != 0,
>> > 0);
>> > +                         var->name, this->gs_input_vertices != 0,
>> > 0,
>> > +                         var->data.explicit_location);
>> >     }
>> >  }
>> >
>> > @@ -426,7 +429,8 @@
>> > lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
>> >                                              ir_variable
>> > *unpacked_var,
>> >                                              const char *name,
>> >                                              bool
>> > gs_input_toplevel,
>> > -                                            unsigned vertex_index)
>> > +                                            unsigned vertex_index,
>> > +                                            bool
>> > explicit_location)
>> >  {
>> >     unsigned dmul = rvalue->type->is_double() ? 2 : 1;
>> >     /* When gs_input_toplevel is set, we should be looking at a
>> > geometry shader
>> > @@ -445,7 +449,7 @@
>> > lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
>> >              = ralloc_asprintf(this->mem_ctx, "%s.%s", name,
>> > field_name);
>> >           fine_location = this->lower_rvalue(dereference_record,
>> > fine_location,
>> >                                              unpacked_var,
>> > deref_name, false,
>> > -                                            vertex_index);
>> > +                                            vertex_index,
>> > explicit_location);
>> >        }
>> >        return fine_location;
>> >     } else if (rvalue->type->is_array()) {
>> > @@ -454,14 +458,15 @@
>> > lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
>> >         */
>> >        return this->lower_arraylike(rvalue, rvalue->type
>> > ->array_size(),
>> >                                     fine_location, unpacked_var,
>> > name,
>> > -                                   gs_input_toplevel,
>> > vertex_index);
>> > +                                   gs_input_toplevel,
>> > vertex_index,
>> > +                                   explicit_location);
>> >     } else if (rvalue->type->is_matrix()) {
>> >        /* Matrices are packed/unpacked by considering each column
>> > vector in
>> >         * sequence.
>> >         */
>> >        return this->lower_arraylike(rvalue, rvalue->type
>> > ->matrix_columns,
>> >                                     fine_location, unpacked_var,
>> > name,
>> > -                                   false, vertex_index);
>> > +                                   false, vertex_index,
>> > explicit_location);
>> >     } else if (rvalue->type->vector_elements * dmul +
>> >                fine_location % 4 > 4) {
>> >        /* This vector is going to be "double parked" across two
>> > varying slots,
>> > @@ -502,12 +507,13 @@
>> > lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
>> >        if (left_components)
>> >           fine_location = this->lower_rvalue(left_swizzle,
>> > fine_location,
>> >                                              unpacked_var,
>> > left_name, false,
>> > -                                            vertex_index);
>> > +                                            vertex_index,
>> > explicit_location);
>> >        else
>> >           /* Top up the fine location to the next slot */
>> >           fine_location++;
>> >        return this->lower_rvalue(right_swizzle, fine_location,
>> > unpacked_var,
>> > -                                right_name, false, vertex_index);
>> > +                                right_name, false, vertex_index,
>> > +                                explicit_location);
>> >     } else {
>> >        /* No special handling is necessary; pack the rvalue into
>> > the
>> >         * varying.
>> > @@ -528,7 +534,17 @@
>> > lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
>> >        } else {
>> >           this->bitwise_assign_unpack(rvalue, swizzle);
>> >        }
>> > -      return fine_location + components;
>> > +
>> > +      /* Explicitly packed components are packed by interleaving
>> > arrays, so
>> > +       * simply bump the location by 4 to increment the location
>> > to the next
>> > +       * element.
>> > +       *
>> > +       * Otherwise we pack arrays elements end to end.
>> > +       */
>> Can you help me understand this comment using an example?
>
> Sure. The existing packing for varyings with implicit locations works
> by packing varyings one after the other end to end including arrays.
> This means fine_location is incremented by the component size of the
> varying element we just packed and the next element will be placed at
> the end of this element.
>
> So if we packed a vec3 array starting at component 0 the next element
> will be packed in the same location starting at component 3, then the
> next element will be in the following location at component 2, etc.
>
> For varyings with explicit locations/components the rules are
> different. As we specifiy the components where the elements should be
> stored we just need to bump fine_location by 4 to end up at the same
> component in the next location.
>
> From the ARB_enhanced_layouts spec:
>
>        Further, an array of vec3 and an array of float can be stored
>        interleaved, using the following.
>
>           // consumes W component of 32 vectors
>           layout(location = 0, component = 3) in float robin[32];
>
>           // consume X/Y/Z components of 32 vectors
>           layout(location = 0) in vec3 batman[32];
>
Thanks for explaining.
>
>
>
>
>>
>> > +      if (explicit_location) {
>> > +         return fine_location + 4;
>> > +      } else
>> > +         return fine_location + components;
>> >     }
>> >  }
>> >
>> > @@ -554,7 +570,8 @@
>> > lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue,
>> >                                                 ir_variable
>> > *unpacked_var,
>> >                                                 const char *name,
>> >                                                 bool
>> > gs_input_toplevel,
>> > -                                               unsigned
>> > vertex_index)
>> > +                                               unsigned
>> > vertex_index,
>> > +                                               bool
>> > explicit_location)
>> >  {
>> >     for (unsigned i = 0; i < array_size; i++) {
>> >        if (i != 0)
>> > @@ -568,14 +585,16 @@
>> > lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue,
>> >            * are at the same location, but with a different vertex
>> > index.
>> >            */
>> >           (void) this->lower_rvalue(dereference_array,
>> > fine_location,
>> > -                                   unpacked_var, name, false, i);
>> > +                                   unpacked_var, name, false, i,
>> > +                                   explicit_location);
>> >        } else {
>> >           char *subscripted_name
>> >              = ralloc_asprintf(this->mem_ctx, "%s[%d]", name, i);
>> > +
>> >           fine_location =
>> >              this->lower_rvalue(dereference_array, fine_location,
>> >                                 unpacked_var, subscripted_name,
>> > -                               false, vertex_index);
>> > +                               false, vertex_index,
>> > explicit_location);
>> >        }
>> >     }
>> >     return fine_location;
>> > --
>> > 2.4.3
>> >
>> > _______________________________________________
>> > mesa-dev mailing list
>> > mesa-dev at lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list