[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