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..ac4557a66 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 = false;
}
#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..3efcceeb4 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 = false;
}
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
}