diff --git a/assets/locales.json b/assets/locales.json index 26057985c..5f8093406 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -5997,6 +5997,56 @@ "zh_TW": "圖形著色器傾印路徑:" } }, + { + "ID": "DisableFixOcclusionCulling", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Disable Occlusion Culling Fix - flickering of objects.", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "DisableFixOcclusionCullingTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Eliminates visual artifacts in the form of chaotic flickering of objects on the screen.\nThe solution is relevant for games where such an effect is observed (for example, Alan Wake).", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "SettingsTabLogging", "Translations": { diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/SemaphoreUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/SemaphoreUpdater.cs index a9a96d54a..b9ac4f7ba 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/SemaphoreUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/SemaphoreUpdater.cs @@ -165,6 +165,11 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed Timestamp = ticks, }; + if (!GraphicsConfig.DisableFixOcclusionCulling && result <= 0) + { + return; + } + if (counter?.Invalid != true) { _channel.MemoryManager.Write(gpuVa, counterData); diff --git a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs index 066ac28f7..48fabbcc0 100644 --- a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs +++ b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs @@ -72,6 +72,11 @@ namespace Ryujinx.Graphics.Gpu /// Enables or disables color space passthrough, if available. /// public static bool EnableColorSpacePassthrough = false; + + /// + /// Enables or disables fix occlusion culling. + /// + public static bool DisableFixOcclusionCulling = true; } #pragma warning restore CA2211 } diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs index c5bbe3da8..e3543001e 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs @@ -15,7 +15,7 @@ namespace Ryujinx.Ava.Systems.Configuration /// /// The current version of the file format /// - public const int CurrentVersion = 69; + public const int CurrentVersion = 70; /// /// Version of the configuration file format @@ -468,7 +468,12 @@ namespace Ryujinx.Ava.Systems.Configuration /// The packed values of the enabled dirty hacks. /// public ulong[] DirtyHacks { get; set; } - + + /// + /// Fixes Occlusion Culling in Games (test feature) + /// + public bool DisableFixOcclusionCulling { get; set; } + /// /// Loads a configuration file from disk /// diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs index f7bc22913..29c64c19e 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs @@ -155,6 +155,8 @@ namespace Ryujinx.Ava.Systems.Configuration Multiplayer.DisableP2p.Value = cff.MultiplayerDisableP2p; Multiplayer.LdnPassphrase.Value = cff.MultiplayerLdnPassphrase; Multiplayer.LdnServer.Value = cff.LdnServer; + + Tweaks.DisableFixOcclusionCulling.Value = cff.DisableFixOcclusionCulling; { Hacks.ShowDirtyHacks.Value = cff.ShowDirtyHacks; @@ -461,7 +463,8 @@ namespace Ryujinx.Ava.Systems.Configuration TurboModeWhileHeld = false }; }), - (69, static cff => cff.SkipUserProfiles = false) + (69, static cff => cff.SkipUserProfiles = false), + (70, static cff => cff.DisableFixOcclusionCulling = false) ); } } diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs index 3c5fac1cb..6609c7a95 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs @@ -643,6 +643,21 @@ namespace Ryujinx.Ava.Systems.Configuration } } + /// + /// Tweaks Section + /// + public class TweaksSection + { + /// + /// Enable or disable Fix Occlusion Culling + /// + public ReactiveObject DisableFixOcclusionCulling { get; private set; } + public TweaksSection() + { + DisableFixOcclusionCulling = new ReactiveObject(); + } + } + /// /// Multiplayer configuration section /// @@ -781,6 +796,11 @@ namespace Ryujinx.Ava.Systems.Configuration /// public GraphicsSection Graphics { get; private set; } + /// + /// The Tweaks Section + /// + public TweaksSection Tweaks { get; private set; } + /// /// The Hid section /// @@ -842,6 +862,7 @@ namespace Ryujinx.Ava.Systems.Configuration Logger = new LoggerSection(); System = new SystemSection(); Graphics = new GraphicsSection(); + Tweaks = new TweaksSection(); Hid = new HidSection(); Multiplayer = new MultiplayerSection(); Hacks = new HacksSection(); diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs index 39b14244c..b156ea9b0 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationState.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs @@ -147,6 +147,7 @@ namespace Ryujinx.Ava.Systems.Configuration LdnServer = Multiplayer.LdnServer, ShowDirtyHacks = Hacks.ShowDirtyHacks, DirtyHacks = Hacks.EnabledHacks.Select(it => it.Pack()).ToArray(), + DisableFixOcclusionCulling = Tweaks.DisableFixOcclusionCulling, }; return configurationFile; @@ -320,6 +321,7 @@ namespace Ryujinx.Ava.Systems.Configuration }, } ]; + Tweaks.DisableFixOcclusionCulling.Value = true; } private static GraphicsBackend DefaultGraphicsBackend() diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 9b540088b..974333e5f 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -383,6 +383,8 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public bool DisableFixOcclusionCulling { get; set; } + public SettingsViewModel( VirtualFileSystem virtualFileSystem, ContentManager contentManager, @@ -659,6 +661,9 @@ namespace Ryujinx.Ava.UI.ViewModels DisableP2P = config.Multiplayer.DisableP2p; LdnPassphrase = config.Multiplayer.LdnPassphrase; LdnServer = config.Multiplayer.LdnServer; + + // Tweaks + DisableFixOcclusionCulling = config.Tweaks.DisableFixOcclusionCulling.Value; } public void SaveSettings() @@ -785,6 +790,9 @@ namespace Ryujinx.Ava.UI.ViewModels config.Hacks.DisableNifmIsAnyInternetRequestAccepted.Value = DirtyHacks.NifmDisableIsAnyInternetRequestAccepted; + // Tweaks + config.Tweaks.DisableFixOcclusionCulling.Value = DisableFixOcclusionCulling; + config.ToFileFormat().SaveConfig(Program.ConfigurationPath); MainWindow.UpdateGraphicsConfig(); diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml index 229f9e866..f2968173b 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml @@ -4,12 +4,25 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" mc:Ignorable="d" x:DataType="viewModels:SettingsViewModel"> + + + + - - - - - - + + + + + + + - - - + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 4f5cb13d3..9a4785e1f 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -569,6 +569,7 @@ namespace Ryujinx.Ava.UI.Windows GraphicsConfig.EnableShaderCache = ConfigurationState.Instance.Graphics.EnableShaderCache; GraphicsConfig.EnableTextureRecompression = ConfigurationState.Instance.Graphics.EnableTextureRecompression; GraphicsConfig.EnableMacroHLE = ConfigurationState.Instance.Graphics.EnableMacroHLE; + GraphicsConfig.DisableFixOcclusionCulling = ConfigurationState.Instance.Tweaks.DisableFixOcclusionCulling; #pragma warning restore IDE0055 }