[Mesa-dev] [PATCH 3/7] glsl: Forbid opaque variables as operands of the ternary operator.

Ian Romanick idr at freedesktop.org
Sun Feb 1 01:52:47 PST 2015


On 01/31/2015 09:54 PM, Francisco Jerez wrote:
> ---
>  src/glsl/ast_to_hir.cpp | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 1ba29f7..783384e 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -1596,6 +1596,18 @@ ast_expression::do_hir(exec_list *instructions,
>           error_emitted = true;
>        }
>  
> +      /* From section 4.1.7 of the GLSL 4.50 spec (Opaque Types):
> +       *
> +       *  "Except for array indexing, structure member selection, and
> +       *   parentheses, opaque variables are not allowed to be operands in
> +       *   expressions; such use results in a compile-time error."
> +       */
> +      if (type->contains_opaque()) {
> +         _mesa_glsl_error(&loc, state, "opaque variables cannot be operands "
> +                          "of the ?: operator");
> +         error_emitted = true;
> +      }
> +

This is what the spec says, but I'm suspicious that other vendors may
also allow it.  Can we poke at AMD and NVIDIA close-source drivers to
see if they allow things like

    x = texture(b ? sampler1 : sampler2, t);

If they allow it, I'll submit a spec bug.  If they do not allow it, we
shouldn't either.

>        ir_constant *cond_val = op[0]->constant_expression_value();
>        ir_constant *then_val = op[1]->constant_expression_value();
>        ir_constant *else_val = op[2]->constant_expression_value();



More information about the mesa-dev mailing list