X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=ec51c19cdd9cc90472a0b2471eff915823fae0d7;hp=92d172c586469f78cd17c5d338700fc68e503c00;hb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;hpb=c1b42fd479c5ca4cbab258ee0fa5c7cac319f928 diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 92d172c5..ec51c19c 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -1,3 +1,4 @@ +#include #include #include #include "generate.h" @@ -10,23 +11,18 @@ namespace SL { void ConstantIdAssigner::apply(Module &module, const Features &features) { - for(list::iterator i=module.stages.begin(); i!=module.stages.end(); ++i) - i->content.visit(*this); + for(Stage &s: module.stages) + s.content.visit(*this); - unsigned max_id = features.max_constant_id; - for(vector::iterator i=auto_constants.begin(); i!=auto_constants.end(); ++i) + for(VariableDeclaration *v: auto_constants) { - unsigned id = hash32((*i)->name)%(max_id+1); + unsigned id = hash32(v->name)%features.constant_id_range; while(used_ids.count(id)) - ++id; + id = (id+1)%features.constant_id_range; - vector &qualifiers = (*i)->layout->qualifiers; - for(vector::iterator j=qualifiers.begin(); j!=qualifiers.end(); ++j) - if(j->name=="constant_id") - { - j->value = id; - break; - } + auto i = find_member(v->layout->qualifiers, string("constant_id"), &Layout::Qualifier::name); + if(i!=v->layout->qualifiers.end()) + i->value = id; used_ids.insert(id); } @@ -36,27 +32,18 @@ void ConstantIdAssigner::visit(VariableDeclaration &var) { if(var.layout) { - vector &qualifiers = var.layout->qualifiers; - for(vector::iterator i=qualifiers.begin(); i!=qualifiers.end(); ++i) - if(i->name=="constant_id" && i->has_value) - { - if(i->value==-1) - auto_constants.push_back(&var); - else - used_ids.insert(i->value); - break; - } + auto i = find_member(var.layout->qualifiers, string("constant_id"), &Layout::Qualifier::name); + if(i!=var.layout->qualifiers.end() && i->has_value) + { + if(i->value==-1) + auto_constants.push_back(&var); + else + used_ids.insert(i->value); + } } } -InterfaceGenerator::InterfaceGenerator(): - stage(0), - function_scope(false), - copy_block(false), - iface_target_block(0) -{ } - string InterfaceGenerator::get_out_prefix(Stage::Type type) { if(type==Stage::VERTEX) @@ -81,7 +68,7 @@ void InterfaceGenerator::apply(Stage &s) void InterfaceGenerator::visit(Block &block) { SetForScope set_block(current_block, &block); - for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) + for(auto i=block.body.begin(); i!=block.body.end(); ++i) { assignment_insert_point = i; if(&block==&stage->content) @@ -135,7 +122,7 @@ VariableDeclaration *InterfaceGenerator::generate_interface(VariableDeclaration InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block) { - if(stage->interface_blocks.count("in"+out_block.block_name)) + if(stage->interface_blocks.count("in "+out_block.block_name)) return 0; InterfaceBlock *in_block = new InterfaceBlock; @@ -161,9 +148,9 @@ InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block } iface_target_block->body.insert(iface_insert_point, in_block); - stage->interface_blocks.insert(make_pair("in"+in_block->block_name, in_block)); + stage->interface_blocks.insert(make_pair("in "+in_block->block_name, in_block)); if(!in_block->instance_name.empty()) - stage->interface_blocks.insert(make_pair("_"+in_block->instance_name, in_block)); + stage->interface_blocks.insert(make_pair(in_block->instance_name, in_block)); SetFlag set_scope(function_scope, false); SetForScope set_block(current_block, &stage->content); @@ -199,7 +186,7 @@ void InterfaceGenerator::visit(VariableReference &var) return; const map &prev_vars = stage->previous->content.variables; - map::const_iterator i = prev_vars.find(var.name); + auto i = prev_vars.find(var.name); if(i==prev_vars.end() || i->second->interface!="out") i = prev_vars.find(in_prefix+var.name); if(i!=prev_vars.end() && i->second->interface=="out") @@ -216,7 +203,7 @@ void InterfaceGenerator::visit(VariableReference &var) } const map &prev_blocks = stage->previous->interface_blocks; - map::const_iterator j = prev_blocks.find("_"+var.name); + auto j = prev_blocks.find(var.name); if(j!=prev_blocks.end() && j->second->interface=="out") { generate_interface(*j->second); @@ -225,14 +212,14 @@ void InterfaceGenerator::visit(VariableReference &var) return; } - for(j=prev_blocks.begin(); j!=prev_blocks.end(); ++j) - if(j->second->instance_name.empty() && j->second->struct_declaration) + for(const auto &kvp: prev_blocks) + if(kvp.second->instance_name.empty() && kvp.second->struct_declaration) { - const map &iface_vars = j->second->struct_declaration->members.variables; + const map &iface_vars = kvp.second->struct_declaration->members.variables; i = iface_vars.find(var.name); if(i!=iface_vars.end()) { - generate_interface(*j->second); + generate_interface(*kvp.second); return; } } @@ -271,7 +258,7 @@ void InterfaceGenerator::visit(VariableDeclaration &var) if(!var.linked_declaration && stage->previous) { const map &prev_vars = stage->previous->content.variables; - map::const_iterator i = prev_vars.find(var.name); + auto i = prev_vars.find(var.name); if(i!=prev_vars.end() && i->second->interface=="out") { var.linked_declaration = i->second; @@ -292,7 +279,7 @@ void InterfaceGenerator::visit(InterfaceBlock &iface) if(!iface.linked_block && stage->previous) { const map &prev_blocks = stage->previous->interface_blocks; - map::const_iterator i = prev_blocks.find("out"+iface.block_name); + auto i = prev_blocks.find("out "+iface.block_name); if(i!=prev_blocks.end()) { iface.linked_block = i->second; @@ -318,16 +305,15 @@ void InterfaceGenerator::visit(Passthrough &pass) if(stage->previous) { - const map &prev_vars = stage->previous->content.variables; - for(map::const_iterator i=prev_vars.begin(); i!=prev_vars.end(); ++i) + for(const auto &kvp: stage->previous->content.variables) { - if(i->second->interface!="out") + if(kvp.second->interface!="out") continue; /* Pass through output variables from the previous stage, but only those which are not already linked to an input here. */ - if(!i->second->linked_declaration && generate_interface(*i->second, "in", i->second->name)) - pass_vars.push_back(i->second); + if(!kvp.second->linked_declaration && generate_interface(*kvp.second, "in", kvp.second->name)) + pass_vars.push_back(kvp.second); } } @@ -350,13 +336,13 @@ void InterfaceGenerator::visit(Passthrough &pass) insert_assignment("gl_Position", memacc); } - for(vector::const_iterator i=pass_vars.begin(); i!=pass_vars.end(); ++i) + for(VariableDeclaration *v: pass_vars) { - string out_name = change_prefix((*i)->name, out_prefix); - generate_interface(**i, "out", out_name); + string out_name = change_prefix(v->name, out_prefix); + generate_interface(*v, "out", out_name); VariableReference *ref = new VariableReference; - ref->name = (*i)->name; + ref->name = v->name; if(pass.subscript) { BinaryExpression *subscript = new BinaryExpression;