[Mesa-dev] [PATCH 2/2] glsl: Ensure that sampler declarations are always uniform or "in" parameters.
Ian Romanick
idr at freedesktop.org
Fri Jul 15 15:22:33 PDT 2011
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 07/13/2011 03:31 PM, Paul Berry wrote:
> 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: Ian Romanick <ian.d.romanick at intel.com>
> ---
> src/glsl/ast_to_hir.cpp | 35 +++++++++++++++++++++++++++++++++++
> 1 files changed, 35 insertions(+), 0 deletions(-)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 2e54e8c..2312c29 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -2704,6 +2704,17 @@ ast_declarator_list::hir(exec_list *instructions,
> : "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
> * 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
> @@ -2864,6 +2875,18 @@ ast_parameter_declarator::hir(exec_list *instructions,
> */
> 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);
>
> /* Parameter declarations do not have r-values.
> @@ -2992,6 +3015,18 @@ ast_function::hir(exec_list *instructions,
> "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
> * 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.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
iEYEARECAAYFAk4gvakACgkQX1gOwKyEAw9/rQCghhF6Bc04Rq2+l6/W+VBUanSw
sEoAn1smT41BMkhR6Qnudh/Onl16Gx1o
=YMyq
-----END PGP SIGNATURE-----
More information about the mesa-dev
mailing list