X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=db779d1b01bf4dc574fd6c564b06329287430443;hb=6592dca643d9ac5b99d6a43cae30554ac1e4df62;hp=7473fe2ca598ad996ee6c3263385f938986e80e2;hpb=c4ae3a80623be4b0f17de4a9cc25f0bedf2dbef5;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 7473fe2c..db779d1b 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -66,8 +66,7 @@ void InlineableFunctionLocator::visit(Return &ret) InlineContentInjector::InlineContentInjector(): source_func(0), - remap_names(false), - deps_only(false) + remap_names(0) { } const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList::iterator &ins_pt, FunctionDeclaration &src) @@ -90,9 +89,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(); @@ -115,7 +111,6 @@ void InlineContentInjector::visit(VariableReference &var) } else if(var.declaration) { - SetFlag set_deps(deps_only); if(!variable_map.count(var.name)) { dependencies.insert(var.declaration); @@ -129,7 +124,6 @@ void InlineContentInjector::visit(InterfaceBlockReference &iface) { if(!remap_names && iface.declaration) { - SetFlag set_deps(deps_only); dependencies.insert(iface.declaration); referenced_names.insert(iface.name); iface.declaration->visit(*this); @@ -161,7 +155,6 @@ void InlineContentInjector::visit(VariableDeclaration &var) } else if(var.type_declaration) { - SetFlag set_deps(deps_only); dependencies.insert(var.type_declaration); referenced_names.insert(var.type_declaration->name); var.type_declaration->visit(*this); @@ -190,7 +183,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 +212,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 +221,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 +246,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 +254,7 @@ void FunctionInliner::visit(FunctionDeclaration &func) { SetForScope set_func(current_function, &func); TraversingVisitor::visit(func); + r_inlined_here = false; } void FunctionInliner::visit(Iteration &iter)