From c3f47f6e300ef1ec18b2c55ec82bccf263292351 Mon Sep 17 00:00:00 2001 From: Yevhenii Kolesnikov Date: Wed, 14 Jul 2021 20:52:56 +0300 Subject: [PATCH] glsl: Properly handle .length() of an unsized array There are two distinct cases: - The last member of a shader storage block (length determined at run-time) - Implicitly-sized array (length determined at link-time) Fixes: 273f61a0051a ("glsl: Add parser/compiler support for unsized array's length()") Signed-off-by: Yevhenii Kolesnikov Reviewed-by: Timothy Arceri Part-of: --- src/compiler/glsl/ast_function.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp index 73e72b5baa9..92ca6a4cf1b 100644 --- a/src/compiler/glsl/ast_function.cpp +++ b/src/compiler/glsl/ast_function.cpp @@ -2047,10 +2047,18 @@ ast_function_expression::handle_method(exec_list *instructions, "length called on unsized array" " only available with" " ARB_shader_storage_buffer_object"); + goto fail; + } else if (op->variable_referenced()->is_in_shader_storage_block()) { + /* Calculate length of an unsized array in run-time */ + result = new(ctx) + ir_expression(ir_unop_ssbo_unsized_array_length, op); + } else { + /* When actual size is known at link-time, this will be + * replaced with a constant expression. + */ + result = new (ctx) + ir_expression(ir_unop_implicitly_sized_array_length, op); } - /* Calculate length of an unsized array in run-time */ - result = new(ctx) ir_expression(ir_unop_ssbo_unsized_array_length, - op); } else { result = new(ctx) ir_constant(op->type->array_size()); }