aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-12-07 01:54:28 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit7ce5584f9e0d86f17ea4fc781483f60cfa288340 (patch)
tree1fe59d43bbd7a84687f6ad65156704718eeb852c /Ryujinx.Graphics.OpenGL
parent17fb11ddb98e94aaf494eaf6002ab149c5d54000 (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.cs20
-rw-r--r--Ryujinx.Graphics.OpenGL/Pipeline.cs20
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);
}
}