Fix gl_FrontFacing to take GL_FRONT_FACE into account.

Bug swiftshader:113

Change-Id: Ia1cbcdbb396eaabaa79e4c8651d7c025f73d028a
Reviewed-on: https://swiftshader-review.googlesource.com/20068
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/D3D9/Direct3DDevice9.cpp b/src/D3D9/Direct3DDevice9.cpp
index d033bcc..71f5f53 100644
--- a/src/D3D9/Direct3DDevice9.cpp
+++ b/src/D3D9/Direct3DDevice9.cpp
@@ -3207,13 +3207,13 @@
 				switch(value)
 				{
 				case D3DCULL_NONE:
-					renderer->setCullMode(sw::CULL_NONE);
+					renderer->setCullMode(sw::CULL_NONE, true);
 					break;
 				case D3DCULL_CCW:
-					renderer->setCullMode(sw::CULL_COUNTERCLOCKWISE);
+					renderer->setCullMode(sw::CULL_COUNTERCLOCKWISE, true);
 					break;
 				case D3DCULL_CW:
-					renderer->setCullMode(sw::CULL_CLOCKWISE);
+					renderer->setCullMode(sw::CULL_CLOCKWISE, true);
 					break;
 				default:
 					ASSERT(false);
diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp
index 8f8d96a..37f9703 100644
--- a/src/OpenGL/libGL/Context.cpp
+++ b/src/OpenGL/libGL/Context.cpp
@@ -1707,14 +1707,15 @@
 void Context::applyState(GLenum drawMode)
 {
 	Framebuffer *framebuffer = getDrawFramebuffer();
+	bool frontFaceCCW = (mState.frontFace == GL_CCW);
 
 	if(mState.cullFaceEnabled)
 	{
-		device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace));
+		device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace), frontFaceCCW);
 	}
 	else
 	{
-		device->setCullMode(sw::CULL_NONE);
+		device->setCullMode(sw::CULL_NONE, frontFaceCCW);
 	}
 
 	if(mDepthStateDirty)
diff --git a/src/OpenGL/libGL/Device.cpp b/src/OpenGL/libGL/Device.cpp
index be7d10e..fd9c205 100644
--- a/src/OpenGL/libGL/Device.cpp
+++ b/src/OpenGL/libGL/Device.cpp
@@ -45,7 +45,7 @@
 		setAlphaTestEnable(false);
 		setSourceBlendFactor(BLEND_ONE);
 		setDestBlendFactor(BLEND_ZERO);
-		setCullMode(CULL_COUNTERCLOCKWISE);
+		setCullMode(CULL_COUNTERCLOCKWISE, true);
 		setDepthCompare(DEPTH_LESSEQUAL);
 		setAlphaReference(0.0f);
 		setAlphaCompare(ALPHA_ALWAYS);
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 28b0592..811234e 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -1781,14 +1781,15 @@
 void Context::applyState(GLenum drawMode)
 {
 	Framebuffer *framebuffer = getFramebuffer();
+	bool frontFaceCCW = (mState.frontFace == GL_CCW);
 
 	if(mState.cullFaceEnabled)
 	{
-		device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace));
+		device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace), frontFaceCCW);
 	}
 	else
 	{
-		device->setCullMode(sw::CULL_NONE);
+		device->setCullMode(sw::CULL_NONE, frontFaceCCW);
 	}
 
 	if(mDepthStateDirty)
diff --git a/src/OpenGL/libGLES_CM/Device.cpp b/src/OpenGL/libGLES_CM/Device.cpp
index d1c3a04..4df82e5 100644
--- a/src/OpenGL/libGLES_CM/Device.cpp
+++ b/src/OpenGL/libGLES_CM/Device.cpp
@@ -46,7 +46,7 @@
 		setAlphaTestEnable(false);
 		setSourceBlendFactor(BLEND_ONE);
 		setDestBlendFactor(BLEND_ZERO);
-		setCullMode(CULL_COUNTERCLOCKWISE);
+		setCullMode(CULL_COUNTERCLOCKWISE, true);
 		setDepthCompare(DEPTH_LESSEQUAL);
 		setAlphaReference(0.0f);
 		setAlphaCompare(ALPHA_ALWAYS);
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 227cd4c..5a5a6b3 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -2783,14 +2783,15 @@
 void Context::applyState(GLenum drawMode)
 {
 	Framebuffer *framebuffer = getDrawFramebuffer();
+	bool frontFaceCCW = (mState.frontFace == GL_CCW);
 
 	if(mState.cullFaceEnabled)
 	{
-		device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace));
+		device->setCullMode(es2sw::ConvertCullMode(mState.cullMode, mState.frontFace), frontFaceCCW);
 	}
 	else
 	{
-		device->setCullMode(sw::CULL_NONE);
+		device->setCullMode(sw::CULL_NONE, frontFaceCCW);
 	}
 
 	if(mDepthStateDirty)
diff --git a/src/OpenGL/libGLESv2/Device.cpp b/src/OpenGL/libGLESv2/Device.cpp
index 81238df..a98131e 100644
--- a/src/OpenGL/libGLESv2/Device.cpp
+++ b/src/OpenGL/libGLESv2/Device.cpp
@@ -50,7 +50,7 @@
 		setAlphaTestEnable(false);
 		setSourceBlendFactor(BLEND_ONE);
 		setDestBlendFactor(BLEND_ZERO);
-		setCullMode(CULL_COUNTERCLOCKWISE);
+		setCullMode(CULL_COUNTERCLOCKWISE, true);
 		setDepthCompare(DEPTH_LESSEQUAL);
 		setAlphaReference(127.5f);
 		setAlphaCompare(ALPHA_ALWAYS);
diff --git a/src/Renderer/Context.cpp b/src/Renderer/Context.cpp
index f9d72a9..25c5775 100644
--- a/src/Renderer/Context.cpp
+++ b/src/Renderer/Context.cpp
@@ -274,6 +274,7 @@
 		blendOperationStateAlpha = BLENDOP_ADD;
 
 		cullMode = CULL_CLOCKWISE;
+		frontFacingCCW = true;
 		alphaReference = 0.0f;
 
 		depthBias = 0.0f;
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp
index 9274233..d9110d8 100644
--- a/src/Renderer/Context.hpp
+++ b/src/Renderer/Context.hpp
@@ -432,6 +432,7 @@
 		ShadingMode shadingMode;
 
 		CullMode cullMode;
+		bool frontFacingCCW;
 		float alphaReference;
 
 		float depthBias;
diff --git a/src/Renderer/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp
index 3903701..8bc40c2 100644
--- a/src/Renderer/PixelProcessor.cpp
+++ b/src/Renderer/PixelProcessor.cpp
@@ -586,9 +586,10 @@
 		context->alphaTestEnable = alphaTestEnable;
 	}
 
-	void PixelProcessor::setCullMode(CullMode cullMode)
+	void PixelProcessor::setCullMode(CullMode cullMode, bool frontFacingCCW)
 	{
 		context->cullMode = cullMode;
+		context->frontFacingCCW = frontFacingCCW;
 	}
 
 	void PixelProcessor::setColorWriteMask(int index, int rgbaMask)
@@ -1041,6 +1042,8 @@
 			state.centroid = context->pixelShader->containsCentroid();
 		}
 
+		state.frontFaceCCW = context->frontFacingCCW;
+
 		if(!context->pixelShader)
 		{
 			for(unsigned int i = 0; i < 8; i++)
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp
index cea417d..98300de 100644
--- a/src/Renderer/PixelProcessor.hpp
+++ b/src/Renderer/PixelProcessor.hpp
@@ -83,6 +83,7 @@
 			unsigned int multiSampleMask                      : 4;
 			TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST);
 			bool centroid                                     : 1;
+			bool frontFaceCCW                                 : 1;
 
 			LogicalOperation logicalOperation : BITS(LOGICALOP_LAST);
 
@@ -250,7 +251,7 @@
 		void setAlphaCompare(AlphaCompareMode alphaCompareMode);
 		void setDepthWriteEnable(bool depthWriteEnable);
 		void setAlphaTestEnable(bool alphaTestEnable);
-		void setCullMode(CullMode cullMode);
+		void setCullMode(CullMode cullMode, bool frontFacingCCW);
 		void setColorWriteMask(int index, int rgbaMask);
 
 		void setColorLogicOpEnabled(bool colorLogicOpEnabled);
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp
index 3cedbce..473712b 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -51,8 +51,12 @@
 
 			if(shader->isVFaceDeclared())
 			{
-				Float4 area = *Pointer<Float>(primitive + OFFSET(Primitive, area));
-				Float4 face = booleanFaceRegister ? Float4(As<Float4>(CmpNLT(area, Float4(0.0f)))) : area;
+				Float4 face = *Pointer<Float>(primitive + OFFSET(Primitive, area));
+
+				if(booleanFaceRegister)
+				{
+					face = As<Float4>(state.frontFaceCCW ? CmpNLT(face, Float4(0.0f)) : CmpLT(face, Float4(0.0f)));
+				}
 
 				vFace.x = face;
 				vFace.y = face;