diff options
Diffstat (limited to 'src/3rdparty/angle/src/compiler/DetectDiscontinuity.cpp')
-rw-r--r-- | src/3rdparty/angle/src/compiler/DetectDiscontinuity.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/3rdparty/angle/src/compiler/DetectDiscontinuity.cpp b/src/3rdparty/angle/src/compiler/DetectDiscontinuity.cpp index 472232a75d..7c3b68a0b3 100644 --- a/src/3rdparty/angle/src/compiler/DetectDiscontinuity.cpp +++ b/src/3rdparty/angle/src/compiler/DetectDiscontinuity.cpp @@ -16,11 +16,26 @@ namespace sh { bool DetectLoopDiscontinuity::traverse(TIntermNode *node) { + mLoopDepth = 0; mLoopDiscontinuity = false; node->traverse(this); return mLoopDiscontinuity; } +bool DetectLoopDiscontinuity::visitLoop(Visit visit, TIntermLoop *loop) +{ + if (visit == PreVisit) + { + ++mLoopDepth; + } + else if (visit == PostVisit) + { + --mLoopDepth; + } + + return true; +} + bool DetectLoopDiscontinuity::visitBranch(Visit visit, TIntermBranch *node) { if (mLoopDiscontinuity) @@ -28,14 +43,19 @@ bool DetectLoopDiscontinuity::visitBranch(Visit visit, TIntermBranch *node) return false; } + if (!mLoopDepth) + { + return true; + } + switch (node->getFlowOp()) { case EOpKill: break; case EOpBreak: case EOpContinue: - mLoopDiscontinuity = true; case EOpReturn: + mLoopDiscontinuity = true; break; default: UNREACHABLE(); } |