X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=c1431f2b6e9d9e33ed522cd853bcd326bbb3414a;hb=041ba4b1acd55337239c5ce24cc310118c621206;hp=137bd94343190f275eebbaa877dfa554b4785a50;hpb=dda547f94e4aff590592908b38ca1e78c2c24b08;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 137bd943..c1431f2b 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -202,6 +202,7 @@ void FunctionInliner::visit_and_inline(RefPtr &ptr) ptr = r_inline_result; r_any_inlined = true; } + r_inline_result = 0; } void FunctionInliner::visit(Block &block) @@ -218,20 +219,17 @@ void FunctionInliner::visit(Block &block) void FunctionInliner::visit(UnaryExpression &unary) { visit_and_inline(unary.expression); - r_inline_result = 0; } void FunctionInliner::visit(BinaryExpression &binary) { visit_and_inline(binary.left); visit_and_inline(binary.right); - r_inline_result = 0; } void FunctionInliner::visit(MemberAccess &memacc) { visit_and_inline(memacc.left); - r_inline_result = 0; } void FunctionInliner::visit(FunctionCall &call) @@ -259,8 +257,6 @@ void FunctionInliner::visit(FunctionCall &call) inlined further. */ inlineable.erase(current_function); } - else - r_inline_result = 0; } void FunctionInliner::visit(ExpressionStatement &expr) @@ -272,7 +268,6 @@ void FunctionInliner::visit(VariableDeclaration &var) { if(var.init_expression) visit_and_inline(var.init_expression); - r_inline_result = 0; } void FunctionInliner::visit(FunctionDeclaration &func) @@ -364,6 +359,7 @@ void ExpressionInliner::visit_and_record(RefPtr &ptr, const Operator r_ref_info->inline_on_rhs = on_rhs; } } + r_ref_info = 0; } void ExpressionInliner::inline_expression(Expression &expr, RefPtr &ptr, const Operator *outer_oper, const Operator *inner_oper, bool on_rhs) @@ -439,7 +435,6 @@ void ExpressionInliner::visit(VariableReference &var) void ExpressionInliner::visit(MemberAccess &memacc) { visit_and_record(memacc.left, memacc.oper, false); - r_ref_info = 0; r_oper = memacc.oper; r_trivial = false; } @@ -448,7 +443,6 @@ void ExpressionInliner::visit(UnaryExpression &unary) { SetFlag set_target(mutating, mutating || unary.oper->token[1]=='+' || unary.oper->token[1]=='-'); visit_and_record(unary.expression, unary.oper, false); - r_ref_info = 0; r_oper = unary.oper; r_trivial = false; } @@ -460,7 +454,6 @@ void ExpressionInliner::visit(BinaryExpression &binary) SetFlag clear_target(mutating, false); visit_and_record(binary.right, binary.oper, true); } - r_ref_info = 0; r_oper = binary.oper; r_trivial = false; } @@ -489,7 +482,6 @@ void ExpressionInliner::visit(Assignment &assign) } } - r_ref_info = 0; r_oper = assign.oper; r_trivial = false; } @@ -498,7 +490,6 @@ void ExpressionInliner::visit(FunctionCall &call) { for(NodeArray::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i) visit_and_record(*i, 0, false); - r_ref_info = 0; r_oper = 0; r_trivial = false; } @@ -622,6 +613,73 @@ UnusedVariableRemover::VariableInfo::VariableInfo(): { } +bool UnusedTypeRemover::apply(Stage &stage) +{ + stage.content.visit(*this); + NodeRemover().apply(stage, unused_nodes); + return !unused_nodes.empty(); +} + +void UnusedTypeRemover::visit(Literal &literal) +{ + unused_nodes.erase(literal.type); +} + +void UnusedTypeRemover::visit(UnaryExpression &unary) +{ + unused_nodes.erase(unary.type); + TraversingVisitor::visit(unary); +} + +void UnusedTypeRemover::visit(BinaryExpression &binary) +{ + unused_nodes.erase(binary.type); + TraversingVisitor::visit(binary); +} + +void UnusedTypeRemover::visit(FunctionCall &call) +{ + unused_nodes.erase(call.type); + TraversingVisitor::visit(call); +} + +void UnusedTypeRemover::visit(BasicTypeDeclaration &type) +{ + if(type.base_type) + unused_nodes.erase(type.base_type); + unused_nodes.insert(&type); +} + +void UnusedTypeRemover::visit(ImageTypeDeclaration &type) +{ + if(type.base_type) + unused_nodes.erase(type.base_type); + unused_nodes.insert(&type); +} + +void UnusedTypeRemover::visit(StructDeclaration &strct) +{ + unused_nodes.insert(&strct); + TraversingVisitor::visit(strct); +} + +void UnusedTypeRemover::visit(VariableDeclaration &var) +{ + unused_nodes.erase(var.type_declaration); +} + +void UnusedTypeRemover::visit(InterfaceBlock &iface) +{ + unused_nodes.erase(iface.type_declaration); +} + +void UnusedTypeRemover::visit(FunctionDeclaration &func) +{ + unused_nodes.erase(func.return_type_declaration); + TraversingVisitor::visit(func); +} + + UnusedVariableRemover::UnusedVariableRemover(): aggregate(0), r_assignment(0), @@ -637,9 +695,19 @@ bool UnusedVariableRemover::apply(Stage &stage) BlockVariableMap &global_variables = variables.back(); for(BlockVariableMap::iterator i=global_variables.begin(); i!=global_variables.end(); ++i) { + string interface = i->first->interface; + bool linked = i->first->linked_declaration; + map::iterator j = aggregates.find(i->first); + if(j!=aggregates.end()) + if(InterfaceBlock *iface = dynamic_cast(j->second)) + { + interface = iface->interface; + linked = iface->linked_block; + } + /* Don't remove output variables which are used by the next stage or the graphics API. */ - if(i->first->interface=="out" && (stage.type==Stage::FRAGMENT || i->first->linked_declaration || !i->first->name.compare(0, 3, "gl_"))) + if(interface=="out" && (stage.type==Stage::FRAGMENT || linked || !i->first->name.compare(0, 3, "gl_"))) continue; // Mark other unreferenced global variables as unused. @@ -760,7 +828,6 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr) void UnusedVariableRemover::visit(StructDeclaration &strct) { SetForScope set(aggregate, &strct); - unused_nodes.insert(&strct); TraversingVisitor::visit(strct); } @@ -774,7 +841,6 @@ void UnusedVariableRemover::visit(VariableDeclaration &var) if(var.init_expression) record_assignment(var, *var.init_expression, false); } - unused_nodes.erase(var.type_declaration); TraversingVisitor::visit(var); } @@ -782,7 +848,7 @@ void UnusedVariableRemover::visit(InterfaceBlock &iface) { SetForScope set(aggregate, &iface); unused_nodes.insert(&iface); - TraversingVisitor::visit(iface); + iface.struct_declaration->members.visit(*this); } void UnusedVariableRemover::visit(FunctionDeclaration &func)