[Mesa-dev] [PATCH v2 10/28] glsl_types/nir: add matrix_stride plus nir wrapper helpers

Alejandro PiƱeiro apinheiro at igalia.com
Thu Sep 27 09:51:49 UTC 2018


>From ARB_gl_spirv spec:

    "7.6.2.spv SPIR-V Uniform Offsets and Strides

    The SPIR-V decorations *GLSLShared* or *GLSLPacked* must not be
    used. A variable in the *Uniform* Storage Class decorated as a
    *Block* must be explicitly laid out using the *Offset*,
    *ArrayStride*, and *MatrixStride* decorations. If the variable is
    decorated as a *BufferBlock*, its offsets and strides must not
    contradict std430 alignment and minimum offset requirements.
    Otherwise, its offsets and strides must not contradict std140
    alignment and minimum offset requirements.

>From that paragraph, the first conclusion is that we can rely on the
content of the SPIR-V in order to compute the buffer sizes, as they
are mandatory. That would make the buffer size computation easier. The
second conclusion, from the last sentence, is that *we need* to do
that. As if just needs to not contradict alignments and minimum
offsets, providing a matrix stride of 16 when 8 is enough would be
valid.

This explicit matrix_stride is assumed to only be used on
ARB_gl_spirv. On GLSL there is no way to set it, and it is internally
handled and computed.
---
 src/compiler/glsl_types.cpp |  3 +++
 src/compiler/glsl_types.h   | 10 ++++++++--
 src/compiler/nir_types.cpp  |  6 ++++++
 src/compiler/nir_types.h    |  2 ++
 4 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp
index ca5368aa53f..ed3bb3a9889 100644
--- a/src/compiler/glsl_types.cpp
+++ b/src/compiler/glsl_types.cpp
@@ -961,6 +961,9 @@ glsl_type::record_compare(const glsl_type *b, bool match_locations) const
       if (this->fields.structure[i].xfb_stride
           != b->fields.structure[i].xfb_stride)
          return false;
+      if (this->fields.structure[i].explicit_matrix_stride
+          != b->fields.structure[i].explicit_matrix_stride)
+         return false;
    }
 
    return true;
diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h
index d32b580acc1..9e8332e6cbf 100644
--- a/src/compiler/glsl_types.h
+++ b/src/compiler/glsl_types.h
@@ -1007,6 +1007,12 @@ struct glsl_struct_field {
     */
    unsigned matrix_layout:2;
 
+   /**
+    * Explicit matrix stride. For ARB_gl_spirv, it is mandatory to set it
+    * explicitly. -1 otherwise.
+    */
+   int explicit_matrix_stride;
+
    /**
     * For interface blocks, 1 if this variable is a per-patch input or output
     * (as in ir_variable::patch). 0 otherwise.
@@ -1045,7 +1051,7 @@ struct glsl_struct_field {
    glsl_struct_field(const struct glsl_type *_type, const char *_name)
       : type(_type), name(_name), location(-1), offset(0), xfb_buffer(0),
         xfb_stride(0), interpolation(0), centroid(0),
-        sample(0), matrix_layout(GLSL_MATRIX_LAYOUT_INHERITED), patch(0),
+        sample(0), matrix_layout(GLSL_MATRIX_LAYOUT_INHERITED), explicit_matrix_stride(-1), patch(0),
         precision(GLSL_PRECISION_NONE), memory_read_only(0),
         memory_write_only(0), memory_coherent(0), memory_volatile(0),
         memory_restrict(0), image_format(0), explicit_xfb_buffer(0),
@@ -1057,7 +1063,7 @@ struct glsl_struct_field {
    glsl_struct_field()
       : type(NULL), name(NULL), location(0), offset(0), xfb_buffer(0),
         xfb_stride(0), interpolation(0), centroid(0),
-        sample(0), matrix_layout(0), patch(0),
+        sample(0), matrix_layout(0), explicit_matrix_stride(-1), patch(0),
         precision(0), memory_read_only(0),
         memory_write_only(0), memory_coherent(0), memory_volatile(0),
         memory_restrict(0), image_format(0), explicit_xfb_buffer(0),
diff --git a/src/compiler/nir_types.cpp b/src/compiler/nir_types.cpp
index 2a1ae42a9bb..b2a5da1dc6c 100644
--- a/src/compiler/nir_types.cpp
+++ b/src/compiler/nir_types.cpp
@@ -86,6 +86,12 @@ glsl_get_struct_field_matrix_layout(const struct glsl_type *type,
    return type->fields.structure[index].matrix_layout;
 }
 
+const int
+glsl_get_struct_field_explicit_matrix_stride(const struct glsl_type *type,
+                                             unsigned index)
+{
+   return type->fields.structure[index].explicit_matrix_stride;
+}
 
 const glsl_type *
 glsl_get_function_return_type(const glsl_type *type)
diff --git a/src/compiler/nir_types.h b/src/compiler/nir_types.h
index 69de44c3423..d3c00ca5e1a 100644
--- a/src/compiler/nir_types.h
+++ b/src/compiler/nir_types.h
@@ -51,6 +51,8 @@ const int glsl_get_struct_field_offset(const struct glsl_type *type,
 
 const unsigned glsl_get_struct_field_matrix_layout(const struct glsl_type *type,
                                                    unsigned index);
+const int glsl_get_struct_field_explicit_matrix_stride(const struct glsl_type *type,
+                                                       unsigned index);
 const struct glsl_type *glsl_get_array_element(const struct glsl_type *type);
 const struct glsl_type *glsl_without_array(const struct glsl_type *type);
 const struct glsl_type *glsl_without_array_or_matrix(const struct glsl_type *type);
-- 
2.14.1



More information about the mesa-dev mailing list