[Mesa-dev] [PATCH] glsl: fix matrix stride calculation for std430's row_major matrices with two columns

Lofstedt, Marta marta.lofstedt at intel.com
Tue Oct 13 02:01:53 PDT 2015


Thanks Samuel,

This also fixes 10+ OpenGL ES 3.1 test cases.

Reviewed-by: Marta Lofstedt <marta.lofstedt at intel.com>

> -----Original Message-----
> From: mesa-dev [mailto:mesa-dev-bounces at lists.freedesktop.org] On
> Behalf Of Samuel Iglesias Gonsalvez
> Sent: Tuesday, October 13, 2015 8:39 AM
> To: mesa-dev at lists.freedesktop.org
> Subject: [Mesa-dev] [PATCH] glsl: fix matrix stride calculation for std430's
> row_major matrices with two columns
> 
> This is the result of applying several rules:
> 
> From OpenGL 4.3 spec, section 7.6.2.2 "Standard Uniform Block Layout":
> 
> "2. If the member is a two- or four-component vector with components
> consuming N basic machine units, the base alignment is 2N or 4N,
> respectively."
> [...]
> "4. If the member is an array of scalars or vectors, the base alignment and
> array stride are set to match the base alignment of a single array element,
> according to rules (1), (2), and (3), and rounded up to the base alignment of a
> vec4."
> [...]
> "7. If the member is a row-major matrix with C columns and R rows, the
> matrix is stored identically to an array of R row vectors with C components
> each, according to rule (4)."
> [...]
> "When using the std430 storage layout, shader storage blocks will be laid out
> in buffer storage identically to uniform and shader storage blocks using the
> std140 layout, except that the base alignment and stride of arrays of scalars
> and vectors in rule 4 and of structures in rule 9 are not rounded up a multiple
> of the base alignment of a vec4."
> 
> In summary: vec2 has a base alignment of 2*N, a row-major mat2xY is stored
> like an array of Y row vectors with 2 components each. Because of std430
> storage layout, the base alignment of the array of vectors is not rounded up
> to vec4, so it is still 2*N.
> 
> Fixes 15 dEQP tests:
> 
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_m
> at2
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediu
> mp_mat2
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_
> mat2
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_m
> at2x3
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediu
> mp_mat2x3
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_
> mat2x3
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_m
> at2x4
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediu
> mp_mat2x4
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_
> mat2x4
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat2
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat2x3
> dEQP-
> GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat2x4
> dEQP-
> GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major
> _mat2
> dEQP-
> GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major
> _mat2x3
> dEQP-
> GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major
> _mat2x4
> 
> v2:
> - Add spec quote in both commit log and code (Timothy)
> 
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> Cc: Timothy Arceri <t_arceri at yahoo.com.au>
> ---
>  src/glsl/lower_ubo_reference.cpp | 26 +++++++++++++++++++++++++-
>  1 file changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/lower_ubo_reference.cpp
> b/src/glsl/lower_ubo_reference.cpp
> index 247620e..c8ec5c1 100644
> --- a/src/glsl/lower_ubo_reference.cpp
> +++ b/src/glsl/lower_ubo_reference.cpp
> @@ -744,7 +744,31 @@ lower_ubo_reference_visitor::emit_access(bool
> is_write,
>         * or 32 depending on the number of columns.
>         */
>        assert(matrix_columns <= 4);
> -      unsigned matrix_stride = glsl_align(matrix_columns * N, 16);
> +      unsigned matrix_stride = 0;
> +      /* Matrix stride for std430 mat2xY matrices are not rounded up to
> +       * vec4 size. From OpenGL 4.3 spec, section 7.6.2.2 "Standard Uniform
> +       * Block Layout":
> +       *
> +       * "2. If the member is a two- or four-component vector with
> components
> +       * consuming N basic machine units, the base alignment is 2N or 4N,
> +       * respectively." [...]
> +       * "4. If the member is an array of scalars or vectors, the base alignment
> +       * and array stride are set to match the base alignment of a single array
> +       * element, according to rules (1), (2), and (3), and rounded up to the
> +       * base alignment of a vec4." [...]
> +       * "7. If the member is a row-major matrix with C columns and R rows,
> the
> +       * matrix is stored identically to an array of R row vectors with C
> +       * components each, according to rule (4)." [...]
> +       * "When using the std430 storage layout, shader storage blocks will be
> +       * laid out in buffer storage identically to uniform and shader storage
> +       * blocks using the std140 layout, except that the base alignment and
> +       * stride of arrays of scalars and vectors in rule 4 and of structures in
> +       * rule 9 are not rounded up a multiple of the base alignment of a vec4."
> +       */
> +      if (packing == GLSL_INTERFACE_PACKING_STD430 && matrix_columns
> == 2)
> +         matrix_stride = 2 * N;
> +      else
> +         matrix_stride = glsl_align(matrix_columns * N, 16);
> 
>        const glsl_type *deref_type = deref->type->base_type ==
> GLSL_TYPE_FLOAT ?
>           glsl_type::float_type : glsl_type::double_type;
> --
> 2.1.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list