[Mesa-dev] [PATCH 2/3] glsl: Fix incorrect hard-coded location of the gl_SecondaryFragColorEXT built-in.

Ilia Mirkin imirkin at alum.mit.edu
Tue Aug 23 04:13:58 UTC 2016


On Tue, Aug 23, 2016 at 12:05 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> Ilia Mirkin <imirkin at alum.mit.edu> writes:
>
>> On Mon, Aug 22, 2016 at 10:55 PM, Francisco Jerez <currojerez at riseup.net> wrote:
>>> Ilia Mirkin <imirkin at alum.mit.edu> writes:
>>>
>>>> On Mon, Aug 22, 2016 at 9:59 PM, Francisco Jerez <currojerez at riseup.net> wrote:
>>>>> gl_SecondaryFragColorEXT should have the same location as gl_FragColor
>>>>> for the secondary fragment color to be replicated to all fragment
>>>>> outputs.  The incorrect location of gl_SecondaryFragColorEXT would
>>>>> cause the linker to mark both FRAG_RESULT_COLOR and FRAG_RESULT_DATA0
>>>>> as being written to, which isn't allowed by the spec and would
>>>>> ultimately lead to an assertion failure in
>>>>> fs_visitor::emit_fb_writes() on my i965-fb-fetch branch.
>>>>
>>>> My recollection was that it didn't work with COLOR for "stupid"
>>>> reasons. Can you confirm that
>>>> bin/arb_blend_func_extended-fbo-extended-blend-pattern_gles2 -auto
>>>> passes with this patch?
>>>>
>>> Yes, it does, in fact
>>> arb_blend_func_extended-fbo-extended-blend-pattern_gles2 hits the i965
>>> assertion failure I mentioned above unless this patch is applied.
>>
>> This causes the test in question to fail on nouveau... the TGSI shader
>> generated starts with
>>
>> FRAG
>> PROPERTY FS_COLOR0_WRITES_ALL_CBUFS 1
>> DCL IN[0], POSITION, LINEAR
>> DCL OUT[0], SAMPLEMASK
>
> Heh, this smells a lot like the bug fixed in PATCH 1, but somewhere in
> the mesa state tracker.  st_glsl_to_tgsi.cpp:2422 does:
>
> | entry = new(mem_ctx) variable_storage(var,
> |                                       PROGRAM_OUTPUT,
> |                                       var->data.location
> |                                       + var->data.index);
>
> which is obviously bogus, e.g. for var->data.location ==
> FRAG_RESULT_COLOR and var->data.index == 1 you get
> FRAG_RESULT_SAMPLE_MASK which explains the sample mask declaration
> above.

Right, because having FRAG_RESULT_COLOR and index != 0 was never
possible prior to this. That might be why Ryan stuck it into
FRAG_RESULT_DATA0 [I may have been the one to suggest that].


More information about the mesa-dev mailing list