aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu
diff options
context:
space:
mode:
authormageven <62494521+mageven@users.noreply.github.com>2020-05-04 07:34:49 +0530
committerGitHub <noreply@github.com>2020-05-04 12:04:49 +1000
commit53369e79bdc34440a48e932e7024bab92f30f957 (patch)
tree43ddc5f5d334f22933691d4bf5aa9c45fcac9636 /Ryujinx.Graphics.Gpu
parent12399b8aeac82b8f80a06dbcb59a8021908d9c30 (diff)
Implement user-defined clipping on GL state pipeline (#1118)
Diffstat (limited to 'Ryujinx.Graphics.Gpu')
-rw-r--r--Ryujinx.Graphics.Gpu/Constants.cs5
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/Methods.cs19
-rw-r--r--Ryujinx.Graphics.Gpu/State/MethodOffset.cs1
3 files changed, 25 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Gpu/Constants.cs b/Ryujinx.Graphics.Gpu/Constants.cs
index 3175ebd2..1ae90273 100644
--- a/Ryujinx.Graphics.Gpu/Constants.cs
+++ b/Ryujinx.Graphics.Gpu/Constants.cs
@@ -54,5 +54,10 @@ namespace Ryujinx.Graphics.Gpu
/// Maximum number of viewports.
/// </summary>
public const int TotalViewports = 16;
+
+ /// <summary>
+ /// Maximum size of gl_ClipDistance array in shaders.
+ /// </summary>
+ public const int TotalClipDistances = 8;
}
} \ No newline at end of file
diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
index a517ae05..59678be5 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
@@ -125,6 +125,11 @@ namespace Ryujinx.Graphics.Gpu.Engine
UpdateShaderState(state);
}
+ if (state.QueryModified(MethodOffset.ClipDistanceEnable))
+ {
+ UpdateUserClipState(state);
+ }
+
if (state.QueryModified(MethodOffset.RasterizeEnable))
{
UpdateRasterizerState(state);
@@ -903,6 +908,20 @@ namespace Ryujinx.Graphics.Gpu.Engine
}
/// <summary>
+ /// Updates user-defined clipping based on the guest GPU state.
+ /// </summary>
+ /// <param name="state">Current GPU state</param>
+ private void UpdateUserClipState(GpuState state)
+ {
+ int clipMask = state.Get<int>(MethodOffset.ClipDistanceEnable);
+
+ for (int i = 0; i < Constants.TotalClipDistances; ++i)
+ {
+ _context.Renderer.Pipeline.SetUserClipDistance(i, (clipMask & (1 << i)) != 0);
+ }
+ }
+
+ /// <summary>
/// Gets texture target from a sampler type.
/// </summary>
/// <param name="type">Sampler type</param>
diff --git a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs
index 077b09c2..b39ff9b5 100644
--- a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs
+++ b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs
@@ -66,6 +66,7 @@ namespace Ryujinx.Graphics.Gpu.State
YControl = 0x4eb,
FirstVertex = 0x50d,
FirstInstance = 0x50e,
+ ClipDistanceEnable = 0x544,
PointSize = 0x546,
ResetCounter = 0x54c,
RtDepthStencilEnable = 0x54e,