From ARB_program_interface_query:

"For the property of BUFFER_DATA_SIZE, then the implementation-dependent
 minimum total buffer object size, in basic machine units, required to hold
 all active variables associated with an active uniform block, shader
 storage block, or atomic counter buffer is written to <params>.  If the
 final member of an active shader storage block is array with no declared
 size, the minimum buffer size is computed assuming the array was declared
 as an array with one element."

Fixes the following dEQP-GLES31 tests:

dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.named_block
dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.unnamed_block
dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.block_array

Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com>
---
 src/glsl/link_uniform_blocks.cpp | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp
index 5285d8d..a10b44b 100644
--- a/src/glsl/link_uniform_blocks.cpp
+++ b/src/glsl/link_uniform_blocks.cpp
@@ -130,13 +130,22 @@ private:
 
       unsigned alignment = 0;
       unsigned size = 0;
-
+      /* From ARB_program_interface_query:
+       * "If the final member of an active shader storage block is array with
+       * no declared size, the minimum buffer size is computed assuming the
+       * array was declared as an array with one element."
+       *
+       * For that reason, we use the base type of the unsized array to 
calculate
+       * its size.
+       */
+      const glsl_type *type_for_size =
+         type->is_unsized_array() ? type->without_array() : type;
       if (packing == GLSL_INTERFACE_PACKING_STD430) {
          alignment = type->std430_base_alignment(v->RowMajor);
-         size = type->std430_size(v->RowMajor);
+         size = type_for_size->std430_size(v->RowMajor);
       } else {
          alignment = type->std140_base_alignment(v->RowMajor);
-         size = type->std140_size(v->RowMajor);
+         size = type_for_size->std140_size(v->RowMajor);
       }
 
       this->offset = glsl_align(this->offset, alignment);
-- 
2.1.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to