X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=16e43a9e44c6d689a13f92f8655e0b258bb0d5e8;hb=5613516c5724ec9ad25b1e08d9c4d4ea1ab3f329;hp=0139ec5fbec94d4f1c47493549914d8977b2af8e;hpb=91e65bc9e24a6889995081035f6f6f0a78a6c20e;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 0139ec5f..16e43a9e 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -646,8 +646,8 @@ void ConstantFolder::visit(RefPtr &expr) literal->token = lexical_cast(r_constant_value.value())+"u"; else if(r_constant_value.check_type()) { - literal->token = lexical_cast(r_constant_value.value()); - if(isnumrc(literal->token)) + literal->token = lexical_cast(r_constant_value.value(), Fmt().precision(8)); + if(literal->token.find('.')==string::npos && literal->token.find('e')==string::npos) literal->token += ".0"; } else @@ -657,6 +657,7 @@ void ConstantFolder::visit(RefPtr &expr) } literal->value = r_constant_value; expr = literal; + r_any_folded = true; } void ConstantFolder::visit(Literal &literal) @@ -1056,7 +1057,8 @@ UnusedVariableRemover::UnusedVariableRemover(): assignment_target(false), r_side_effects(false), in_struct(false), - composite_reference(false) + composite_reference(false), + in_loop(0) { } bool UnusedVariableRemover::apply(Stage &s) @@ -1100,6 +1102,7 @@ void UnusedVariableRemover::referenced(const Assignment::Target &target, Node &n var_info.referenced = true; if(!assignment_target) { + bool loop_external = false; for(vector::const_iterator i=var_info.assignments.begin(); i!=var_info.assignments.end(); ++i) { bool covered = true; @@ -1123,9 +1126,17 @@ void UnusedVariableRemover::referenced(const Assignment::Target &target, Node &n else covered = ((*i)->target.chain[j]==target.chain[j]); } + if(covered) + { (*i)->used_by.push_back(&node); + if((*i)->in_loop saved_refs; + swap(loop_ext_refs, saved_refs); + { + SetForScope set_loop(in_loop, in_loop+1); + TraversingVisitor::visit(iter); + } + swap(loop_ext_refs, saved_refs); + + /* Visit the external references of the loop again to record assignments + done in the loop as used. */ + for(vector::const_iterator i=saved_refs.begin(); i!=saved_refs.end(); ++i) + (*i)->visit(*this); /* Merge assignments from the iteration, without clearing previous state. Further analysis is needed to determine which parts of the iteration body