summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/ast_to_hir.cpp12
-rw-r--r--src/glsl/glsl_types.cpp18
-rw-r--r--src/glsl/glsl_types.h6
3 files changed, 30 insertions, 6 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 668973d4c2a..2ff44ada777 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2829,9 +2829,9 @@ ast_declarator_list::hir(exec_list *instructions,
* flat."
*
* From section 4.3.4 of the GLSL 3.00 ES spec:
- * "Fragment shader inputs that are signed or unsigned integers or
- * integer vectors must be qualified with the interpolation qualifier
- * flat."
+ * "Fragment shader inputs that are, or contain, signed or unsigned
+ * integers or integer vectors must be qualified with the
+ * interpolation qualifier flat."
*
* Since vertex outputs and fragment inputs must have matching
* qualifiers, these two requirements are equivalent.
@@ -2839,12 +2839,12 @@ ast_declarator_list::hir(exec_list *instructions,
if (state->is_version(130, 300)
&& state->target == vertex_shader
&& state->current_function == NULL
- && var->type->is_integer()
+ && var->type->contains_integer()
&& var->mode == ir_var_shader_out
&& var->interpolation != INTERP_QUALIFIER_FLAT) {
- _mesa_glsl_error(&loc, state, "If a vertex output is an integer, "
- "then it must be qualified with 'flat'");
+ _mesa_glsl_error(&loc, state, "If a vertex output is (or contains) "
+ "an integer, then it must be qualified with 'flat'");
}
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index 3b066d0991e..82aeb84edb4 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -158,6 +158,24 @@ glsl_type::contains_sampler() const
}
}
+
+bool
+glsl_type::contains_integer() const
+{
+ if (this->is_array()) {
+ return this->fields.array->contains_integer();
+ } else if (this->is_record()) {
+ for (unsigned int i = 0; i < this->length; i++) {
+ if (this->fields.structure[i].type->contains_integer())
+ return true;
+ }
+ return false;
+ } else {
+ return this->is_integer();
+ }
+}
+
+
gl_texture_index
glsl_type::sampler_index() const
{
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index b0db2bf11ce..8cfd8dd021d 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -360,6 +360,12 @@ struct glsl_type {
}
/**
+ * Query whether or not type is an integral type, or for struct and array
+ * types, contains an integral type.
+ */
+ bool contains_integer() const;
+
+ /**
* Query whether or not a type is a float type
*/
bool is_float() const