diff options
author | Kenneth Graunke <[email protected]> | 2017-01-02 02:56:52 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2017-01-02 14:10:50 -0800 |
commit | bc7f1eddbdefaf8f6c094668d6218df61cb6113f (patch) | |
tree | 13f74ac22514e9cc14df46d1def6f9bc760c1e8b /src/compiler/glsl | |
parent | fc78ee5da0e587295b78ea191353d463d4eac987 (diff) |
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 <[email protected]>
Reviewed-by: Iago Toral Quiroga <[email protected]>
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 9c633863b19..ce620fab827 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -5039,6 +5039,24 @@ ast_declarator_list::hir(exec_list *instructions, * * A matrix * * A structure * * 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 (var->type->is_array() && @@ -5048,21 +5066,29 @@ ast_declarator_list::hir(exec_list *instructions, "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()) { + if (state->stage <= MESA_SHADER_GEOMETRY) { + const glsl_type *type = var->type; + + if (state->stage == MESA_SHADER_TESS_CTRL && + !var->data.patch && var->type->is_array()) { + type = var->type->fields.array; + } + + if (type->is_array() && type->fields.array->is_record()) { _mesa_glsl_error(&loc, state, - "vertex shader output " - "cannot have an array of structs"); + "%s shader output cannot have " + "an array of structs", + _mesa_shader_stage_to_string(state->stage)); } - 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()) + 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, - "vertex shader output cannot have a " + "%s shader output cannot have a " "struct that contains an " - "array or struct"); + "array or struct", + _mesa_shader_stage_to_string(state->stage)); } } } |