summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2016-05-13 00:26:44 -0400
committerIlia Mirkin <[email protected]>2016-05-13 19:17:26 -0400
commit37c8f4c6098be6e256d0aef36b615d1747958114 (patch)
treea7323283f7ab5b32f4f02854178a3e5975811c43 /src/compiler
parent5239f1e0c9f24ca06a9c58ce6eea95c7e4da93bd (diff)
glsl: be more strict when validating shader inputs
interpolateAt* can only take input variables or an element of an input variable array. No structs. Further, GLSL 4.40 relaxes the requirement to allow swizzles, so enable that as well. This fixes the following dEQP tests: dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_sample.negative.interpolate_struct_member dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.negative.interpolate_struct_member dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.negative.interpolate_struct_member Signed-off-by: Ilia Mirkin <[email protected]> Reviewed-by: Chris Forbes <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/glsl/ast_function.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp
index 4db3dd0384b..6c12565b084 100644
--- a/src/compiler/glsl/ast_function.cpp
+++ b/src/compiler/glsl/ast_function.cpp
@@ -208,17 +208,27 @@ verify_parameter_modes(_mesa_glsl_parse_state *state,
/* Verify that shader_in parameters are shader inputs */
if (formal->data.must_be_shader_input) {
- ir_variable *var = actual->variable_referenced();
- if (!var || var->data.mode != ir_var_shader_in) {
- _mesa_glsl_error(&loc, state,
- "parameter `%s` must be a shader input",
- formal->name);
- return false;
+ const ir_rvalue *val = actual;
+
+ // GLSL 4.40 allows swizzles, while earlier GLSL versions do not.
+ if (val->ir_type == ir_type_swizzle) {
+ if (!state->is_version(440, 0)) {
+ _mesa_glsl_error(&loc, state,
+ "parameter `%s` must not be swizzled",
+ formal->name);
+ return false;
+ }
+ val = ((ir_swizzle *)val)->val;
+ }
+
+ while (val->ir_type == ir_type_dereference_array) {
+ val = ((ir_dereference_array *)val)->array;
}
- if (actual->ir_type == ir_type_swizzle) {
+ if (!val->as_dereference_variable() ||
+ val->variable_referenced()->data.mode != ir_var_shader_in) {
_mesa_glsl_error(&loc, state,
- "parameter `%s` must not be swizzled",
+ "parameter `%s` must be a shader input",
formal->name);
return false;
}