X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=6c49878b857603152d742383ab4fd1f611e6c1ac;hb=499c0515cde44b304d131ac7ac3b2030c9dbe11c;hp=7473fe2ca598ad996ee6c3263385f938986e80e2;hpb=c4ae3a80623be4b0f17de4a9cc25f0bedf2dbef5;p=libs%2Fgl.git 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)