[Mesa-dev] [PATCH 3/6] glsl: Generalize compute_packing_order for varying structs.

Ian Romanick idr at freedesktop.org
Wed Jan 23 08:36:39 PST 2013


On 01/23/2013 11:16 AM, Paul Berry wrote:
> On 23 January 2013 07:38, Ian Romanick <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
>
>     On 01/21/2013 05:16 PM, Paul Berry wrote:
>
>         This patch paves the way for allowing varying structs by
>         generalizing
>         varying_matches::compute___packing_order to handle any type of
>         varying.
>         Previously, we packed in the order (vec4, vec2, float, vec3), with
>         matrices being packed according to the size of their columns.
>           Now, we
>         pack everything according to its number of components mod 4, in the
>         order (0, 2, 1, 3).
>
>         There is no behavioural change for vectors.  Matrices are now packed
>         slightly more sensibly (e.g. a mat2 is now packed with vec4's, which
>         guarantees that it will occupy a single varying slot, whereas it
>         previously was packed with vec2's, which meant that it might get
>         split
>         across two adjacent slots).
>         ---
>            src/glsl/link_varyings.cpp | 5 ++---
>            1 file changed, 2 insertions(+), 3 deletions(-)
>
>         diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
>         index 5a3240b..d8f501c 100644
>         --- a/src/glsl/link_varyings.cpp
>         +++ b/src/glsl/link_varyings.cpp
>         @@ -804,16 +804,15 @@
>         varying_matches::compute___packing_order(ir_variable *var)
>            {
>               const glsl_type *element_type = var->type;
>
>         -   /* FINISHME: Support for "varying" records in GLSL 1.50. */
>               while (element_type->base_type == GLSL_TYPE_ARRAY) {
>                  element_type = element_type->fields.array;
>               }
>
>         -   switch (element_type->vector___elements) {
>         +   switch (element_type->component___slots() % 4) {
>
>
>     Will this produce the same result for all matrix types as well?  I
>     think a mat2x3 would be 3 in the old scheme, but 2 in the new
>     scheme.  Right?
>
>
> Yes, a number of matrix types will get new packing orders.  Here's the
> complete list:
>
> - mat2x2 gets assigned PACKING_ORDER_VEC4 instead of
> PACKING_ORDER_VEC2.  As I argue above, this is slightly better, because
> it guarantees that the matrix occupies a single varying slot.
>
> - mat2x3 gets assigned PACKING_ORDER_VEC2 instead of
> PACKING_ORDER_VEC3.  This is kind of a wash.  Previously, mat2x3 had a
> 25% chance of having neither of its columns double parked, a 50% chance
> of having exactly one of its columns double parked, and a 25% chance of
> having both of its columns double parked.  Now it always has exactly one
> of its columns double parked.
>
> - mat3x3 gets assigned PACKING_ORDER_SCALAR instead of
> PACKING_ORDER_VEC3.  This doesn't affect much, since in both cases there
> is no guarantee of how the matrix will be aligned.
>
> - mat4x2 gets assigned PACKING_ORDER_VEC4 instead of
> PACKING_ORDER_VEC2.  I think this is slightly better for the same reason
> as in mat2x2.
>
> - mat4x3 gets assigned PACKING_ORDER_VEC4 instead of
> PACKING_ORDER_VEC3.  I think this is slightly better for the same reason
> as in mat2x2.

These changes potentially affect shader performance, do they also affect 
the number of slots used?  In other words, will a different set of 
shaders fit vs. not fit in 16 vec4 slots?

> Do you think I should include these details in the commit message?

Since you've already written it, the cut-and-paste couldn't hurt.

>               case 1: return PACKING_ORDER_SCALAR;
>               case 2: return PACKING_ORDER_VEC2;
>               case 3: return PACKING_ORDER_VEC3;
>         -   case 4: return PACKING_ORDER_VEC4;
>         +   case 0: return PACKING_ORDER_VEC4;
>               default:
>                  assert(!"Unexpected value of vector_elements");
>                  return PACKING_ORDER_VEC4;
>
>
>



More information about the mesa-dev mailing list