[Mesa-dev] [PATCH V2 2/4] glsl: Compile error if fs uses gl_FragCoord before first redeclaration

Ian Romanick idr at freedesktop.org
Tue Feb 25 14:52:06 PST 2014


On 02/25/2014 01:15 PM, Anuj Phogat wrote:
> On Tue, Feb 25, 2014 at 7:47 AM, Ian Romanick <idr at freedesktop.org> wrote:
>>
>> On 02/24/2014 05:34 PM, Anuj Phogat wrote:
>>>
>>> Section 4.3.8.1, page 39 of GLSL 1.50 spec says:
>>>     "Within any shader, the first redeclarations of gl_FragCoord
>>>      must appear before any use of gl_FragCoord."
>>>
>>> GLSL compiler should generate an error in following case:
>>>
>>> vec4 p = gl_FragCoord;
>>> layout(origin_upper_left) in vec4 gl_FragCoord;
>>>
>>> void main()
>>> {
>>> }
>>>
>>> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
>>> Cc: <mesa-stable at lists.freedesktop.org>
>>> ---
>>>    src/glsl/ast_to_hir.cpp | 16 ++++++++++++++++
>>>    1 file changed, 16 insertions(+)
>>>
>>> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
>>> index 9fe3095..f5dacfd 100644
>>> --- a/src/glsl/ast_to_hir.cpp
>>> +++ b/src/glsl/ast_to_hir.cpp
>>> @@ -2490,6 +2490,22 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
>>>       }
>>>
>>>       if (strcmp(var->name, "gl_FragCoord") == 0) {
>>> +      /* Section 4.3.8.1, page 39 of GLSL 1.50 spec says:
>>> +       *
>>> +       *    "Within any shader, the first redeclarations of gl_FragCoord
>>> +       *     must appear before any use of gl_FragCoord."
>>> +       *
>>> +       * Generate a compiler error if above condition is not met by the
>>> +       * fragment shader.
>>> +       */
>>> +      ir_variable *earlier = state->symbols->get_variable("gl_FragCoord");
>>> +      if (earlier != NULL &&
>>> +          earlier->data.used &&
>>> +          !state->fs_redeclares_gl_fragcoord) {
>>
>>
>> I don't think '!state->fs_redeclares_gl_fragcoord' should be there. What about a shader like:
>>
>>      layout(origin_upper_left) in vec4 gl_FragCoord;
>>
>>      vec4 p = gl_FragCoord;
>>      layout(origin_upper_left) in vec4 gl_FragCoord;
>>
>>      void main()
>>      {
>>      }
>>
> This shader compiles successfully as I expected. Only the first re-declaration
> must appear before gl_FragCoord usage. Do you interpret the spec differently?
> I've added new piglit tests which cover this case as well:
> http://patchwork.freedesktop.org/project/piglit/list/?submitter=Anuj+Phogat&q=glsl-1.50

I overlooked "the first" in that sentence.  Your code should be correct, 
then. :)

>>> +         _mesa_glsl_error(loc, state,
>>> +                          "gl_FragCoord used before its first redeclaration "
>>> +                          "in fragment shader");
>>> +      }
>>>
>>>          /* Make sure all gl_FragCoord redeclarations specify the same layout
>>>           * qualifiers.
>>>



More information about the mesa-dev mailing list