[Mesa-dev] [PATCH] glsl: Update ES 3.2 shader output restrictions.

Iago Toral itoral at igalia.com
Mon Jan 2 13:04:34 UTC 2017


On Mon, 2017-01-02 at 03:32 -0800, Kenneth Graunke wrote:
> 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_arr
> ay_of_structs
> dEQP-
> GLES31.functional.tessellation.user_defined_io.negative.per_patch_str
> ucts_containing_arrays
> 
> (Not a candidate for stable branches as it only disallows things
> which
> should be working as desktop GL allows them.)
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/compiler/glsl/ast_to_hir.cpp | 38
> +++++++++++++++++++++++++++++++-------
>  1 file changed, 31 insertions(+), 7 deletions(-)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp
> b/src/compiler/glsl/ast_to_hir.cpp
> index 9c633863b19..762f0a88bd3 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,17 +5066,23 @@ 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");

Since this code now runs for stages other than vertex I think we want
to fix the error message to use _mesa_shader_stage_to_string()  instead
of the hard coded 'vertex' string.

>                 }
> -               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 "
>                                           "struct that contains an "

Same thing here.

Otherwise, it looks good to me:

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>



More information about the mesa-dev mailing list