Support depth clip mode and disable shader fast math optimization on NVIDIA as a workaround for compiler bugs (?)

This commit is contained in:
gdkchan 2019-12-07 01:54:28 -03:00 committed by Thog
parent 17fb11ddb9
commit 7ce5584f9e
7 changed files with 55 additions and 4 deletions

View file

@ -0,0 +1,8 @@
namespace Ryujinx.Graphics.GAL
{
public enum DepthMode
{
MinusOneToOne,
ZeroToOne
}
}

View file

@ -49,6 +49,8 @@ namespace Ryujinx.Graphics.GAL
void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp); void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp);
void SetDepthMode(DepthMode mode);
void SetDepthTest(DepthTestDescriptor depthTest); void SetDepthTest(DepthTestDescriptor depthTest);
void SetFaceCulling(bool enable, Face face); void SetFaceCulling(bool enable, Face face);

View file

@ -102,7 +102,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
UpdateDepthTestState(state); UpdateDepthTestState(state);
} }
if (state.QueryModified(MethodOffset.ViewportTransform, MethodOffset.ViewportExtents)) if (state.QueryModified(MethodOffset.DepthMode, MethodOffset.ViewportTransform, MethodOffset.ViewportExtents))
{ {
UpdateViewportTransform(state); UpdateViewportTransform(state);
} }
@ -294,6 +294,10 @@ namespace Ryujinx.Graphics.Gpu.Engine
private void UpdateViewportTransform(GpuState state) private void UpdateViewportTransform(GpuState state)
{ {
DepthMode depthMode = state.Get<DepthMode>(MethodOffset.DepthMode);
_context.Renderer.Pipeline.SetDepthMode(depthMode);
bool transformEnable = GetViewportTransformEnable(state); bool transformEnable = GetViewportTransformEnable(state);
bool flipY = (state.Get<int>(MethodOffset.YControl) & 1) != 0; bool flipY = (state.Get<int>(MethodOffset.YControl) & 1) != 0;

View file

@ -21,6 +21,7 @@ namespace Ryujinx.Graphics.Gpu.State
ViewportTransform = 0x280, ViewportTransform = 0x280,
ViewportExtents = 0x300, ViewportExtents = 0x300,
VertexBufferDrawState = 0x35d, VertexBufferDrawState = 0x35d,
DepthMode = 0x35f,
ClearColors = 0x360, ClearColors = 0x360,
ClearDepthValue = 0x364, ClearDepthValue = 0x364,
ClearStencilValue = 0x368, ClearStencilValue = 0x368,

View file

@ -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}\".");
}
}
}

View file

@ -31,12 +31,14 @@ namespace Ryujinx.Graphics.OpenGL
private TextureView _unit0Texture; private TextureView _unit0Texture;
private ClipOrigin _clipOrigin; private ClipOrigin _clipOrigin;
private ClipDepthMode _clipDepthMode;
private uint[] _componentMasks; private uint[] _componentMasks;
internal Pipeline() internal Pipeline()
{ {
_clipOrigin = ClipOrigin.LowerLeft; _clipOrigin = ClipOrigin.LowerLeft;
_clipDepthMode = ClipDepthMode.NegativeOneToOne;
} }
public void BindBlendState(int index, BlendDescriptor blend) public void BindBlendState(int index, BlendDescriptor blend)
@ -646,6 +648,18 @@ namespace Ryujinx.Graphics.OpenGL
// GL.PolygonOffsetClamp(factor, units, clamp); // 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) public void SetDepthTest(DepthTestDescriptor depthTest)
{ {
GL.DepthFunc((DepthFunction)depthTest.Func.Convert()); GL.DepthFunc((DepthFunction)depthTest.Func.Convert());
@ -828,7 +842,7 @@ namespace Ryujinx.Graphics.OpenGL
{ {
_clipOrigin = origin; _clipOrigin = origin;
GL.ClipControl(origin, ClipDepthMode.NegativeOneToOne); GL.ClipControl(origin, _clipDepthMode);
} }
} }

View file

@ -26,6 +26,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
context.AppendLine("#extension GL_ARB_compute_shader : enable"); context.AppendLine("#extension GL_ARB_compute_shader : enable");
} }
context.AppendLine("#pragma optionNV(fastmath off)");
context.AppendLine(); context.AppendLine();
context.AppendLine($"const int {DefaultNames.UndefinedName} = 0;"); context.AppendLine($"const int {DefaultNames.UndefinedName} = 0;");