From 499c0515cde44b304d131ac7ac3b2030c9dbe11c Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 16 Mar 2021 11:38:55 +0200 Subject: [PATCH] Don't modify the target block's variable map from InlineContentInjector This felt hacky, and also seemed wrong since the variable map contains the original names of the variables, not new ones. Instead avoid inlining more than one function per pass into any given function. --- source/glsl/optimize.cpp | 13 ++++++++----- source/glsl/optimize.h | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 7473fe2c..6c49878b 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -90,9 +90,6 @@ const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &ta inlined.push_back(r_inlined_statement); } - // Insert the variables here to enable further inlinings to avoid conflicts. - tgt_blk.variables.insert(variable_map.begin(), variable_map.end()); - SetForScope set_remap(remap_names, 1); SetForScope set_prefix(remap_prefix, target_func.name); variable_map.clear(); @@ -190,7 +187,8 @@ void InlineContentInjector::visit(Return &ret) FunctionInliner::FunctionInliner(): current_function(0), - r_any_inlined(false) + r_any_inlined(false), + r_inlined_here(false) { } bool FunctionInliner::apply(Stage &s) @@ -218,7 +216,7 @@ void FunctionInliner::visit(Block &block) { SetForScope set_block(current_block, &block); SetForScope::iterator> save_insert_point(insert_point, block.body.begin()); - for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) + for(NodeList::iterator i=block.body.begin(); (!r_inlined_here && i!=block.body.end()); ++i) { insert_point = i; (*i)->visit(*this); @@ -227,6 +225,9 @@ void FunctionInliner::visit(Block &block) void FunctionInliner::visit(FunctionCall &call) { + if(r_inlined_here) + return; + for(NodeArray::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i) visit(*i); @@ -249,6 +250,7 @@ void FunctionInliner::visit(FunctionCall &call) /* Inlined variables need to be resolved before this function can be inlined further. */ inlineable.erase(current_function); + r_inlined_here = true; } } @@ -256,6 +258,7 @@ void FunctionInliner::visit(FunctionDeclaration &func) { SetForScope set_func(current_function, &func); TraversingVisitor::visit(func); + r_inlined_here = false; } void FunctionInliner::visit(Iteration &iter) diff --git a/source/glsl/optimize.h b/source/glsl/optimize.h index 16038806..5091b008 100644 --- a/source/glsl/optimize.h +++ b/source/glsl/optimize.h @@ -75,6 +75,7 @@ private: NodeList::iterator insert_point; RefPtr r_inline_result; bool r_any_inlined; + bool r_inlined_here; public: FunctionInliner(); -- 2.43.0