Commit b2d1c579 authored by Matt Turner's avatar Matt Turner

glcpp: Set extension defines after resolving the GLSL version.

Instead of defining preprocessor macros in glcpp_parser_create based on
the GL API, wait until the shader version has been resolved. Doing this
allows us to correctly set (and not set) preprocessor macros for
extensions allowed by the API but not the shader, as in the case of

The shader version has been resolved when the preprocessor encounters
the first preprocessor token, since the GLSL spec says

   "The #version directive must occur in a shader before anything else,
    except for comments and white space."

Specifically, if a #version token is found the version is known
explicitly, and if any other preprocessor token is found then the GLSL
version is implicitly 1.10.

Bugzilla: default avatarIan Romanick <>
parent c907595b
This diff is collapsed.
......@@ -182,6 +182,8 @@ struct glcpp_parser {
size_t output_length;
size_t info_log_length;
int error;
const struct gl_extensions *extensions;
bool version_resolved;
bool has_new_line_number;
int new_line_number;
bool has_new_source_number;
......@@ -192,7 +194,7 @@ struct glcpp_parser {
struct gl_extensions;
glcpp_parser_t *
glcpp_parser_create (const struct gl_extensions *extensions, int api);
glcpp_parser_create (const struct gl_extensions *extensions);
glcpp_parser_parse (glcpp_parser_t *parser);
......@@ -200,6 +202,9 @@ glcpp_parser_parse (glcpp_parser_t *parser);
glcpp_parser_destroy (glcpp_parser_t *parser);
glcpp_parser_resolve_version(glcpp_parser_t *parser);
glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log,
const struct gl_extensions *extensions, struct gl_context *g_ctx);
......@@ -139,7 +139,7 @@ glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log,
const struct gl_extensions *extensions, struct gl_context *gl_ctx)
int errors;
glcpp_parser_t *parser = glcpp_parser_create (extensions, gl_ctx->API);
glcpp_parser_t *parser = glcpp_parser_create (extensions);
if (! gl_ctx->Const.DisableGLSLLineContinuations)
*shader = remove_line_continuations(parser, *shader);
......@@ -151,6 +151,8 @@ glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log,
if (parser->skip_stack)
glcpp_error (&parser->skip_stack->loc, parser, "Unterminated #if\n");
ralloc_strcat(info_log, parser->info_log);
ralloc_steal(ralloc_ctx, parser->output);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment