From 1201d3377ef8665797bf00839fd49a76e3e44101 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 2 Sep 2019 12:31:17 +1000 Subject: [PATCH] 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 --- src/compiler/glsl/glcpp/glcpp-parse.y | 14 +++++++++++++- .../glsl/glcpp/pp_standalone_scaffolding.c | 16 ++++++++++++++++ .../glsl/glcpp/pp_standalone_scaffolding.h | 7 +++++++ src/mesa/main/shaderapi.c | 13 +++++++++++++ src/mesa/main/shaderapi.h | 6 ++++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y index 60323e449da..514dbe7a4c4 100644 --- a/src/compiler/glsl/glcpp/glcpp-parse.y +++ b/src/compiler/glsl/glcpp/glcpp-parse.y @@ -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 diff --git a/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c b/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c index ae5f63dc0b3..20a2252ee18 100644 --- a/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c +++ b/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c @@ -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; +} diff --git a/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h b/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h index de869d9b1a3..a35c04ee707 100644 --- a/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h +++ b/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h @@ -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 */ diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index efbdda4ddb0..f028653700d 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -3162,6 +3162,7 @@ struct shader_includes { /* Array to hold include paths given to glCompileShaderIncludeARB() */ struct sh_incl_path_entry **include_paths; size_t num_include_paths; + size_t relative_path_cursor; /* Root hash table holding the shader include tree */ struct hash_table *shader_include_tree; @@ -3176,6 +3177,18 @@ _mesa_init_shader_includes(struct gl_shared_state *shared) _mesa_key_string_equal); } +size_t +_mesa_get_shader_include_cursor(struct gl_shared_state *shared) +{ + return shared->ShaderIncludes->relative_path_cursor; +} + +void +_mesa_set_shader_include_cursor(struct gl_shared_state *shared, size_t cursor) +{ + shared->ShaderIncludes->relative_path_cursor = cursor; +} + static void destroy_shader_include(struct hash_entry *entry) { diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h index 13cde963ff8..66acb6a9694 100644 --- a/src/mesa/main/shaderapi.h +++ b/src/mesa/main/shaderapi.h @@ -412,6 +412,12 @@ _mesa_dump_shader_source(const gl_shader_stage stage, const char *source); void _mesa_init_shader_includes(struct gl_shared_state *shared); +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 cusor); + void _mesa_destroy_shader_includes(struct gl_shared_state *shared); -- 2.30.2