[Mesa-dev] [PATCH] glcpp: fix #undef to match latest spec update and GLSLang implementation

Iago Toral itoral at igalia.com
Tue Jun 6 08:53:38 UTC 2017


This didn't get any reviews, any takers? It fixes a couple of CTS tests
so it would be good to have it merged.

Iago

On Tue, 2017-05-30 at 13:25 +0200, Iago Toral Quiroga wrote:
> 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.
> 
> Kronos 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
> ---
>  src/compiler/glsl/glcpp/glcpp-parse.y | 45 ++++++++++++++++++++++++-
> ----------
>  1 file changed, 31 insertions(+), 14 deletions(-)
> 
> diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y
> b/src/compiler/glsl/glcpp/glcpp-parse.y
> index fe211a0..f1719f9 100644
> --- a/src/compiler/glsl/glcpp/glcpp-parse.y
> +++ b/src/compiler/glsl/glcpp/glcpp-parse.y
> @@ -287,24 +287,41 @@ control_line_success:
>                   * The GLSL ES 1.00 spec does not contain this text,
> but
>                   * dEQP's preprocess test in GLES2 checks for it.
>                   *
> -                 * Section 3.3 (Preprocessor) of the GLSL 1.30 spec
> says:
> +                 * Section 3.3 (Preprocessor) revision 7, of the
> GLSL 4.50
> +                 * spec says:
>                   *
> -                 *    #define and #undef functionality are defined
> as is
> -                 *    standard for C++ preprocessors for macro
> definitions
> -                 *    both with and without macro parameters.
> +                 *    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_" (...) are also reseved,
> and defining
> +                 *    such a name results in a compile-time error.
>                   *
> -                 * At least as far as I can tell GCC allow '#undef
> __FILE__'.
> -                 * Furthermore, there are desktop OpenGL conformance
> tests
> -                 * that expect '#undef __VERSION__' and '#undef
> -                 * GL_core_profile' to work.
> +                 * The code below implements the same checks as
> GLSLang.
>                   */
> -		if (parser->is_gles &&
> -                    (strcmp("__LINE__", $3) == 0
> -                     || strcmp("__FILE__", $3) == 0
> -                     || strcmp("__VERSION__", $3) == 0
> -                     || strncmp("GL_", $3, 3) == 0))
> +		if (strncmp("GL_", $3, 3) == 0)
>  			glcpp_error(& @1, parser, "Built-in (pre-
> defined)"
> -				    " macro names cannot be
> undefined.");
> +				    " names beginning with GL_
> cannot be undefined.");
> +		else if (strstr($3, "__") != NULL) {
> +			if (parser->is_gles
> +			    && parser->version >= 300
> +			    && (strcmp("__LINE__", $3) == 0
> +				|| strcmp("__FILE__", $3) == 0
> +				|| strcmp("__VERSION__", $3) == 0))
> {
> +				glcpp_error(& @1, parser, "Built-in
> (pre-defined)"
> +					    " names cannot be
> undefined.");
> +			} else if (parser->is_gles && parser-
> >version <= 300) {
> +				glcpp_error(& @1, parser,
> +					    " names containing
> consecutive underscores"
> +					    " are reserved.");
> +			} else {
> +				glcpp_warning(& @1, parser,
> +					      " names containing
> consecutive underscores"
> +					      " are reserved.");
> +			}
> +		}
>  
>  		entry = _mesa_hash_table_search (parser->defines,
> $3);
>  		if (entry) {


More information about the mesa-dev mailing list