[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