[cpu] made guest image cpu sync opt-in

This commit is contained in:
ParantezTech
2026-07-28 16:12:52 +03:00
parent c306f01630
commit b804c84ad8
3 changed files with 11 additions and 55 deletions
+5 -39
View File
@@ -242,7 +242,9 @@ public partial class MainWindow : Window
EnvLogNpToggle.IsCheckedChanged += (_, _) => EnvLogNpToggle.IsCheckedChanged += (_, _) =>
SetEnvironmentToggle("SHARPEMU_LOG_NP", EnvLogNpToggle.IsChecked == true); SetEnvironmentToggle("SHARPEMU_LOG_NP", EnvLogNpToggle.IsChecked == true);
EnvGuestImageCpuSyncToggle.IsCheckedChanged += (_, _) => EnvGuestImageCpuSyncToggle.IsCheckedChanged += (_, _) =>
SetGuestImageCpuSync(EnvGuestImageCpuSyncToggle.IsChecked == true); SetEnvironmentToggle(
"SHARPEMU_GUEST_IMAGE_CPU_SYNC",
EnvGuestImageCpuSyncToggle.IsChecked == true);
LanguageBox.SelectionChanged += (_, _) => OnLanguageChanged(); LanguageBox.SelectionChanged += (_, _) => OnLanguageChanged();
GameList.AddHandler(ContextRequestedEvent, OnGameContextRequested, RoutingStrategies.Tunnel); GameList.AddHandler(ContextRequestedEvent, OnGameContextRequested, RoutingStrategies.Tunnel);
@@ -853,10 +855,8 @@ public partial class MainWindow : Window
EnvLogDirectMemoryToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_DIRECT_MEMORY"); EnvLogDirectMemoryToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_DIRECT_MEMORY");
EnvLogIoToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_IO"); EnvLogIoToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_IO");
EnvLogNpToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_NP"); EnvLogNpToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_NP");
EnvGuestImageCpuSyncToggle.IsChecked = IsEnvironmentEnabled( EnvGuestImageCpuSyncToggle.IsChecked =
_settings.EnvironmentToggles, _settings.EnvironmentToggles.Contains("SHARPEMU_GUEST_IMAGE_CPU_SYNC");
"SHARPEMU_GUEST_IMAGE_CPU_SYNC",
defaultValue: true);
WindowModeBox.SelectedIndex = ChoiceIndex(_settings.WindowMode, "Windowed", "Borderless", "Exclusive"); WindowModeBox.SelectedIndex = ChoiceIndex(_settings.WindowMode, "Windowed", "Borderless", "Exclusive");
LoadHostDisplayOptions(); LoadHostDisplayOptions();
ScalingModeBox.SelectedIndex = ChoiceIndex(_settings.ScalingMode, "Fit", "Cover", "Stretch", "Integer"); ScalingModeBox.SelectedIndex = ChoiceIndex(_settings.ScalingMode, "Fit", "Cover", "Stretch", "Integer");
@@ -1083,40 +1083,6 @@ public partial class MainWindow : Window
} }
} }
private void SetGuestImageCpuSync(bool enabled)
{
const string name = "SHARPEMU_GUEST_IMAGE_CPU_SYNC";
_settings.EnvironmentToggles.RemoveAll(entry =>
string.Equals(entry, name, StringComparison.OrdinalIgnoreCase) ||
string.Equals(entry, name + "=0", StringComparison.OrdinalIgnoreCase));
if (!enabled)
{
_settings.EnvironmentToggles.Add(name + "=0");
}
}
private static bool IsEnvironmentEnabled(
IEnumerable<string> entries,
string name,
bool defaultValue)
{
foreach (var entry in entries)
{
if (string.Equals(entry, name + "=0", StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (string.Equals(entry, name, StringComparison.OrdinalIgnoreCase) ||
string.Equals(entry, name + "=1", StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return defaultValue;
}
private string SelectedLogLevel() private string SelectedLogLevel()
{ {
return LogLevelBox.SelectedIndex switch return LogLevelBox.SelectedIndex switch
+4 -11
View File
@@ -241,7 +241,7 @@ public sealed class PerGameSettingsDialog : Window
_hdrMode.SelectedItem = ChoiceOrDefault(HdrModes, global.HdrMode, "Auto"); _hdrMode.SelectedItem = ChoiceOrDefault(HdrModes, global.HdrMode, "Auto");
foreach (var (name, box) in _envBoxes) foreach (var (name, box) in _envBoxes)
{ {
box.IsChecked = IsEnvironmentEnabled(global.EnvironmentToggles, name, defaultValue: name == "SHARPEMU_GUEST_IMAGE_CPU_SYNC"); box.IsChecked = IsEnvironmentEnabled(global.EnvironmentToggles, name, defaultValue: false);
} }
if (existing is null) if (existing is null)
@@ -295,7 +295,7 @@ public sealed class PerGameSettingsDialog : Window
_envRow.IsOverridden = true; _envRow.IsOverridden = true;
foreach (var (name, box) in _envBoxes) foreach (var (name, box) in _envBoxes)
{ {
box.IsChecked = IsEnvironmentEnabled(env, name, defaultValue: name == "SHARPEMU_GUEST_IMAGE_CPU_SYNC"); box.IsChecked = IsEnvironmentEnabled(env, name, defaultValue: false);
} }
} }
} }
@@ -396,17 +396,10 @@ public sealed class PerGameSettingsDialog : Window
private List<string> BuildEnvironmentEntries() private List<string> BuildEnvironmentEntries()
{ {
const string guestImageCpuSync = "SHARPEMU_GUEST_IMAGE_CPU_SYNC"; return _envBoxes
var entries = _envBoxes .Where(entry => entry.Box.IsChecked == true)
.Where(entry => entry.Name != guestImageCpuSync && entry.Box.IsChecked == true)
.Select(entry => entry.Name) .Select(entry => entry.Name)
.ToList(); .ToList();
if (_envBoxes.First(entry => entry.Name == guestImageCpuSync).Box.IsChecked != true)
{
entries.Add(guestImageCpuSync + "=0");
}
return entries;
} }
private static bool IsEnvironmentEnabled( private static bool IsEnvironmentEnabled(
+2 -5
View File
@@ -87,13 +87,10 @@ public static unsafe class GuestImageWriteTracker
private static RangeSnapshot _rangeSnapshot = RangeSnapshot.Empty; private static RangeSnapshot _rangeSnapshot = RangeSnapshot.Empty;
// CPU-written guest image synchronization is the compatible default. A few
// titles (currently GTA V) require the lower-overhead watch-only path and
// opt out explicitly with SHARPEMU_GUEST_IMAGE_CPU_SYNC=0.
private static readonly bool _enabled = private static readonly bool _enabled =
!string.Equals( string.Equals(
Environment.GetEnvironmentVariable("SHARPEMU_GUEST_IMAGE_CPU_SYNC"), Environment.GetEnvironmentVariable("SHARPEMU_GUEST_IMAGE_CPU_SYNC"),
"0", "1",
StringComparison.Ordinal); StringComparison.Ordinal);
private static readonly (bool Wildcard, ulong[] Addresses) _lifetimeTraceFilter = private static readonly (bool Wildcard, ulong[] Addresses) _lifetimeTraceFilter =
ParseAddressList(Environment.GetEnvironmentVariable("SHARPEMU_TRACE_GUEST_IMAGE_ADDRS")); ParseAddressList(Environment.GetEnvironmentVariable("SHARPEMU_TRACE_GUEST_IMAGE_ADDRS"));