X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fglsl%2Foptimize.cpp;h=1aad8d1b311adcecf27904b8e29efb49892d98a6;hb=caa84a9d8adce6dc702f6e0ae32961b77a0a73ea;hp=0af24e3e8f88df55e0d449e0044f6007fafe0275;hpb=0c07531f8ec779edde9ebe765b3cd79a6960b838;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 0af24e3e..1aad8d1b 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -622,6 +622,68 @@ UnusedVariableRemover::VariableInfo::VariableInfo(): { } +bool UnusedTypeRemover::apply(Stage &stage) +{ + stage.content.visit(*this); + NodeRemover().apply(stage, unused_nodes); + 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) + unused_nodes.erase(type.base_type); + unused_nodes.insert(&type); +} + +void UnusedTypeRemover::visit(ImageTypeDeclaration &type) +{ + if(type.base_type) + unused_nodes.erase(type.base_type); + unused_nodes.insert(&type); +} + +void UnusedTypeRemover::visit(StructDeclaration &strct) +{ + unused_nodes.insert(&strct); + TraversingVisitor::visit(strct); +} + +void UnusedTypeRemover::visit(VariableDeclaration &var) +{ + unused_nodes.erase(var.type_declaration); +} + +void UnusedTypeRemover::visit(FunctionDeclaration &func) +{ + unused_nodes.erase(func.return_type_declaration); + TraversingVisitor::visit(func); +} + + UnusedVariableRemover::UnusedVariableRemover(): aggregate(0), r_assignment(0), @@ -678,7 +740,8 @@ void UnusedVariableRemover::visit(InterfaceBlockReference &iface) void UnusedVariableRemover::visit(MemberAccess &memacc) { - r_assign_to_subfield = true; + if(assignment_target) + r_assign_to_subfield = true; TraversingVisitor::visit(memacc); unused_nodes.erase(memacc.declaration); } @@ -759,7 +822,6 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr) void UnusedVariableRemover::visit(StructDeclaration &strct) { SetForScope set(aggregate, &strct); - unused_nodes.insert(&strct); TraversingVisitor::visit(strct); } @@ -773,7 +835,6 @@ void UnusedVariableRemover::visit(VariableDeclaration &var) if(var.init_expression) record_assignment(var, *var.init_expression, false); } - unused_nodes.erase(var.type_declaration); TraversingVisitor::visit(var); }