X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=668f7c5ef2553d399feef9c6c60949990fa54150;hp=db779d1b01bf4dc574fd6c564b06329287430443;hb=d5c38c181cac4da490c96123e5a88a8c06785e55;hpb=6592dca643d9ac5b99d6a43cae30554ac1e4df62 diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index db779d1b..668f7c5e 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -71,12 +71,10 @@ InlineContentInjector::InlineContentInjector(): const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList::iterator &ins_pt, FunctionDeclaration &src) { - target_block = &tgt_blk; + staging_block.parent = &tgt_blk; source_func = &src; remap_prefix = source_func->name; - vector > inlined; - inlined.reserve(src.body.body.size()); for(NodeList::iterator i=src.body.body.begin(); i!=src.body.body.end(); ++i) { r_inlined_statement = 0; @@ -86,15 +84,15 @@ const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &ta SetForScope set_remap(remap_names, 2); r_inlined_statement->visit(*this); - inlined.push_back(r_inlined_statement); + staging_block.body.push_back(r_inlined_statement); } SetForScope set_remap(remap_names, 1); SetForScope set_prefix(remap_prefix, target_func.name); - variable_map.clear(); + staging_block.variables.clear(); target_func.visit(*this); - tgt_blk.body.insert(ins_pt, inlined.begin(), inlined.end()); + tgt_blk.body.splice(ins_pt, staging_block.body); NodeReorderer().apply(stage, target_func, dependencies); @@ -105,13 +103,13 @@ void InlineContentInjector::visit(VariableReference &var) { if(remap_names) { - map::const_iterator i = variable_map.find(var.name); - if(i!=variable_map.end()) + map::const_iterator i = staging_block.variables.find(var.name); + if(i!=staging_block.variables.end()) var.name = i->second->name; } else if(var.declaration) { - if(!variable_map.count(var.name)) + if(!staging_block.variables.count(var.name)) { dependencies.insert(var.declaration); referenced_names.insert(var.name); @@ -148,8 +146,10 @@ void InlineContentInjector::visit(VariableDeclaration &var) { if(remap_names==2 || referenced_names.count(var.name)) { - string mapped_name = get_unused_variable_name(*target_block, var.name, remap_prefix); - variable_map[var.name] = &var; + string mapped_name = get_unused_variable_name(staging_block, var.name, remap_prefix); + staging_block.variables[var.name] = &var; + if(mapped_name!=var.name) + staging_block.variables[mapped_name] = &var; var.name = mapped_name; } } @@ -169,7 +169,7 @@ void InlineContentInjector::visit(Return &ret) { /* Create a new variable to hold the return value of the inlined function. */ - r_result_name = get_unused_variable_name(*target_block, "_return", source_func->name); + r_result_name = get_unused_variable_name(staging_block, "_return", source_func->name); RefPtr var = new VariableDeclaration; var->source = ret.source; var->line = ret.line;