[Mesa-dev] [PATCH] glsl/ast: don't allow subroutine uniform comparisons

Ian Romanick idr at freedesktop.org
Tue Jun 7 16:59:35 UTC 2016


On 06/06/2016 10:20 PM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> This fixes:
> GL45-CTS.shader_subroutine.subroutines_cannot_be_assigned_float_int_values_or_be_compared
> 
> though I'm not 100% sure why this is illegal from the spec,
> but it makes us pass the test, and I really can't see a use case for this.

I think the test is wrong.  Section 5.9 (Expressions) of the GLSL 4.5
spec clearly says:

    The equality operators equal (==), and not equal (!=) operate on
    all types (except aggregates that contain opaque types).

As much as anyone would use subroutines, you could imagine this being
used like:

    value = foo(param1, param2);
    if (foo != bar)
        value += bar(param1, param2);

> Signged-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/compiler/glsl/ast_to_hir.cpp | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index b7192b2..fbd3256 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -1484,6 +1484,12 @@ ast_expression::do_hir(exec_list *instructions,
>                           "operand of type 'void' or a right operand of type "
>                           "'void'", (this->oper == ast_equal) ? "==" : "!=");
>           error_emitted = true;
> +      } else if (op[0]->type->is_subroutine() || op[1]->type->is_subroutine()) {
> +         _mesa_glsl_error(& loc, state, "`%s':  wrong operand types: "
> +                         "no operation `%1$s' exists that takes a left-hand "
> +                         "operand of type 'subroutine' or a right operand of type "
> +                         "'subroutine'", (this->oper == ast_equal) ? "==" : "!=");
> +         error_emitted = true;
>        } else if ((!apply_implicit_conversion(op[0]->type, op[1], state)
>             && !apply_implicit_conversion(op[1]->type, op[0], state))
>            || (op[0]->type != op[1]->type)) {
> 



More information about the mesa-dev mailing list