mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 23:00:11 +01:00
glsl: validate output types for shader stages
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@intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
94f9ed701a
commit
3bbaf71994
1 changed files with 45 additions and 0 deletions
|
|
@ -3621,6 +3621,51 @@ 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->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);
|
||||
|
||||
/* 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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue