On 01.08.2014 03:22, Carl Worth wrote:
> Strictly speaking, the GLSL specification only allows for the '#' to appear in
> a shader in two places:
> 
>       1. To introduce a pre-processing directive
> 
>          In this case, the '#' must be the first character on a line after
>          ignoring any comments and horizontal whitespace.
> 
>       2. As part of the token-pasting operator
> 
>          In this case, the '#' must appear as part of the sequence "##" and
>          can only appear in the replacement list of a macro definition.
> 
> Since commit f062f0506a5b827667b7eb52136d8420b7e8113b, glcpp has been strict
> about '#' characters, such that any occurence outside of either of the above
> two cases would result in a syntax error of "Unexpected HASH_TOKEN" from the
> grammar.
> 
> (Prior to that commit, these illegal '#' would be silently ignored and printed
> to stdout. And if it hadn't been for that commit, these illegal '#' would have
> triggered internal errors with later commits.)
> 
> With this commit, glcpp relaxes its strictness and treats such appearances of
> '#' as just another piece of punctuation. This would make it legal to do
> something like:
> 
>       #define FOO # something here
> 
> and then use "#ifdef FOO" and similar, (though if FOO were ever directly
> expanded, this should trigger a syntax error in the main GLSL compiler).
> 
> Relaxing strict conformance compared to GLSL seems somewhat dubious here, but
> might be justified for a few reasons:
> 
>       1. GCC's preprocessor allows this, (though C is not GLSL, of course)
> 
>       2. glcpp is generally soft about illegal characters, (compare to
>          non-ASCII characters which glcpp happily passes through, trusting
>          the GLSL compiler to catch them).
> 
>       3. At least one game in the wild (Reactive Quake) has been observed

It's 'Reaction Quake'.


>          with a bogus '#' in it:
> 
>               #define USE_DISCARD#line 0
> 
>          Note that the shader (that we've seen) with this line does not ever
>          *use* the USE_DISCARD macro. Note also that this shader is accepted
>          by both Nvidia's OpenGL implementation as well as Mesa prior to
>          the commit referenced above.

This change makes the game work again. I'm afraid I don't care about the
game enough to report the problem to its developers. :)

Tested-by: Michel Dänzer <michel.daen...@amd.com>


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to