glsl_type: Add support for explicitly laid out matrices and arrays
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 12 Dec 2018 20:32:19 +0000 (14:32 -0600)
committerJason Ekstrand <jason@jlekstrand.net>
Tue, 8 Jan 2019 00:38:29 +0000 (00:38 +0000)
commit6cebeb4f71918aded1ddade5727f79fae83780fd
tree9de5dba8aa2944b15f516d541abe8ad7f62c54c1
parent7f70b3e55514f1744e9aab6d2145e855603bd1dc
glsl_type: Add support for explicitly laid out matrices and arrays

SPIR-V allows for matrix and array types to be decorated with explicit
byte stride decorations and matrix types to be decorated row- or
column-major.  This commit adds support to glsl_type to encode this
information.  Because this doesn't work nicely with std430 and std140
alignments, we add asserts to ensure that we don't use any of the std430
or std140 layout functions with explicitly laid out types.

In SPIR-V, the layout information for matrices is applied to the parent
struct member instead of to the matrix type itself.  However, this is
gets rather clumsy when you're walking derefs trying to compute offsets
because, the moment you hit a matrix, you have to crawl back the deref
chain and find the struct.  Instead, we take the same path here as we've
taken in spirv_to_nir and put the decorations on the matrix type itself.

This also subtly adds support for strided vector types.  These don't
come up in SPIR-V directly but you can get one as the result of taking a
column from a row-major matrix or a row from a column-major matrix.

Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
15 files changed:
src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
src/compiler/glsl_types.cpp
src/compiler/glsl_types.h
src/compiler/nir/nir_lower_atomics_to_ssbo.c
src/compiler/nir/nir_lower_clip_cull_distance_arrays.c
src/compiler/nir/nir_lower_io_arrays_to_elements.c
src/compiler/nir/nir_split_per_member_structs.c
src/compiler/nir/nir_split_vars.c
src/compiler/nir_types.cpp
src/compiler/nir_types.h
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_variables.c
src/gallium/auxiliary/nir/tgsi_to_nir.c
src/intel/vulkan/anv_nir_lower_multiview.c
src/mesa/program/prog_to_nir.c