glsl: Update ES 3.2 shader output restrictions.
This disallows fancy varyings in tessellation and geometry shaders, as required by ES 3.2. Fixes: dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_patch_array_of_structs dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_patch_structs_containing_arrays (Not a candidate for stable branches as it only disallows things which should be working as desktop GL allows them.) v2: Update error messages to not say "vertex shader" (caught by Iago). Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
@@ -5039,6 +5039,24 @@ ast_declarator_list::hir(exec_list *instructions,
|
|||||||
* * A matrix
|
* * A matrix
|
||||||
* * A structure
|
* * A structure
|
||||||
* * An array of array
|
* * An array of array
|
||||||
|
*
|
||||||
|
* ES 3.20 updates this to apply to tessellation and geometry shaders
|
||||||
|
* as well. Because there are per-vertex arrays in the new stages,
|
||||||
|
* it strikes the "array of..." rules and replaces them with these:
|
||||||
|
*
|
||||||
|
* * For per-vertex-arrayed variables (applies to tessellation
|
||||||
|
* control, tessellation evaluation and geometry shaders):
|
||||||
|
*
|
||||||
|
* * Per-vertex-arrayed arrays of arrays
|
||||||
|
* * Per-vertex-arrayed arrays of structures
|
||||||
|
*
|
||||||
|
* * For non-per-vertex-arrayed variables:
|
||||||
|
*
|
||||||
|
* * An array of arrays
|
||||||
|
* * An array of structures
|
||||||
|
*
|
||||||
|
* which basically says to unwrap the per-vertex aspect and apply
|
||||||
|
* the old rules.
|
||||||
*/
|
*/
|
||||||
if (state->es_shader) {
|
if (state->es_shader) {
|
||||||
if (var->type->is_array() &&
|
if (var->type->is_array() &&
|
||||||
@@ -5048,21 +5066,29 @@ ast_declarator_list::hir(exec_list *instructions,
|
|||||||
"cannot have an array of arrays",
|
"cannot have an array of arrays",
|
||||||
_mesa_shader_stage_to_string(state->stage));
|
_mesa_shader_stage_to_string(state->stage));
|
||||||
}
|
}
|
||||||
if (state->stage == MESA_SHADER_VERTEX) {
|
if (state->stage <= MESA_SHADER_GEOMETRY) {
|
||||||
if (var->type->is_array() &&
|
const glsl_type *type = var->type;
|
||||||
var->type->fields.array->is_record()) {
|
|
||||||
_mesa_glsl_error(&loc, state,
|
if (state->stage == MESA_SHADER_TESS_CTRL &&
|
||||||
"vertex shader output "
|
!var->data.patch && var->type->is_array()) {
|
||||||
"cannot have an array of structs");
|
type = var->type->fields.array;
|
||||||
}
|
}
|
||||||
if (var->type->is_record()) {
|
|
||||||
for (unsigned i = 0; i < var->type->length; i++) {
|
if (type->is_array() && type->fields.array->is_record()) {
|
||||||
if (var->type->fields.structure[i].type->is_array() ||
|
_mesa_glsl_error(&loc, state,
|
||||||
var->type->fields.structure[i].type->is_record())
|
"%s shader output cannot have "
|
||||||
|
"an array of structs",
|
||||||
|
_mesa_shader_stage_to_string(state->stage));
|
||||||
|
}
|
||||||
|
if (type->is_record()) {
|
||||||
|
for (unsigned i = 0; i < type->length; i++) {
|
||||||
|
if (type->fields.structure[i].type->is_array() ||
|
||||||
|
type->fields.structure[i].type->is_record())
|
||||||
_mesa_glsl_error(&loc, state,
|
_mesa_glsl_error(&loc, state,
|
||||||
"vertex shader output cannot have a "
|
"%s shader output cannot have a "
|
||||||
"struct that contains an "
|
"struct that contains an "
|
||||||
"array or struct");
|
"array or struct",
|
||||||
|
_mesa_shader_stage_to_string(state->stage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user