X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=064d217e7da7b9b47f2c90dbab59a8f5006f9a77;hb=9971979;hp=3707e4eda2cabc902397f0d9a344950462f24fcc;hpb=48fa4e32b654aa1f2107caf266c3bdda9cc74847;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 3707e4ed..064d217e 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -8,10 +8,6 @@ namespace Msp { namespace GL { namespace SL { -DeclarationCombiner::DeclarationCombiner(): - toplevel(true) -{ } - void DeclarationCombiner::apply(Stage &stage) { visit(stage.content); @@ -20,10 +16,9 @@ void DeclarationCombiner::apply(Stage &stage) void DeclarationCombiner::visit(Block &block) { - if(!toplevel) + if(current_block) return; - SetForScope set(toplevel, false); TraversingVisitor::visit(block); } @@ -77,8 +72,20 @@ void DeclarationCombiner::visit(VariableDeclaration &var) } +void BlockResolver::visit(Block &block) +{ + block.parent = current_block; + TraversingVisitor::visit(block); +} + +void BlockResolver::visit(InterfaceBlock &iface) +{ + iface.members.anonymous = true; + TraversingVisitor::visit(iface); +} + + VariableResolver::VariableResolver(): - anonymous(false), record_target(false), assignment_target(0), self_referencing(false) @@ -86,34 +93,32 @@ VariableResolver::VariableResolver(): void VariableResolver::apply(Stage &stage) { - Stage *builtins = get_builtins(stage.type); - if(builtins) - blocks.push_back(&builtins->content); + Stage *builtin_stage = get_builtins(stage.type); + builtins = (builtin_stage ? &builtin_stage->content : 0); visit(stage.content); - if(builtins) - blocks.pop_back(); +} + +Block *VariableResolver::next_block(Block &block) +{ + return block.parent ? block.parent : &block!=builtins ? builtins : 0; } void VariableResolver::visit(Block &block) { - if(!blocks.empty() && blocks.back()==&block) - return TraversingVisitor::visit(block); + if(current_block!=&block) + block.variables.clear(); - blocks.push_back(&block); - block.variables.clear(); TraversingVisitor::visit(block); - blocks.pop_back(); } void VariableResolver::visit(VariableReference &var) { var.declaration = 0; type = 0; - for(vector::iterator i=blocks.end(); i!=blocks.begin(); ) + for(Block *block=current_block; block; block=next_block(*block)) { - --i; - map::iterator j = (*i)->variables.find(var.name); - if(j!=(*i)->variables.end()) + map::iterator j = block->variables.find(var.name); + if(j!=block->variables.end()) { var.declaration = j->second; type = j->second->type_declaration; @@ -189,16 +194,15 @@ void VariableResolver::visit(Assignment &assign) void VariableResolver::visit(StructDeclaration &strct) { TraversingVisitor::visit(strct); - blocks.back()->types[strct.name] = &strct; + current_block->types[strct.name] = &strct; } void VariableResolver::visit(VariableDeclaration &var) { - for(vector::iterator i=blocks.end(); i!=blocks.begin(); ) + for(Block *block=current_block; block; block=next_block(*block)) { - --i; - map::iterator j = (*i)->types.find(var.type); - if(j!=(*i)->types.end()) + map::iterator j = block->types.find(var.type); + if(j!=block->types.end()) var.type_declaration = j->second; } @@ -206,32 +210,29 @@ void VariableResolver::visit(VariableDeclaration &var) var.interface = block_interface; TraversingVisitor::visit(var); - blocks.back()->variables[var.name] = &var; - if(anonymous && blocks.size()>1) - blocks[blocks.size()-2]->variables[var.name] = &var; + current_block->variables[var.name] = &var; + if(current_block->anonymous && current_block->parent) + current_block->parent->variables[var.name] = &var; } void VariableResolver::visit(InterfaceBlock &iface) { - SetFlag set(anonymous); - SetForScope set2(block_interface, iface.interface); + SetForScope set_iface(block_interface, iface.interface); TraversingVisitor::visit(iface); } void VariableResolver::visit(FunctionDeclaration &func) { - blocks.push_back(&func.body); + SetForScope set_block(current_block, &func.body); func.body.variables.clear(); TraversingVisitor::visit(func); - blocks.pop_back(); } void VariableResolver::visit(Iteration &iter) { - blocks.push_back(&iter.body); + SetForScope set_block(current_block, &iter.body); iter.body.variables.clear(); TraversingVisitor::visit(iter); - blocks.pop_back(); } @@ -264,9 +265,7 @@ void FunctionResolver::visit(FunctionDeclaration &func) InterfaceGenerator::InterfaceGenerator(): - stage(0), - scope_level(0), - current_block(0) + stage(0) { } string InterfaceGenerator::get_out_prefix(Stage::Type type) @@ -291,12 +290,11 @@ void InterfaceGenerator::apply(Stage &s) void InterfaceGenerator::visit(Block &block) { - SetForScope set(scope_level, scope_level+1); SetForScope set_block(current_block, &block); for(NodeList::iterator i=block.body.begin(); i!=block.body.end(); ++i) { assignment_insert_point = i; - if(scope_level==1) + if(&block==&stage->content) iface_insert_point = i; (*i)->visit(*this); @@ -331,7 +329,6 @@ bool InterfaceGenerator::generate_interface(VariableDeclaration &var, const stri iface_var->linked_declaration = &var; stage->content.body.insert(iface_insert_point, iface_var); { - SetForScope set_level(scope_level, 1); SetForScope set_block(current_block, &stage->content); iface_var->visit(*this); } @@ -376,7 +373,7 @@ void InterfaceGenerator::visit(VariableDeclaration &var) { if(var.interface=="out") { - if(scope_level==1) + if(current_block==&stage->content) stage->out_variables[var.name] = &var; else if(generate_interface(var, "out", change_prefix(var.name, string()))) { @@ -474,7 +471,6 @@ void InterfaceGenerator::visit(Passthrough &pass) DeclarationReorderer::DeclarationReorderer(): - scope_level(0), kind(NO_DECLARATION) { } @@ -489,8 +485,7 @@ void DeclarationReorderer::visit(FunctionCall &call) void DeclarationReorderer::visit(Block &block) { - SetForScope set(scope_level, scope_level+1); - if(scope_level>1) + if(block.parent) return TraversingVisitor::visit(block); NodeList::iterator struct_insert_point = block.body.end();