Skip to content
Snippets Groups Projects
Commit f0722105 authored by Paul Berry's avatar Paul Berry
Browse files

glsl: Ensure that sampler declarations are always uniform or "in" parameters.

This brings us into compliance with page 17 (page 22 of the PDF) of
the GLSL 1.20 spec:

    "[Sampler types] can only be declared as function parameters or
    uniform variables (see Section 4.3.5 "Uniform"). ... [Samplers]
    cannot be used as out or inout function parameters."

The spec isn't explicit about whether this rule applies to
structs/arrays containing shaders, but the intent seems to be to
ensure that it can always be determined at compile time which sampler
is being used in each texture lookup.  So to avoid creating a
loophole, the rule needs to apply to structs/arrays containing shaders
as well.

Fixes piglit tests spec/glsl-1.10/compiler/samplers/*.frag, and fixes
bug 38987.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=38987


Reviewed-by: default avatarIan Romanick <ian.d.romanick@intel.com>
parent ddc1c963
No related branches found
No related tags found
No related merge requests found
...@@ -2704,6 +2704,17 @@ ast_declarator_list::hir(exec_list *instructions, ...@@ -2704,6 +2704,17 @@ ast_declarator_list::hir(exec_list *instructions,
: "and integer"); : "and integer");
} }
/* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
*
* "[Sampler types] can only be declared as function
* parameters or uniform variables (see Section 4.3.5
* "Uniform")".
*/
if (var_type->contains_sampler() &&
!this->type->qualifier.flags.q.uniform) {
_mesa_glsl_error(&loc, state, "samplers must be declared uniform");
}
/* Process the initializer and add its instructions to a temporary /* Process the initializer and add its instructions to a temporary
* list. This list will be added to the instruction stream (below) after * list. This list will be added to the instruction stream (below) after
* the declaration is added. This is done because in some cases (such as * the declaration is added. This is done because in some cases (such as
...@@ -2864,6 +2875,18 @@ ast_parameter_declarator::hir(exec_list *instructions, ...@@ -2864,6 +2875,18 @@ ast_parameter_declarator::hir(exec_list *instructions,
*/ */
apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc); apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc);
/* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
*
* "Samplers cannot be treated as l-values; hence cannot be used
* as out or inout function parameters, nor can they be assigned
* into."
*/
if ((var->mode == ir_var_inout || var->mode == ir_var_out)
&& type->contains_sampler()) {
_mesa_glsl_error(&loc, state, "out and inout parameters cannot contain samplers");
type = glsl_type::error_type;
}
instructions->push_tail(var); instructions->push_tail(var);
/* Parameter declarations do not have r-values. /* Parameter declarations do not have r-values.
...@@ -2992,6 +3015,18 @@ ast_function::hir(exec_list *instructions, ...@@ -2992,6 +3015,18 @@ ast_function::hir(exec_list *instructions,
"function `%s' return type has qualifiers", name); "function `%s' return type has qualifiers", name);
} }
/* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
*
* "[Sampler types] can only be declared as function parameters
* or uniform variables (see Section 4.3.5 "Uniform")".
*/
if (return_type->contains_sampler()) {
YYLTYPE loc = this->get_location();
_mesa_glsl_error(&loc, state,
"function `%s' return type can't contain a sampler",
name);
}
/* Verify that this function's signature either doesn't match a previously /* Verify that this function's signature either doesn't match a previously
* seen signature for a function with the same name, or, if a match is found, * seen signature for a function with the same name, or, if a match is found,
* that the previously seen signature does not have an associated definition. * that the previously seen signature does not have an associated definition.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment