Skip to content

Commit

Permalink
Merge pull request #81381 from bitsawer/fix_shader_include_markers
Browse files Browse the repository at this point in the history
Fix shader language preprocessor include marker handling
  • Loading branch information
akien-mga committed Sep 26, 2023
2 parents 480590c + 3c042fb commit e25408d
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 10 deletions.
40 changes: 31 additions & 9 deletions servers/rendering/shader_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -610,19 +610,39 @@ ShaderLanguage::Token ShaderLanguage::_get_token() {
incp.push_back(0); // Zero end it.
String include_path(incp.ptr());
include_positions.write[include_positions.size() - 1].line = tk_line;
FilePosition fp;
fp.file = include_path;
fp.line = 0;
tk_line = 0;
include_positions.push_back(fp);

} else if (GETCHAR(0) == '@' && GETCHAR(1) == '<') {
if (include_positions.size() == 1) {
return _make_token(TK_ERROR, "Invalid include exit hint @@< without matching enter hint.");
String marker = ">>" + include_path;
if (!include_markers_handled.has(marker)) {
include_markers_handled.insert(marker);

FilePosition fp;
fp.file = include_path;
fp.line = 0;
tk_line = 0;
include_positions.push_back(fp);
}

} else if (GETCHAR(0) == '@' && GETCHAR(1) == '<') {
char_idx += 2;

include_positions.resize(include_positions.size() - 1); // Pop back.
LocalVector<char32_t> incp;
while (GETCHAR(0) != '\n') {
incp.push_back(GETCHAR(0));
char_idx++;
}
incp.push_back(0); // Zero end it.
String include_path(incp.ptr());

String marker = "<<" + include_path;
if (!include_markers_handled.has(marker)) {
include_markers_handled.insert(marker);

if (include_positions.size() == 1) {
return _make_token(TK_ERROR, "Invalid include exit hint @@< without matching enter hint.");
}
include_positions.resize(include_positions.size() - 1); // Pop back.
}

tk_line = include_positions[include_positions.size() - 1].line - 1; // Restore line.

} else {
Expand Down Expand Up @@ -1217,6 +1237,8 @@ void ShaderLanguage::clear() {
include_positions.clear();
include_positions.push_back(FilePosition());

include_markers_handled.clear();

#ifdef DEBUG_ENABLED
keyword_completion_context = CF_UNSPECIFIED;
used_constants.clear();
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/shader_language.h
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,7 @@ class ShaderLanguage {
int error_line = 0;

Vector<FilePosition> include_positions;
HashSet<String> include_markers_handled;

#ifdef DEBUG_ENABLED
struct Usage {
Expand Down
2 changes: 1 addition & 1 deletion servers/rendering/shader_preprocessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@ void ShaderPreprocessor::process_include(Tokenizer *p_tokenizer) {
processor.preprocess(state, included, result);
add_to_output("@@>" + real_path + "\n"); // Add token for enter include path
add_to_output(result);
add_to_output("\n@@<\n"); // Add token for exit include path
add_to_output("\n@@<" + real_path + "\n"); // Add token for exit include path.

// Reset to last include if there are no errors. We want to use this as context.
if (state->error.is_empty()) {
Expand Down

0 comments on commit e25408d

Please sign in to comment.