mesa: add support cursor support for relative path shader includes

This will allow us to continue searching the current path for
relative shader includes.

From the ARB_shading_language_include spec:

   "If it is quoted with double quotes in a previously included
   string, then the first search point will be the tree location
   where the previously included string had been found."

Reviewed-by: Witold Baryluk <witold.baryluk@gmail.com>
This commit is contained in:
Timothy Arceri
2019-09-02 12:31:17 +10:00
parent db5197cec5
commit 1201d3377e
5 changed files with 55 additions and 1 deletions
+13 -1
View File
@@ -36,6 +36,12 @@ const char *
_mesa_lookup_shader_include(struct gl_context *ctx, char *path,
bool error_check);
size_t
_mesa_get_shader_include_cursor(struct gl_shared_state *shared);
void
_mesa_set_shader_include_cursor(struct gl_shared_state *shared, size_t cursor);
static void
yyerror(YYLTYPE *locp, glcpp_parser_t *parser, const char *error);
@@ -344,10 +350,14 @@ control_line_success:
}
}
| HASH_TOKEN INCLUDE NEWLINE {
size_t include_cursor = _mesa_get_shader_include_cursor(parser->gl_ctx->Shared);
/* Remove leading and trailing "" or <> */
char *start = strchr($2, '"');
if (!start)
if (!start) {
_mesa_set_shader_include_cursor(parser->gl_ctx->Shared, 0);
start = strchr($2, '<');
}
char *path = strndup(start + 1, strlen(start + 1) - 1);
const char *shader =
@@ -410,6 +420,8 @@ control_line_success:
glcpp_lex_destroy(tmp_parser->scanner);
_mesa_hash_table_destroy(tmp_parser->defines, NULL);
}
_mesa_set_shader_include_cursor(parser->gl_ctx->Shared, include_cursor);
}
| HASH_TOKEN IF pp_tokens NEWLINE {
/* Be careful to only evaluate the 'if' expression if
@@ -39,3 +39,19 @@ _mesa_lookup_shader_include(struct gl_context *ctx, char *path,
return NULL;
}
size_t
_mesa_get_shader_include_cursor(struct gl_shared_state *shared)
{
(void) shared;
return 0;
}
void
_mesa_set_shader_include_cursor(struct gl_shared_state *shared,
size_t cursor)
{
(void) shared;
(void) cursor;
}
@@ -37,4 +37,11 @@ const char *
_mesa_lookup_shader_include(struct gl_context *ctx, char *path,
bool error_check);
size_t
_mesa_get_shader_include_cursor(struct gl_shared_state *shared);
void
_mesa_set_shader_include_cursor(struct gl_shared_state *shared,
size_t cursor);
#endif /* PP_STANDALONE_SCAFFOLDING_H */