X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=f938314814ea9cd4211279d5e94ff817c2a92fcc;hb=cb8ee1f5ea24a5f7b561fc88d4ff5af3ae364038;hp=9d9464e4107869b758ca5e0fe8b15e09973bd47c;hpb=ff00056daddbce2e6e16f7c09dcfcb5cde66e85c;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 9d9464e4..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; } @@ -629,6 +620,29 @@ bool UnusedTypeRemover::apply(Stage &stage) 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) @@ -646,6 +660,7 @@ void UnusedTypeRemover::visit(ImageTypeDeclaration &type) void UnusedTypeRemover::visit(StructDeclaration &strct) { unused_nodes.insert(&strct); + TraversingVisitor::visit(strct); } void UnusedTypeRemover::visit(VariableDeclaration &var)