X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=f938314814ea9cd4211279d5e94ff817c2a92fcc;hb=cb8ee1f5ea24a5f7b561fc88d4ff5af3ae364038;hp=137bd94343190f275eebbaa877dfa554b4785a50;hpb=dda547f94e4aff590592908b38ca1e78c2c24b08;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 137bd943..f9383148 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,68 @@ 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(FunctionDeclaration &func) +{ + unused_nodes.erase(func.return_type_declaration); + TraversingVisitor::visit(func); +} + + UnusedVariableRemover::UnusedVariableRemover(): aggregate(0), r_assignment(0), @@ -760,7 +813,6 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr) void UnusedVariableRemover::visit(StructDeclaration &strct) { SetForScope set(aggregate, &strct); - unused_nodes.insert(&strct); TraversingVisitor::visit(strct); } @@ -774,7 +826,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); }