diff options
author | Paul Berry <[email protected]> | 2013-02-06 16:09:39 -0800 |
---|---|---|
committer | Paul Berry <[email protected]> | 2013-02-13 07:58:01 -0800 |
commit | 93c913485ea16d09b2d753c872607e79c0b68f6b (patch) | |
tree | b1bf3d9f68533cffc9d2ebd91a08314fa0dfc71a /src/glsl/ast_to_hir.cpp | |
parent | d5948f2f5e37d1abc0d433ddf43407d87b2d1227 (diff) |
glsl: don't allow non-flat integral types in varying structs/arrays.
In the GLSL 1.30 spec, section 4.3.6 ("Outputs") says:
"If a vertex output is a signed or unsigned integer or integer
vector, then it must be qualified with the interpolation qualifier
flat."
The GLSL ES 3.00 spec further clarifies, in section 4.3.6 ("Output
Variables"):
"Vertex shader outputs that are, *or contain*, signed or unsigned
integers or integer vectors must be qualified with the
interpolation qualifier flat."
(Emphasis mine.)
The language in the GLSL ES 3.00 spec is clearly correct and should be
applied to all shading language versions, since varyings that contain
ints can't be interpolated, regardless of which shading language
version is in use.
(Note that in GLSL 1.50 the restriction is changed to apply to
fragment shader inputs rather than vertex shader outputs, to
accommodate the fact that in the presence of geometry shaders, vertex
shader outputs are not necessarily interpolated. That will be
addressed by a future patch).
NOTE: This is a candidate for stable branches.
Reviewed-by: Ian Romanick <[email protected]>
Reviewed-by: Anuj Phogat <[email protected]>
Diffstat (limited to 'src/glsl/ast_to_hir.cpp')
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 12 |
1 files changed, 6 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'"); } |