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

Ian Romanick idr at freedesktop.org
Tue Feb 18 17:28:20 PST 2014


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.

We should also check NVIDIA.



More information about the mesa-dev mailing list