[Mesa-dev] [PATCH v2 23/28] glsl: validate output types for shader stages

Ian Romanick idr at freedesktop.org
Fri Feb 6 01:15:05 PST 2015


On 02/06/2015 06:56 AM, Ilia Mirkin wrote:
> From: Tapani Pälli <tapani.palli at intel.com>
> 
> Patch fixes Piglit test:
>    arb_gpu_shader_fp64/preprocessor/fs-output-double.frag
> 
> and adds additional validation for shader outputs.
> 
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/glsl/ast_to_hir.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 47 insertions(+)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 3ea3a13..2a74a51 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3625,6 +3625,53 @@ ast_declarator_list::hir(exec_list *instructions,
>  
>              handle_geometry_shader_input_decl(state, loc, var);
>           }
> +      } else if (var->data.mode == ir_var_shader_out) {
> +         const glsl_type *check_type = var->type;
> +         while (check_type->is_array())
> +            check_type = check_type->element_type();

      const glsl_type *const = var->type->without_array();

> +
> +         /* From section 4.3.6 (Output variables) of the GLSL 4.40 spec:
> +          *
> +          *     It is a compile-time error to declare a vertex, tessellation
> +          *     evaluation, tessellation control, or geometry shader output
> +          *     that contains any of the following:
> +          *
> +          *     * A Boolean type (bool, bvec2 ...)
> +          *     * An opaque type
> +          */
> +         if (check_type->is_boolean() || check_type->contains_opaque())
> +            _mesa_glsl_error(&loc, state,
> +                             "%s shader output cannot have type %s",
> +                             _mesa_shader_stage_to_string(state->stage),
> +                             check_type->name);

Aren't we already enforcing this somewhere?  Do we have any test cases?

> +
> +         /* From section 4.3.6 (Output variables) of the GLSL 4.40 spec:
> +          *
> +          *     It is a compile-time error to declare a fragment shader output
> +          *     that contains any of the following:
> +          *
> +          *     * A Boolean type (bool, bvec2 ...)
> +          *     * A double-precision scalar or vector (double, dvec2 ...)
> +          *     * An opaque type
> +          *     * Any matrix type
> +          *     * A structure
> +          */
> +         if (state->stage == MESA_SHADER_FRAGMENT) {
> +            if (check_type->is_record() || check_type->is_matrix())
> +               _mesa_glsl_error(&loc, state,
> +                                "fragment shader output "
> +                                "cannot have struct or array type");
> +            switch (check_type->base_type) {
> +               case GLSL_TYPE_UINT:
> +               case GLSL_TYPE_INT:
> +               case GLSL_TYPE_FLOAT:
> +               break;
> +               default:
> +                  _mesa_glsl_error(&loc, state,
> +                                "fragment shader output cannot have "
> +                                "type %s", check_type->name);
> +            }
> +         }
>        }
>  
>        /* Integer fragment inputs must be qualified with 'flat'.  In GLSL ES,
> 



More information about the mesa-dev mailing list