Do not set front face if face culling is not enabled

This commit is contained in:
gdkchan 2018-07-06 11:26:40 -03:00
parent 97ca974213
commit 92f950b290
3 changed files with 23 additions and 32 deletions

View file

@ -2,7 +2,7 @@
{ {
public enum GalFrontFace public enum GalFrontFace
{ {
CW = 0x900, Cw = 0x900,
CCW = 0x901 Ccw = 0x901
} }
} }

View file

@ -9,8 +9,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{ {
switch (FrontFace) switch (FrontFace)
{ {
case GalFrontFace.CW: return FrontFaceDirection.Cw; case GalFrontFace.Cw: return FrontFaceDirection.Cw;
case GalFrontFace.CCW: return FrontFaceDirection.Ccw; case GalFrontFace.Ccw: return FrontFaceDirection.Ccw;
} }
throw new ArgumentException(nameof(FrontFace)); throw new ArgumentException(nameof(FrontFace));

View file

@ -79,8 +79,7 @@ namespace Ryujinx.HLE.Gpu.Engines
Gpu.Renderer.Shader.BindProgram(); Gpu.Renderer.Shader.BindProgram();
SetFrontFace(); SetFaceCulling();
SetCullFace();
SetDepth(); SetDepth();
SetStencil(); SetStencil();
SetAlphaBlending(); SetAlphaBlending();
@ -198,32 +197,7 @@ namespace Ryujinx.HLE.Gpu.Engines
throw new ArgumentOutOfRangeException(nameof(Program)); throw new ArgumentOutOfRangeException(nameof(Program));
} }
private void SetFrontFace() private void SetFaceCulling()
{
float SignX = GetFlipSign(NvGpuEngine3dReg.ViewportScaleX);
float SignY = GetFlipSign(NvGpuEngine3dReg.ViewportScaleY);
GalFrontFace FrontFace = (GalFrontFace)ReadRegister(NvGpuEngine3dReg.FrontFace);
//Flipping breaks facing. Flipping front facing too fixes it
if (SignX != SignY)
{
switch (FrontFace)
{
case GalFrontFace.CW:
FrontFace = GalFrontFace.CCW;
break;
case GalFrontFace.CCW:
FrontFace = GalFrontFace.CW;
break;
}
}
Gpu.Renderer.Rasterizer.SetFrontFace(FrontFace);
}
private void SetCullFace()
{ {
bool Enable = (ReadRegister(NvGpuEngine3dReg.CullFaceEnable) & 1) != 0; bool Enable = (ReadRegister(NvGpuEngine3dReg.CullFaceEnable) & 1) != 0;
@ -241,6 +215,23 @@ namespace Ryujinx.HLE.Gpu.Engines
return; return;
} }
float SignX = GetFlipSign(NvGpuEngine3dReg.ViewportScaleX);
float SignY = GetFlipSign(NvGpuEngine3dReg.ViewportScaleY);
GalFrontFace FrontFace = (GalFrontFace)ReadRegister(NvGpuEngine3dReg.FrontFace);
//Flipping breaks facing. Flipping front facing too fixes it
if (SignX != SignY)
{
switch (FrontFace)
{
case GalFrontFace.Cw: FrontFace = GalFrontFace.Ccw; break;
case GalFrontFace.Ccw: FrontFace = GalFrontFace.Cw; break;
}
}
Gpu.Renderer.Rasterizer.SetFrontFace(FrontFace);
GalCullFace CullFace = (GalCullFace)ReadRegister(NvGpuEngine3dReg.CullFace); GalCullFace CullFace = (GalCullFace)ReadRegister(NvGpuEngine3dReg.CullFace);
Gpu.Renderer.Rasterizer.SetCullFace(CullFace); Gpu.Renderer.Rasterizer.SetCullFace(CullFace);