Shader and Compiler track uses of gl_FragCoord and gl_FragData and MRT extension usage.

TRAC #22668 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@2022 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 898bc135
...@@ -48,6 +48,8 @@ OutputHLSL::OutputHLSL(TParseContext &context, const ShBuiltInResources& resourc ...@@ -48,6 +48,8 @@ OutputHLSL::OutputHLSL(TParseContext &context, const ShBuiltInResources& resourc
mUsesTexture2DProjLod0_bias = false; mUsesTexture2DProjLod0_bias = false;
mUsesTextureCubeLod0 = false; mUsesTextureCubeLod0 = false;
mUsesTextureCubeLod0_bias = false; mUsesTextureCubeLod0_bias = false;
mUsesFragColor = false;
mUsesFragData = false;
mUsesDepthRange = false; mUsesDepthRange = false;
mUsesFragCoord = false; mUsesFragCoord = false;
mUsesPointCoord = false; mUsesPointCoord = false;
...@@ -82,6 +84,8 @@ OutputHLSL::OutputHLSL(TParseContext &context, const ShBuiltInResources& resourc ...@@ -82,6 +84,8 @@ OutputHLSL::OutputHLSL(TParseContext &context, const ShBuiltInResources& resourc
mUsesAtan2_3 = false; mUsesAtan2_3 = false;
mUsesAtan2_4 = false; mUsesAtan2_4 = false;
mNumRenderTargets = resources.EXT_draw_buffers ? resources.MaxDrawBuffers : 1;
mScopeDepth = 0; mScopeDepth = 0;
mUniqueIndex = 0; mUniqueIndex = 0;
...@@ -205,6 +209,11 @@ void OutputHLSL::header() ...@@ -205,6 +209,11 @@ void OutputHLSL::header()
if (shaderType == SH_FRAGMENT_SHADER) if (shaderType == SH_FRAGMENT_SHADER)
{ {
TExtensionBehavior::const_iterator iter = mContext.extensionBehavior().find("GL_EXT_draw_buffers");
bool usingMRTExtension = iter != mContext.extensionBehavior().end() && iter->second == EBhEnable;
unsigned int numColorValues = usingMRTExtension ? mNumRenderTargets : 1;
out << "// Varyings\n"; out << "// Varyings\n";
out << varyings; out << varyings;
out << "\n" out << "\n"
...@@ -582,6 +591,21 @@ void OutputHLSL::header() ...@@ -582,6 +591,21 @@ void OutputHLSL::header()
} }
else UNREACHABLE(); else UNREACHABLE();
} }
if (usingMRTExtension && mNumRenderTargets > 1)
{
out << "#define GL_USES_MRT\n";
}
if (mUsesFragColor)
{
out << "#define GL_USES_FRAG_COLOR\n";
}
if (mUsesFragData)
{
out << "#define GL_USES_FRAG_DATA\n";
}
} }
else // Vertex shader else // Vertex shader
{ {
...@@ -1099,10 +1123,12 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node) ...@@ -1099,10 +1123,12 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
if (name == "gl_FragColor") if (name == "gl_FragColor")
{ {
out << "gl_Color[0]"; out << "gl_Color[0]";
mUsesFragColor = true;
} }
else if (name == "gl_FragData") else if (name == "gl_FragData")
{ {
out << "gl_Color"; out << "gl_Color";
mUsesFragData = true;
} }
else if (name == "gl_DepthRange") else if (name == "gl_DepthRange")
{ {
......
...@@ -101,6 +101,8 @@ class OutputHLSL : public TIntermTraverser ...@@ -101,6 +101,8 @@ class OutputHLSL : public TIntermTraverser
bool mUsesTexture2DProjLod0_bias; bool mUsesTexture2DProjLod0_bias;
bool mUsesTextureCubeLod0; bool mUsesTextureCubeLod0;
bool mUsesTextureCubeLod0_bias; bool mUsesTextureCubeLod0_bias;
bool mUsesFragColor;
bool mUsesFragData;
bool mUsesDepthRange; bool mUsesDepthRange;
bool mUsesFragCoord; bool mUsesFragCoord;
bool mUsesPointCoord; bool mUsesPointCoord;
...@@ -135,6 +137,8 @@ class OutputHLSL : public TIntermTraverser ...@@ -135,6 +137,8 @@ class OutputHLSL : public TIntermTraverser
bool mUsesAtan2_3; bool mUsesAtan2_3;
bool mUsesAtan2_4; bool mUsesAtan2_4;
int mNumRenderTargets;
typedef std::set<TString> Constructors; typedef std::set<TString> Constructors;
Constructors mConstructors; Constructors mConstructors;
......
...@@ -297,6 +297,9 @@ void Shader::parseVaryings() ...@@ -297,6 +297,9 @@ void Shader::parseVaryings()
input = strstr(input, ";") + 2; input = strstr(input, ";") + 2;
} }
mUsesMultipleRenderTargets = strstr(mHlsl, "GL_USES_MRT") != NULL;
mUsesFragColor = strstr(mHlsl, "GL_USES_FRAG_COLOR") != NULL;
mUsesFragData = strstr(mHlsl, "GL_USES_FRAG_DATA") != NULL;
mUsesFragCoord = strstr(mHlsl, "GL_USES_FRAG_COORD") != NULL; mUsesFragCoord = strstr(mHlsl, "GL_USES_FRAG_COORD") != NULL;
mUsesFrontFacing = strstr(mHlsl, "GL_USES_FRONT_FACING") != NULL; mUsesFrontFacing = strstr(mHlsl, "GL_USES_FRONT_FACING") != NULL;
mUsesPointSize = strstr(mHlsl, "GL_USES_POINT_SIZE") != NULL; mUsesPointSize = strstr(mHlsl, "GL_USES_POINT_SIZE") != NULL;
...@@ -325,6 +328,9 @@ void Shader::uncompile() ...@@ -325,6 +328,9 @@ void Shader::uncompile()
// set by parseVaryings // set by parseVaryings
mVaryings.clear(); mVaryings.clear();
mUsesMultipleRenderTargets = false;
mUsesFragColor = false;
mUsesFragData = false;
mUsesFragCoord = false; mUsesFragCoord = false;
mUsesFrontFacing = false; mUsesFrontFacing = false;
mUsesPointSize = false; mUsesPointSize = false;
......
...@@ -98,6 +98,9 @@ class Shader ...@@ -98,6 +98,9 @@ class Shader
VaryingList mVaryings; VaryingList mVaryings;
bool mUsesMultipleRenderTargets;
bool mUsesFragColor;
bool mUsesFragData;
bool mUsesFragCoord; bool mUsesFragCoord;
bool mUsesFrontFacing; bool mUsesFrontFacing;
bool mUsesPointSize; bool mUsesPointSize;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment