diff options
Diffstat (limited to 'src/compiler/glsl/ast_function.cpp')
-rw-r--r-- | src/compiler/glsl/ast_function.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp index 46a61e46fd5..d1596c272e6 100644 --- a/src/compiler/glsl/ast_function.cpp +++ b/src/compiler/glsl/ast_function.cpp @@ -227,19 +227,28 @@ verify_parameter_modes(_mesa_glsl_parse_state *state, val = ((ir_swizzle *)val)->val; } - while (val->ir_type == ir_type_dereference_array) { - val = ((ir_dereference_array *)val)->array; + for (;;) { + if (val->ir_type == ir_type_dereference_array) { + val = ((ir_dereference_array *)val)->array; + } else if (val->ir_type == ir_type_dereference_record && + !state->es_shader) { + val = ((ir_dereference_record *)val)->record; + } else + break; } - if (!val->as_dereference_variable() || - val->variable_referenced()->data.mode != ir_var_shader_in) { + ir_variable *var = NULL; + if (const ir_dereference_variable *deref_var = val->as_dereference_variable()) + var = deref_var->variable_referenced(); + + if (!var || var->data.mode != ir_var_shader_in) { _mesa_glsl_error(&loc, state, "parameter `%s` must be a shader input", formal->name); return false; } - val->variable_referenced()->data.must_be_shader_input = 1; + var->data.must_be_shader_input = 1; } /* Verify that 'out' and 'inout' actual parameters are lvalues. */ |