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;