mirror of
https://github.com/par274/sharpemu.git
synced 2026-07-30 06:29:46 +08:00
[cpu] made guest image cpu sync opt-in
This commit is contained in:
@@ -242,7 +242,9 @@ public partial class MainWindow : Window
|
||||
EnvLogNpToggle.IsCheckedChanged += (_, _) =>
|
||||
SetEnvironmentToggle("SHARPEMU_LOG_NP", EnvLogNpToggle.IsChecked == true);
|
||||
EnvGuestImageCpuSyncToggle.IsCheckedChanged += (_, _) =>
|
||||
SetGuestImageCpuSync(EnvGuestImageCpuSyncToggle.IsChecked == true);
|
||||
SetEnvironmentToggle(
|
||||
"SHARPEMU_GUEST_IMAGE_CPU_SYNC",
|
||||
EnvGuestImageCpuSyncToggle.IsChecked == true);
|
||||
LanguageBox.SelectionChanged += (_, _) => OnLanguageChanged();
|
||||
|
||||
GameList.AddHandler(ContextRequestedEvent, OnGameContextRequested, RoutingStrategies.Tunnel);
|
||||
@@ -853,10 +855,8 @@ public partial class MainWindow : Window
|
||||
EnvLogDirectMemoryToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_DIRECT_MEMORY");
|
||||
EnvLogIoToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_IO");
|
||||
EnvLogNpToggle.IsChecked = _settings.EnvironmentToggles.Contains("SHARPEMU_LOG_NP");
|
||||
EnvGuestImageCpuSyncToggle.IsChecked = IsEnvironmentEnabled(
|
||||
_settings.EnvironmentToggles,
|
||||
"SHARPEMU_GUEST_IMAGE_CPU_SYNC",
|
||||
defaultValue: true);
|
||||
EnvGuestImageCpuSyncToggle.IsChecked =
|
||||
_settings.EnvironmentToggles.Contains("SHARPEMU_GUEST_IMAGE_CPU_SYNC");
|
||||
WindowModeBox.SelectedIndex = ChoiceIndex(_settings.WindowMode, "Windowed", "Borderless", "Exclusive");
|
||||
LoadHostDisplayOptions();
|
||||
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()
|
||||
{
|
||||
return LogLevelBox.SelectedIndex switch
|
||||
|
||||
@@ -241,7 +241,7 @@ public sealed class PerGameSettingsDialog : Window
|
||||
_hdrMode.SelectedItem = ChoiceOrDefault(HdrModes, global.HdrMode, "Auto");
|
||||
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)
|
||||
@@ -295,7 +295,7 @@ public sealed class PerGameSettingsDialog : Window
|
||||
_envRow.IsOverridden = true;
|
||||
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()
|
||||
{
|
||||
const string guestImageCpuSync = "SHARPEMU_GUEST_IMAGE_CPU_SYNC";
|
||||
var entries = _envBoxes
|
||||
.Where(entry => entry.Name != guestImageCpuSync && entry.Box.IsChecked == true)
|
||||
return _envBoxes
|
||||
.Where(entry => entry.Box.IsChecked == true)
|
||||
.Select(entry => entry.Name)
|
||||
.ToList();
|
||||
if (_envBoxes.First(entry => entry.Name == guestImageCpuSync).Box.IsChecked != true)
|
||||
{
|
||||
entries.Add(guestImageCpuSync + "=0");
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
private static bool IsEnvironmentEnabled(
|
||||
|
||||
@@ -87,13 +87,10 @@ public static unsafe class GuestImageWriteTracker
|
||||
|
||||
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 =
|
||||
!string.Equals(
|
||||
string.Equals(
|
||||
Environment.GetEnvironmentVariable("SHARPEMU_GUEST_IMAGE_CPU_SYNC"),
|
||||
"0",
|
||||
"1",
|
||||
StringComparison.Ordinal);
|
||||
private static readonly (bool Wildcard, ulong[] Addresses) _lifetimeTraceFilter =
|
||||
ParseAddressList(Environment.GetEnvironmentVariable("SHARPEMU_TRACE_GUEST_IMAGE_ADDRS"));
|
||||
|
||||
Reference in New Issue
Block a user