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

Ian Romanick idr at freedesktop.org
Thu Jul 21 19:24:45 UTC 2016

On 07/19/2016 01:45 PM, Ian Romanick wrote:
> On 07/19/2016 06:54 AM, Andres Gomez wrote:
>> Hi,
>> Just dropped:
>> https://lists.freedesktop.org/archives/mesa-dev/2016-July/123485.html
>> I didn't realize there was already this thread open.
>> On Tue, 2016-06-07 at 09:59 -0700, Ian Romanick wrote:
>>> 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).
>> In my opinion, the specs are somehow contradictory or not completely
>> clear.
>> AFAIU, subroutine variables are to be used just in the way functions
>> are called. Although the spec doesn't say it explicitly, 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."
>>> 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);
>> If that would be the case, and we agree that subroutines can be
>> compared, then we have, at least, some other bug to correct.
>> I've made some piglit tests with the following scenarios:
>>  * == comparison result:
>>     * foo and bar point to the same subroutine function -> false
>>     * foo and bar point to different subroutine functions -> false
>>  * != comparison result:
>>     * foo and bar point to the same subroutine function -> false
>>     * foo and bar point to different subroutine functions -> false
>> So, what would be the conclusion? Do we allow subroutine variables comparison?
> There is no conclusion yet.  I opened a Khronos gitlab tracker (right
> after Dave sent his original patch) for the CTS.  I'll try to get it on
> the conference call agenda for this week.

It is decided... the test will stand as-is, and the GLSL spec will be
updated to explicitly say that subroutine uniforms cannot be compared
using == or !=.

So... I think I like Andres's patch slightly better than Dave's, but I
don't care too much.  Either patch can have my

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

>> FTR, I passed this patch through an "all" piglit run and through GL44 CTS and it doesn't cause any regression.
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev

More information about the mesa-dev mailing list