glcpp: fix #undef to match latest spec update and GLSLang implementation
authorIago Toral Quiroga <itoral@igalia.com>
Tue, 30 May 2017 11:25:35 +0000 (13:25 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Wed, 7 Jun 2017 05:50:46 +0000 (07:50 +0200)
commitf7741985be0234c3fe71e1f97740579e35726b92
treecead629d1dba8b5c2f807b4861baf563718eeb5d
parent1ec4f008a2b5348828a4a2e48cd7129811ff3fe4
glcpp: fix #undef to match latest spec update and GLSLang implementation

GLSL ES spec includes the following:

   "It is an error to undefine or to redefine a built-in
    (pre-defined) macro name."

But desktop GLSL doesn't. This has sparked some discussion
in Khronos, and the final conclusion was to update the
GLSL 4.50 spec to include the following:

   "By convention, all macro names containing two consecutive
    underscores ( __ ) are reserved for use by underlying
    software layers.  Defining or undefining such a name in a
    shader does not itself result in an error, but may result
    in unintended behaviors that stem from having multiple
    definitions of the same name.  All macro names prefixed
    with “GL_” (“GL” followed by a single underscore) are also
    reserved, and defining or undefining such a name results in
    a compile-time error."

In other words, undefining GL_* names should be an error, but
undefining other names with a double underscore in them is
not strictly prohibited in desktop GLSL.

This patch fixes the preprocessor to apply these rules,
following exactly the implementation already present
in GLSLang. This fixes some tests in CTS.

Khronos bug:
https://cvs.khronos.org/bugzilla/show_bug.cgi?id=16003

Fixes:
KHR-GL45.shaders.preprocessor.definitions.undefine_core_profile_vertex
KHR-GL45.shaders.preprocessor.definitions.undefine_core_profile_fragment

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/compiler/glsl/glcpp/glcpp-parse.y