From 4770cfa920b606b1496ca9348c3dd69b476dbbbf Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 20 Apr 2021 07:33:54 -0300 Subject: Only enable clip distance if written to on shader (#2217) * Only enable clip distance if written to on shader * Signal InstanceId use through FeatureFlags * Shader cache version bump --- Ryujinx.Graphics.Gpu/Engine/Methods.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'Ryujinx.Graphics.Gpu/Engine/Methods.cs') diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs index 033311b2..ae9bdb0d 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs @@ -39,6 +39,7 @@ namespace Ryujinx.Graphics.Gpu.Engine private bool _isAnyVbInstanced; private bool _vsUsesInstanceId; + private byte _vsClipDistancesWritten; private bool _forceShaderUpdate; @@ -993,7 +994,15 @@ namespace Ryujinx.Graphics.Gpu.Engine ShaderBundle gs = ShaderCache.GetGraphicsShader(state, addresses); - _vsUsesInstanceId = gs.Shaders[0]?.Info.UsesInstanceId ?? false; + byte oldVsClipDistancesWritten = _vsClipDistancesWritten; + + _vsUsesInstanceId = gs.Shaders[0]?.Info.UsesInstanceId ?? false; + _vsClipDistancesWritten = gs.Shaders[0]?.Info.ClipDistancesWritten ?? 0; + + if (oldVsClipDistancesWritten != _vsClipDistancesWritten) + { + UpdateUserClipState(state); + } int storageBufferBindingsCount = 0; int uniformBufferBindingsCount = 0; @@ -1098,7 +1107,7 @@ namespace Ryujinx.Graphics.Gpu.Engine /// Current GPU state private void UpdateUserClipState(GpuState state) { - int clipMask = state.Get(MethodOffset.ClipDistanceEnable); + int clipMask = state.Get(MethodOffset.ClipDistanceEnable) & _vsClipDistancesWritten; for (int i = 0; i < Constants.TotalClipDistances; ++i) { -- cgit v1.2.3