Treat return statements in loops as loop discontinuities.
This is so that texture2D is converted to texture2DLod in loops with return statements. HLSL does not seem to allow gradient operations in loops with return statements. It considers them to be breaks.
Review URL: https://codereview.appspot.com/7131057
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1788 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index 7d53d64..b12af1f 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -118,7 +118,7 @@
void OutputHLSL::output()
{
- mContainsLoopDiscontinuity = containsLoopDiscontinuity(mContext.treeRoot);
+ mContainsLoopDiscontinuity = mContext.shaderType == SH_FRAGMENT_SHADER && containsLoopDiscontinuity(mContext.treeRoot);
mContext.treeRoot->traverse(this); // Output the body first to determine what has to go in the header
header();
@@ -2075,7 +2075,7 @@
{
bool wasDiscontinuous = mInsideDiscontinuousLoop;
- if (!mInsideDiscontinuousLoop)
+ if (mContainsLoopDiscontinuity && !mInsideDiscontinuousLoop)
{
mInsideDiscontinuousLoop = containsLoopDiscontinuity(node);
}