summaryrefslogtreecommitdiff
path: root/src/compiler/glsl/ast_function.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/glsl/ast_function.cpp')
-rw-r--r--src/compiler/glsl/ast_function.cpp14
1 files 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());
}