From: Mikko Rasa Date: Tue, 16 Mar 2021 09:38:55 +0000 (+0200) Subject: Don't modify the target block's variable map from InlineContentInjector X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=499c0515cde44b304d131ac7ac3b2030c9dbe11c 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. --- 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();