On 02/06/2015 06:56 AM, Ilia Mirkin wrote: > From: Tapani Pälli <tapani.pa...@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.pa...@intel.com> > Signed-off-by: Dave Airlie <airl...@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, > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev