diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2019-12-07 01:54:28 -0300 |
|---|---|---|
| committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
| commit | 7ce5584f9e0d86f17ea4fc781483f60cfa288340 (patch) | |
| tree | 1fe59d43bbd7a84687f6ad65156704718eeb852c /Ryujinx.Graphics.OpenGL | |
| parent | 17fb11ddb98e94aaf494eaf6002ab149c5d54000 (diff) | |
Support depth clip mode and disable shader fast math optimization on NVIDIA as a workaround for compiler bugs (?)
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
| -rw-r--r-- | Ryujinx.Graphics.OpenGL/Converters/DepthModeConverter.cs | 20 | ||||
| -rw-r--r-- | Ryujinx.Graphics.OpenGL/Pipeline.cs | 20 |
2 files changed, 37 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Converters/DepthModeConverter.cs b/Ryujinx.Graphics.OpenGL/Converters/DepthModeConverter.cs new file mode 100644 index 00000000..a02f69d2 --- /dev/null +++ b/Ryujinx.Graphics.OpenGL/Converters/DepthModeConverter.cs @@ -0,0 +1,20 @@ +using OpenTK.Graphics.OpenGL; +using Ryujinx.Graphics.GAL; +using System; + +namespace Ryujinx.Graphics.OpenGL +{ + static class DepthModeConverter + { + public static ClipDepthMode Convert(this DepthMode mode) + { + switch (mode) + { + case DepthMode.MinusOneToOne: return ClipDepthMode.NegativeOneToOne; + case DepthMode.ZeroToOne: return ClipDepthMode.ZeroToOne; + } + + throw new ArgumentException($"Invalid depth mode \"{mode}\"."); + } + } +} diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs index 4eb94097..9b1fec33 100644 --- a/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -30,13 +30,15 @@ namespace Ryujinx.Graphics.OpenGL private TextureView _unit0Texture; - private ClipOrigin _clipOrigin; + private ClipOrigin _clipOrigin; + private ClipDepthMode _clipDepthMode; private uint[] _componentMasks; internal Pipeline() { - _clipOrigin = ClipOrigin.LowerLeft; + _clipOrigin = ClipOrigin.LowerLeft; + _clipDepthMode = ClipDepthMode.NegativeOneToOne; } public void BindBlendState(int index, BlendDescriptor blend) @@ -646,6 +648,18 @@ namespace Ryujinx.Graphics.OpenGL // GL.PolygonOffsetClamp(factor, units, clamp); } + public void SetDepthMode(DepthMode mode) + { + ClipDepthMode depthMode = mode.Convert(); + + if (_clipDepthMode != depthMode) + { + _clipDepthMode = depthMode; + + GL.ClipControl(_clipOrigin, depthMode); + } + } + public void SetDepthTest(DepthTestDescriptor depthTest) { GL.DepthFunc((DepthFunction)depthTest.Func.Convert()); @@ -828,7 +842,7 @@ namespace Ryujinx.Graphics.OpenGL { _clipOrigin = origin; - GL.ClipControl(origin, ClipDepthMode.NegativeOneToOne); + GL.ClipControl(origin, _clipDepthMode); } } |
