X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=a7f29a16f8991c6342b6e3dcc1de6882da695a7b;hb=c849969d056972dd976cfa616363f1bc8cbc6291;hp=a8ff44a50e44fa94b8eb3d799f3ec1d64eb22988;hpb=c43203c52410ee8a734e775e7ee7368a12f82ff7;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index a8ff44a5..a7f29a16 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -1260,15 +1260,15 @@ bool UnusedVariableRemover::apply(Stage &s) for(const auto &kvp: variables) { - if(kvp.second.output) + if(!kvp.second.referenced) + unused_nodes.insert(kvp.first); + else if(kvp.second.output) { /* The last visible assignments of output variables are used by the next stage or the API. */ for(AssignmentInfo *a: kvp.second.assignments) unused_nodes.erase(a->node); } - else if(!kvp.second.referenced) - unused_nodes.insert(kvp.first); } NodeRemover().apply(s, unused_nodes); @@ -1284,36 +1284,12 @@ void UnusedVariableRemover::referenced(const Assignment::Target &target, Node &n { bool loop_external = false; for(AssignmentInfo *a: var_info.assignments) - { - bool covered = true; - for(unsigned j=0; (covered && jtarget.chain_len && j(a->target.chain[j]&0xC0); - Assignment::Target::ChainType type2 = static_cast(target.chain[j]&0xC0); - unsigned index1 = a->target.chain[j]&0x3F; - unsigned index2 = target.chain[j]&0x3F; - if(type1==Assignment::Target::SWIZZLE || type2==Assignment::Target::SWIZZLE) - { - if(type1==Assignment::Target::SWIZZLE && type2==Assignment::Target::SWIZZLE) - covered = index1&index2; - else if(type1==Assignment::Target::ARRAY && index1<4) - covered = index2&(1<target, target)) { a->used_by.push_back(&node); if(a->in_loop clear_reference(r_reference, Assignment::Target()); binary.right->visit(*this); } @@ -1490,6 +1467,10 @@ void UnusedVariableRemover::visit(VariableDeclaration &var) graphics API. */ var_info.output = (var.interface=="out" && (stage->type==Stage::FRAGMENT || var.linked_declaration || !var.name.compare(0, 3, "gl_"))); + // Linked outputs are automatically referenced. + if(var_info.output && var.linked_declaration) + var_info.referenced = true; + if(var.init_expression) { var_info.initialized = true; @@ -1569,8 +1550,14 @@ void UnusedVariableRemover::visit(Iteration &iter) vector saved_refs; swap(loop_ext_refs, saved_refs); { + if(iter.init_statement) + iter.init_statement->visit(*this); SetForScope set_loop(in_loop, in_loop+1); - TraversingVisitor::visit(iter); + if(iter.condition) + iter.condition->visit(*this); + iter.body.visit(*this); + if(iter.loop_expression) + iter.loop_expression->visit(*this); } swap(loop_ext_refs, saved_refs);