X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=40d1c26f97f5f4886c2c3db4d28c9627aa499eb6;hp=2215f8335cd06a23ea71e2c381cb1776362b81cd;hb=518f751d385b733adbf43fe4056403740709edec;hpb=f7b29fcfe408965c9cba79095eb05c49eca4a98e diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 2215f833..40d1c26f 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -39,14 +39,54 @@ void InlineableFunctionLocator::visit(FunctionDeclaration &func) } +void InlineDependencyCollector::visit(VariableReference &var) +{ + if(var.declaration) + { + dependencies.insert(var.declaration); + var.declaration->visit(*this); + } +} + +void InlineDependencyCollector::visit(InterfaceBlockReference &iface) +{ + if(iface.declaration) + { + dependencies.insert(iface.declaration); + iface.declaration->visit(*this); + } +} + +void InlineDependencyCollector::visit(FunctionCall &call) +{ + if(call.declaration) + dependencies.insert(call.declaration); + TraversingVisitor::visit(call); +} + +void InlineDependencyCollector::visit(VariableDeclaration &var) +{ + if(var.type_declaration) + { + dependencies.insert(var.type_declaration); + var.type_declaration->visit(*this); + } +} + + FunctionInliner::FunctionInliner(): - extract_result(0) + current_function(0), + extract_result(0), + any_inlined(false) { } -void FunctionInliner::apply(Stage &stage) +bool FunctionInliner::apply(Stage &s) { - inlineable = InlineableFunctionLocator().apply(stage); - stage.content.visit(*this); + stage = &s; + inlineable = InlineableFunctionLocator().apply(s); + any_inlined = false; + s.content.visit(*this); + return any_inlined; } void FunctionInliner::visit_and_inline(RefPtr &ptr) @@ -54,7 +94,10 @@ void FunctionInliner::visit_and_inline(RefPtr &ptr) inline_result = 0; ptr->visit(*this); if(inline_result) + { ptr = inline_result; + any_inlined = true; + } } void FunctionInliner::visit(Block &block) @@ -102,6 +145,9 @@ void FunctionInliner::visit(FunctionCall &call) { extract_result = 2; def->visit(*this); + + if(inline_result) + NodeReorderer().apply(*stage, *current_function, InlineDependencyCollector().apply(*def)); } else inline_result = 0; @@ -114,6 +160,12 @@ void FunctionInliner::visit(VariableDeclaration &var) inline_result = 0; } +void FunctionInliner::visit(FunctionDeclaration &func) +{ + SetForScope set_func(current_function, &func); + TraversingVisitor::visit(func); +} + void FunctionInliner::visit(Return &ret) { TraversingVisitor::visit(ret);