mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 13:40:16 +01:00
linker: Ensure that unsized arrays have a size after linking
Fixes piglit test case glsl-vec-array (bugzilla #31908). NOTE: This bug does not affect 7.9, but I think this patch is a candiate for the 7.9 branch anyway.
This commit is contained in:
parent
b2167a6c01
commit
6f53921c4b
1 changed files with 27 additions and 1 deletions
|
|
@ -360,8 +360,12 @@ cross_validate_globals(struct gl_shader_program *prog,
|
|||
&& (var->type->fields.array == existing->type->fields.array)
|
||||
&& ((var->type->length == 0)
|
||||
|| (existing->type->length == 0))) {
|
||||
if (existing->type->length == 0)
|
||||
if (existing->type->length == 0) {
|
||||
existing->type = var->type;
|
||||
existing->max_array_access =
|
||||
MAX2(existing->max_array_access,
|
||||
var->max_array_access);
|
||||
}
|
||||
} else {
|
||||
linker_error_printf(prog, "%s `%s' declared as type "
|
||||
"`%s' and type `%s'\n",
|
||||
|
|
@ -863,6 +867,28 @@ link_intrastage_shaders(void *mem_ctx,
|
|||
|
||||
free(linking_shaders);
|
||||
|
||||
/* Make a pass over all global variables to ensure that arrays with
|
||||
* unspecified sizes have a size specified. The size is inferred from the
|
||||
* max_array_access field.
|
||||
*/
|
||||
foreach_list(node, linked->ir) {
|
||||
ir_variable *const var = ((ir_instruction *) node)->as_variable();
|
||||
|
||||
if (var == NULL)
|
||||
continue;
|
||||
|
||||
if (!var->type->is_array() || (var->type->length != 0))
|
||||
continue;
|
||||
|
||||
const glsl_type *type =
|
||||
glsl_type::get_array_instance(var->type->fields.array,
|
||||
var->max_array_access);
|
||||
|
||||
assert(type != NULL);
|
||||
var->type = type;
|
||||
}
|
||||
|
||||
|
||||
return linked;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue