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

Ian Romanick idr at freedesktop.org
Sun Feb 1 06:34:13 PST 2015


On 02/01/2015 01:15 PM, Francisco Jerez wrote:
> Ian Romanick <idr at freedesktop.org> writes:
> 
>> 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.
>>
> Yes, they do [1].  But I don't think it would be a good idea to change
> the spec.  For images it would be fine actually (as long as the
> condition is dynamically uniform) because they're implemented as a
> simple 32-bit integer index.  But for samplers the hell would break
> loose because most back-ends expect to be able to determine the sampler
> binding statically (up to a dynamically uniform array index if they do
> gpu_shader5), so the fact is that it's already broken and will lead to a
> crash even if we pretend to allow it.

Well...

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

is really the same as

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

so it seems reasonable for a compiler to "just make it work."  The
problem with having everyone follow the spec is there's probably some
application that expects the non-conformant behavior.  We get enough of
those bug reports. :)

Although, if we currently crash on this sort of input, we're already
worse than generating an unexpected error for the application.

> [1] http://people.freedesktop.org/~currojerez/piglit-summary-image_load_store-kepler/results-all/spec/ARB_shader_image_load_store/compiler/expression-selection.frag.html
> 
>>>        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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150201/b86f7d4f/attachment-0001.sig>


More information about the mesa-dev mailing list