X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=8f6b2745846b0a31e285a746dca714bfa3227332;hb=3a1fe83;hp=080bfd7c2705001a40fdf8b97abeb9401c4821bd;hpb=d2303923980a08cf6e429a9ce7359d3683c79251;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 080bfd7c..8f6b2745 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -452,6 +452,15 @@ void ExpressionInliner::visit(Assignment &assign) r_trivial = false; } +void ExpressionInliner::visit(TernaryExpression &ternary) +{ + visit_and_record(ternary.condition, ternary.oper, false); + visit_and_record(ternary.true_expr, ternary.oper, false); + visit_and_record(ternary.false_expr, ternary.oper, true); + r_oper = ternary.oper; + r_trivial = false; +} + void ExpressionInliner::visit(FunctionCall &call) { TraversingVisitor::visit(call); @@ -581,6 +590,12 @@ void UnusedTypeRemover::visit(BinaryExpression &binary) TraversingVisitor::visit(binary); } +void UnusedTypeRemover::visit(TernaryExpression &ternary) +{ + unused_nodes.erase(ternary.type); + TraversingVisitor::visit(ternary); +} + void UnusedTypeRemover::visit(FunctionCall &call) { unused_nodes.erase(call.type); @@ -728,6 +743,13 @@ void UnusedVariableRemover::visit(FunctionCall &call) /* Treat function calls as having side effects so expression statements consisting of nothing but a function call won't be optimized away. */ r_side_effects = true; + + if(stage->type==Stage::GEOMETRY && call.name=="EmitVertex") + { + for(map::const_iterator i=variables.begin(); i!=variables.end(); ++i) + if(i->second.output) + referenced(i->first, call); + } } void UnusedVariableRemover::record_assignment(const Assignment::Target &target, Node &node) @@ -802,29 +824,6 @@ void UnusedVariableRemover::visit(InterfaceBlock &iface) } } -void UnusedVariableRemover::visit(FunctionDeclaration &func) -{ - if(func.body.body.empty()) - return; - - BlockVariableMap saved_vars = variables; - // Assignments from other functions should not be visible. - for(BlockVariableMap::iterator i=variables.begin(); i!=variables.end(); ++i) - i->second.assignments.resize(i->second.initialized); - TraversingVisitor::visit(func); - swap(variables, saved_vars); - merge_variables(saved_vars); - - /* Always treat function parameters as referenced. Removing unused - parameters is not currently supported. */ - for(NodeArray::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) - { - BlockVariableMap::iterator j = variables.find(i->get()); - if(j!=variables.end()) - j->second.referenced = true; - } -} - void UnusedVariableRemover::merge_variables(const BlockVariableMap &other_vars) { for(BlockVariableMap::const_iterator i=other_vars.begin(); i!=other_vars.end(); ++i) @@ -848,6 +847,29 @@ void UnusedVariableRemover::merge_variables(const BlockVariableMap &other_vars) } } +void UnusedVariableRemover::visit(FunctionDeclaration &func) +{ + if(func.body.body.empty()) + return; + + BlockVariableMap saved_vars = variables; + // Assignments from other functions should not be visible. + for(BlockVariableMap::iterator i=variables.begin(); i!=variables.end(); ++i) + i->second.assignments.resize(i->second.initialized); + TraversingVisitor::visit(func); + swap(variables, saved_vars); + merge_variables(saved_vars); + + /* Always treat function parameters as referenced. Removing unused + parameters is not currently supported. */ + for(NodeArray::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) + { + BlockVariableMap::iterator j = variables.find(i->get()); + if(j!=variables.end()) + j->second.referenced = true; + } +} + void UnusedVariableRemover::visit(Conditional &cond) { cond.condition->visit(*this);