glsl: Disallow interpolation qualifiers on non-input/output variables.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 2 Aug 2013 08:28:58 +0000 (01:28 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 2 Aug 2013 15:24:23 +0000 (08:24 -0700)
Commit 2548092ad8015 switched the sense of interpolation qualifier
checks in order to permit them on geometry shader in/out variables.

In doing so, it accidentally allowed interpolation qualifiers to be
applied to ordinary variables and function parameters.

Fixes a regression in Piglit's local-smooth-01.frag.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/glsl/ast_to_hir.cpp

index 39d0b76d18d3ceb78c11734044ad8e1bce6c648c..482ab3c05a4b53fe49b6479c17f30cc2ee3f8b78 100644 (file)
@@ -2059,13 +2059,24 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
    else
       var->interpolation = INTERP_QUALIFIER_NONE;
 
-   if (var->interpolation != INTERP_QUALIFIER_NONE &&
-       ((state->target == vertex_shader && var->mode == ir_var_shader_in) ||
-        (state->target == fragment_shader && var->mode == ir_var_shader_out))) {
-      _mesa_glsl_error(loc, state,
-                       "interpolation qualifier `%s' cannot be applied to "
-                       "vertex shader inputs or fragment shader outputs",
-                       var->interpolation_string());
+   if (var->interpolation != INTERP_QUALIFIER_NONE) {
+      ir_variable_mode mode = (ir_variable_mode) var->mode;
+
+      if (mode != ir_var_shader_in && mode != ir_var_shader_out) {
+         _mesa_glsl_error(loc, state,
+                          "interpolation qualifier `%s' can only be applied to "
+                          "shader inputs or outputs.",
+                          var->interpolation_string());
+
+      }
+
+      if ((state->target == vertex_shader && mode == ir_var_shader_in) ||
+          (state->target == fragment_shader && mode == ir_var_shader_out)) {
+         _mesa_glsl_error(loc, state,
+                          "interpolation qualifier `%s' cannot be applied to "
+                          "vertex shader inputs or fragment shader outputs",
+                          var->interpolation_string());
+      }
    }
 
    var->pixel_center_integer = qual->flags.q.pixel_center_integer;