[Mesa-dev] [PATCH 1/3] glsl: Compile error if fs defines conflicting qualifiers for gl_FragCoord

Anuj Phogat anuj.phogat at gmail.com
Wed Feb 19 15:06:05 PST 2014


On Tue, Feb 18, 2014 at 5:28 PM, Ian Romanick <idr at freedesktop.org> wrote:
> On 02/18/2014 03:36 PM, Anuj Phogat wrote:
>> On Tue, Feb 18, 2014 at 11:01 AM, Ian Romanick <idr at freedesktop.org> wrote:
>>> On 02/10/2014 05:29 PM, Anuj Phogat wrote:
>>>> GLSL 1.50 spec says:
>>>>    "If gl_FragCoord is redeclared in any fragment shader in a program,
>>>>     it must be redeclared in all the fragment shaders in that
>>>>     program that have a static use gl_FragCoord. All redeclarations of
>>>>     gl_FragCoord in all fragment shaders in a single program must
>>>>     have the same set of qualifiers."
>>>>
>>>> This patch makes the glsl compiler to generate an error if we have a
>>>> fragment shader defined with conflicting layout qualifier declarations
>>>> for gl_FragCoord. For example:
>>>>
>>>> layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
>>>> layout(pixel_center_integer) in vec4 gl_FragCoord;
>>>> void main()
>>>> {
>>>>    gl_FragColor = gl_FragCoord.xyzz;
>>>> }
>>>>
>>>> Cc: <mesa-stable at lists.freedesktop.org>
>>>> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
>>>> ---
>>>>  src/glsl/ast_to_hir.cpp         | 39 +++++++++++++++++++++++++++++++++++++++
>>>>  src/glsl/glsl_parser_extras.cpp |  3 +++
>>>>  src/glsl/glsl_parser_extras.h   | 10 ++++++++++
>>>>  3 files changed, 52 insertions(+)
>>>>
>>>> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
>>>> index c89a26b..7d7d89b 100644
>>>> --- a/src/glsl/ast_to_hir.cpp
>>>> +++ b/src/glsl/ast_to_hir.cpp
>>>> @@ -2374,6 +2374,45 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
>>>>                      qual_string);
>>>>     }
>>>>
>>>> +   /* Make sure all gl_FragCoord redeclarations specify the same layout
>>>> +    * qualifier type.
>>>> +    */
>>>> +   bool conflicting_pixel_center_integer =
>>>> +      state->fs_pixel_center_integer &&
>>>> +      !qual->flags.q.pixel_center_integer;
>>>> +
>>>> +   bool conflicting_origin_upper_left =
>>>> +      state->fs_origin_upper_left &&
>>>> +      !qual->flags.q.origin_upper_left;
>>>
>>> I don't think this catches all the cases.  What about
>>>
>>> layout(origin_upper_left                      ) in vec4 gl_FragCoord;
>>> layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
>>>
>> Nice catch. I'll update my patch to include this case. What do you think
>> about following two cases?
>> case 1:
>> in vec4 gl_FragCoord;
>> layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
>>
>> AMD produces no compilation error. This patch matches the behavior.
>>
>> case 2:
>> layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
>> in vec4 gl_FragCoord;
>>
>> AMD produces compilation error. This patch matches the behavior.
>
> I don't think that's right.  I think they should both produce an error.
>  The spec says, "All redeclarations of gl_FragCoord in all fragment
> shaders in a single program must have the same set of qualifiers."  I
> can't see any reason to give an error for case 2 but not for case 1.
>
I agree.
> We should also check NVIDIA.
>
NVIDIA driver produces compilation error in both cases. I'll add a check
to handle them correctly in mesa.


More information about the mesa-dev mailing list