Enable broadcasting gl_FragColor to all draw buffer color attachments in ES2 contexts.

TRAC #22888

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@2052 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/common/version.h b/src/common/version.h
index 7913851..12d6ee6 100644
--- a/src/common/version.h
+++ b/src/common/version.h
@@ -1,7 +1,7 @@
 #define MAJOR_VERSION 1
 #define MINOR_VERSION 1
 #define BUILD_VERSION 0
-#define BUILD_REVISION 2037
+#define BUILD_REVISION 2038
 
 #define STRINGIFY(x) #x
 #define MACRO_STRINGIFY(x) STRINGIFY(x)
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index 14e6c94..6bee9ab 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -1165,7 +1165,7 @@
     bool usesMRT = fragmentShader->mUsesMultipleRenderTargets;
     bool usesFragColor = fragmentShader->mUsesFragColor;
     bool usesFragData = fragmentShader->mUsesFragData;
-    if (usesMRT && usesFragColor && usesFragData)
+    if (usesFragColor && usesFragData)
     {
         infoLog.append("Cannot use both gl_FragColor and gl_FragData in the same fragment shader.");
         return false;
@@ -1177,6 +1177,10 @@
 
     const int registersNeeded = registers + (fragmentShader->mUsesFragCoord ? 1 : 0) + (fragmentShader->mUsesPointCoord ? 1 : 0);
 
+    // The output color is broadcast to all enabled draw buffers when writing to gl_FragColor 
+    const bool broadcast = fragmentShader->mUsesFragColor;
+    const unsigned int numRenderTargets = (broadcast || usesMRT ? mRenderer->getMaxRenderTargets() : 1);
+
     if (registersNeeded > maxVaryingVectors)
     {
         infoLog.append("No varying registers left to support gl_FragCoord/gl_PointCoord");
@@ -1222,8 +1226,6 @@
     std::string targetSemantic = (shaderModel >= 4) ? "SV_Target" : "COLOR";
     std::string positionSemantic = (shaderModel >= 4) ? "SV_Position" : "POSITION";
 
-    const unsigned int renderTargetCount = usesMRT ? mRenderer->getMaxRenderTargets() : 1;
-
     // special varyings that use reserved registers
     int reservedRegisterIndex = registers;
     std::string fragCoordSemantic;
@@ -1472,9 +1474,9 @@
                  "struct PS_OUTPUT\n"
                  "{\n";
 
-    for (unsigned int i = 0; i < renderTargetCount; i++)
+    for (unsigned int renderTargetIndex = 0; renderTargetIndex < numRenderTargets; renderTargetIndex++)
     {
-        pixelHLSL += "    float4 gl_Color" + str(i) + " : " + targetSemantic + str(i) + ";\n";
+        pixelHLSL += "    float4 gl_Color" + str(renderTargetIndex) + " : " + targetSemantic + str(renderTargetIndex) + ";\n";
     }
 
     pixelHLSL += "};\n"
@@ -1583,11 +1585,11 @@
                  "\n"
                  "    PS_OUTPUT output;\n";
 
-    for (unsigned int i = 0; i < renderTargetCount; i++)
+    for (unsigned int renderTargetIndex = 0; renderTargetIndex < numRenderTargets; renderTargetIndex++)
     {
-        unsigned int sourceColor = fragmentShader->mUsesFragData ? i : 0;
+        unsigned int sourceColorIndex = broadcast ? 0 : renderTargetIndex;
 
-        pixelHLSL += "    output.gl_Color" + str(i) + " = gl_Color[" + str(sourceColor) + "];\n";
+        pixelHLSL += "    output.gl_Color" + str(renderTargetIndex) + " = gl_Color[" + str(sourceColorIndex) + "];\n";
     }
 
     pixelHLSL += "\n"