Implement broadcasting of gl_FragColor.

Bug 19353282

Change-Id: I4319ad1836de36cc4b91b04ed226f925f82013ee
Reviewed-on: https://swiftshader-review.googlesource.com/5145
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp
index b0e47fd..c12097e 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -91,6 +91,8 @@
 			}
 		}
 
+		bool broadcastColor0 = true;
+
 		for(size_t i = 0; i < shader->getLength(); i++)
 		{
 			const Shader::Instruction *instruction = shader->getInstruction(i);
@@ -475,6 +477,8 @@
 				case Shader::PARAMETER_COLOROUT:
 					if(dst.rel.type == Shader::PARAMETER_VOID)
 					{
+						broadcastColor0 = (dst.index == 0) && broadcastColor0;
+
 						if(dst.x) { oC[dst.index].x = d.x; }
 						if(dst.y) { oC[dst.index].y = d.y; }
 						if(dst.z) { oC[dst.index].z = d.z; }
@@ -482,6 +486,7 @@
 					}
 					else
 					{
+						broadcastColor0 = false;
 						Int a = relativeAddress(dst) + dst.index;
 
 						if(dst.x) { oC[a].x = d.x; }
@@ -510,9 +515,19 @@
 			Nucleus::setInsertBlock(returnBlock);
 		}
 
-		for(int i = 0; i < RENDERTARGETS; i++)
+		if(broadcastColor0)
 		{
-			c[i] = oC[i];
+			for(int i = 0; i < RENDERTARGETS; i++)
+			{
+				c[i] = oC[0];
+			}
+		}
+		else
+		{
+			for(int i = 0; i < RENDERTARGETS; i++)
+			{
+				c[i] = oC[i];
+			}
 		}
 	}