Fix support for variable number of render targets.

Bug 19353282

Change-Id: I4e99589477de32bb8004feec673e1dbddb675047
Reviewed-on: https://swiftshader-review.googlesource.com/5144
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/Main/Config.hpp b/src/Main/Config.hpp
index 7d0952c..2ceec37 100644
--- a/src/Main/Config.hpp
+++ b/src/Main/Config.hpp
@@ -91,7 +91,7 @@
 		MAX_CLIP_PLANES = 6,

 		MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 64,

 		MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 64,

-		RENDERTARGETS = 4,

+		RENDERTARGETS = 8,

 	};

 }

 

diff --git a/src/OpenGL/libGLESv2/Device.cpp b/src/OpenGL/libGLESv2/Device.cpp
index db7ad75..7da952b 100644
--- a/src/OpenGL/libGLESv2/Device.cpp
+++ b/src/OpenGL/libGLESv2/Device.cpp
@@ -72,7 +72,6 @@
 		setPointSize(1.0f);

 		setPointSizeMin(0.125f);

         setPointSizeMax(8192.0f);

-		setColorWriteMask(0, 0x0000000F);

 		setBlendOperation(BLENDOP_ADD);

 		scissorEnable = false;

 		setSlopeDepthBias(0.0f);

@@ -81,9 +80,6 @@
 		setStencilZFailOperationCCW(OPERATION_KEEP);

 		setStencilPassOperationCCW(OPERATION_KEEP);

 		setStencilCompareCCW(STENCIL_ALWAYS);

-		setColorWriteMask(1, 0x0000000F);

-		setColorWriteMask(2, 0x0000000F);

-		setColorWriteMask(3, 0x0000000F);

 		setBlendConstant(0xFFFFFFFF);

 		setWriteSRGB(false);

 		setDepthBias(0.0f);

diff --git a/src/Renderer/Context.cpp b/src/Renderer/Context.cpp
index 64b6ce5..b1891b2 100644
--- a/src/Renderer/Context.cpp
+++ b/src/Renderer/Context.cpp
@@ -272,10 +272,11 @@
 
 		cullMode = CULL_CLOCKWISE;
 		alphaReference = 0.0f;
-		colorWriteMask[0] = 0x0000000F;
-		colorWriteMask[1] = 0x0000000F;
-		colorWriteMask[2] = 0x0000000F;
-		colorWriteMask[3] = 0x0000000F;
+
+		for(int i = 0; i < RENDERTARGETS; i++)
+		{
+			colorWriteMask[i] = 0x0000000F;
+		}
 
 		ambientMaterialSource = MATERIAL_MATERIAL;
 		diffuseMaterialSource = MATERIAL_COLOR1;
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp
index 91a1998..c8f9624 100644
--- a/src/Renderer/Context.hpp
+++ b/src/Renderer/Context.hpp
@@ -518,7 +518,7 @@
 		bool pointScaleEnable;

 		float lineWidth;

 

-		int colorWriteMask[4];   // RGBA

+		int colorWriteMask[RENDERTARGETS];   // RGBA

 		bool writeSRGB;

 		unsigned int sampleMask;

 		unsigned int multiSampleMask;

diff --git a/src/Renderer/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp
index 02d4c56..636351a 100644
--- a/src/Renderer/PixelProcessor.cpp
+++ b/src/Renderer/PixelProcessor.cpp
@@ -959,13 +959,9 @@
 
 		state.logicalOperation = context->colorLogicOp();
 
-		state.colorWriteMask = (context->colorWriteActive(0) << 0) |
-		                       (context->colorWriteActive(1) << 4) |
-		                       (context->colorWriteActive(2) << 8) |
-		                       (context->colorWriteActive(3) << 12);
-
 		for(int i = 0; i < RENDERTARGETS; i++)
 		{
+			state.colorWriteMask |= context->colorWriteActive(i) << (4 * i);
 			state.targetFormat[i] = context->renderTargetInternalFormat(i);
 		}
 
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp
index 571e860..104f377 100644
--- a/src/Renderer/PixelProcessor.hpp
+++ b/src/Renderer/PixelProcessor.hpp
@@ -71,8 +71,8 @@
 			BlendFactor sourceBlendFactorAlpha        : BITS(BLEND_LAST);

 			BlendFactor destBlendFactorAlpha          : BITS(BLEND_LAST);

 			BlendOperation blendOperationAlpha        : BITS(BLENDOP_LAST);

-			

-			unsigned int colorWriteMask                       : 16;   // (four times four component bit mask)

+

+			unsigned int colorWriteMask                       : RENDERTARGETS * 4;   // Four component bit masks

 			Format targetFormat[RENDERTARGETS];

 			bool writeSRGB                                    : 1;

 			unsigned int multiSample                          : 3;