[Mesa-dev] [PATCH] glsl: subroutine types cannot be compared

Iago Toral itoral at igalia.com
Mon Jul 18 13:53:23 UTC 2016


Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>


On Mon, 2016-07-18 at 16:39 +0300, Andres Gomez wrote:
> subroutine variables are to be used just in the way functions are
> called. Although the spec doesn't say it explicitely, this means that
> these variables are not to be used in any other way than those left
> for function calls. Therefore, a comparison between 2 subroutine
> variables should also cause a compilation error.
> 
> From The OpenGL® Shading Language 4.40, page 117:
> 
>   "  To use subroutines, a subroutine type is declared, one or more
>      functions are associated with that subroutine type, and a
>      subroutine variable of that type is declared. The function
>      currently assigned to the variable function is then called by
>      using function calling syntax replacing a function name with the
>      name of the subroutine variable. Subroutine variables are
>      uniforms, and are assigned to specific functions only through
>      commands (UniformSubroutinesuiv) in the OpenGL API."
> 
> From The OpenGL® Shading Language 4.40, page 118:
> 
>   "  Subroutine uniform variables are called the same way functions
>      are called. When a subroutine variable (or an element of a
>      subroutine variable array) is associated with a particular
>      function, all function calls through that variable will call
> that
>      particular function."
> 
> Fixes GL44-
> CTS.shader_subroutine.subroutines_cannot_be_assigned_float_int_values
> _or_be_compared
> 
> Signed-off-by: Andres Gomez <agomez at igalia.com>
> ---
>  src/compiler/glsl/ast_to_hir.cpp | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp
> b/src/compiler/glsl/ast_to_hir.cpp
> index 8ddc084..e255d63 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -1494,6 +1494,10 @@ ast_expression::do_hir(exec_list
> *instructions,
>                   !state->check_version(120, 300, &loc,
>                                         "array comparisons
> forbidden")) {
>           error_emitted = true;
> +      } else if ((op[0]->type->contains_subroutine() ||
> +                  op[1]->type->contains_subroutine())) {
> +         _mesa_glsl_error(&loc, state, "subroutine comparisons
> forbidden");
> +         error_emitted = true;
>        } else if ((op[0]->type->contains_opaque() ||
>                    op[1]->type->contains_opaque())) {
>           _mesa_glsl_error(&loc, state, "opaque type comparisons
> forbidden");


More information about the mesa-dev mailing list