glsl: enforce output variable rules for GLSL ES 3.10

Some rules are already applied this just adds the missing ones.

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
This commit is contained in:
Timothy Arceri 2015-06-10 18:46:22 +10:00
parent f0e772392f
commit 3d78bdea31
1 changed files with 49 additions and 0 deletions

View File

@ -3653,6 +3653,55 @@ ast_declarator_list::hir(exec_list *instructions,
"type %s", check_type->name);
}
}
/* From section 4.3.6 (Output Variables) of the GLSL ES 3.10 spec:
*
* It is a compile-time error to declare a vertex shader output
* with, or that contains, any of the following types:
*
* * A boolean type
* * An opaque type
* * An array of arrays
* * An array of structures
* * A structure containing an array
* * A structure containing a structure
*
* It is a compile-time error to declare a fragment shader output
* with, or that contains, any of the following types:
*
* * A boolean type
* * An opaque type
* * A matrix
* * A structure
* * An array of array
*/
if (state->es_shader) {
if (var->type->is_array() &&
var->type->fields.array->is_array()) {
_mesa_glsl_error(&loc, state,
"%s shader output "
"cannot have an array of arrays",
_mesa_shader_stage_to_string(state->stage));
}
if (state->stage == MESA_SHADER_VERTEX) {
if (var->type->is_array() &&
var->type->fields.array->is_record()) {
_mesa_glsl_error(&loc, state,
"vertex shader output "
"cannot have an array of structs");
}
if (var->type->is_record()) {
for (unsigned i = 0; i < var->type->length; i++) {
if (var->type->fields.structure[i].type->is_array() ||
var->type->fields.structure[i].type->is_record())
_mesa_glsl_error(&loc, state,
"vertex shader output cannot have a "
"struct that contains an "
"array or struct");
}
}
}
}
}
/* Integer fragment inputs must be qualified with 'flat'. In GLSL ES,