X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=b1201e9fb84cec84c8a7236121963f982cfa43cb;hp=0139ec5fbec94d4f1c47493549914d8977b2af8e;hb=83186c4a01ada8bfb0199c4396c0aaa64631577f;hpb=bb386d895f5fce2f0099886fdf7e7073b18246e8 diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 0139ec5f..b1201e9f 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -1056,7 +1056,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 +1101,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 +1125,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