| // | |
| // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| #include "compiler/intermediate.h" | |
| class TAliveTraverser : public TIntermTraverser { | |
| public: | |
| TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q) | |
| { | |
| } | |
| bool wasFound() { return found; } | |
| protected: | |
| bool found; | |
| TQualifier qualifier; | |
| void visitSymbol(TIntermSymbol*); | |
| bool visitSelection(Visit, TIntermSelection*); | |
| }; | |
| // | |
| // Report whether or not a variable of the given qualifier type | |
| // is guaranteed written. Not always possible to determine if | |
| // it is written conditionally. | |
| // | |
| // ?? It does not do this well yet, this is just a place holder | |
| // that simply determines if it was reference at all, anywhere. | |
| // | |
| bool QualifierWritten(TIntermNode* node, TQualifier qualifier) | |
| { | |
| TAliveTraverser it(qualifier); | |
| if (node) | |
| node->traverse(&it); | |
| return it.wasFound(); | |
| } | |
| void TAliveTraverser::visitSymbol(TIntermSymbol* node) | |
| { | |
| // | |
| // If it's what we're looking for, record it. | |
| // | |
| if (node->getQualifier() == qualifier) | |
| found = true; | |
| } | |
| bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node) | |
| { | |
| if (wasFound()) | |
| return false; | |
| return true; | |
| } |