mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-07-25 15:19:50 -06:00

Metal sounded like a good idea to get in the emulator but frankly I underestimated just how experimental and not ready it was. From my write up in the Discord: ``` As is, Metal supports only a few games. The games it does support freeze on first use of not playing them via Vulkan, because shader translation is broken. So you need to use a dirty hack to not delete all your shaders. Not to mention it breaks many games via MoltenVK because of changes to the shared GPU code. Merging Metal seemed like a great idea, because of the few games it does support. But I don't think it's worth it. Many of the games it breaks via MoltenVK *don't work via Metal*. Which effectively makes current Ryubing worse for Mac users than Ryujinx 1.1.1403. I think what I'm gonna do is revert Metal, and reopen it as a PR. That way, you can still take advantage of the Metal backend as is, but without making other games worse with no solution. ``` For what it's worth, the shader translation part could at least be "fixed" by always applying a 30ms delay for shader translation to Metal. That being said, that solution sucks ass. The MoltenVK regressions are even worse. I hope this is not a let down to the Mac users. I hope you realize I'm reverting this because you're actively getting a worse experience with it in the emulator.
121 lines
3.8 KiB
C#
121 lines
3.8 KiB
C#
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Input;
|
|
using FluentAvalonia.UI.Controls;
|
|
using Ryujinx.Ava.Common.Locale;
|
|
using Ryujinx.Ava.UI.ViewModels;
|
|
using Ryujinx.HLE.FileSystem;
|
|
using Ryujinx.Input;
|
|
using System;
|
|
using System.Linq;
|
|
using Key = Avalonia.Input.Key;
|
|
|
|
namespace Ryujinx.Ava.UI.Windows
|
|
{
|
|
public partial class SettingsWindow : StyleableAppWindow
|
|
{
|
|
internal readonly SettingsViewModel ViewModel;
|
|
|
|
public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
|
|
{
|
|
Title = RyujinxApp.FormatTitle(LocaleKeys.Settings);
|
|
|
|
DataContext = ViewModel = new SettingsViewModel(virtualFileSystem, contentManager);
|
|
|
|
ViewModel.CloseWindow += Close;
|
|
ViewModel.SaveSettingsEvent += SaveSettings;
|
|
|
|
InitializeComponent();
|
|
Load();
|
|
|
|
#if DEBUG
|
|
this.AttachDevTools(new KeyGesture(Key.F12, KeyModifiers.Alt));
|
|
#endif
|
|
}
|
|
|
|
public SettingsWindow()
|
|
{
|
|
DataContext = ViewModel = new SettingsViewModel();
|
|
|
|
InitializeComponent();
|
|
Load();
|
|
}
|
|
|
|
public void SaveSettings()
|
|
{
|
|
InputPage.InputView?.SaveCurrentProfile();
|
|
|
|
if (Owner is MainWindow window && ViewModel.GameListNeedsRefresh)
|
|
{
|
|
window.LoadApplications();
|
|
}
|
|
}
|
|
|
|
private void Load()
|
|
{
|
|
Pages.Children.Clear();
|
|
NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
|
|
NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
|
|
}
|
|
|
|
private void NavPanelOnSelectionChanged(object sender, NavigationViewSelectionChangedEventArgs e)
|
|
{
|
|
if (e.SelectedItem is NavigationViewItem navItem && navItem.Tag is not null)
|
|
{
|
|
switch (navItem.Tag.ToString())
|
|
{
|
|
case "UiPage":
|
|
UiPage.ViewModel = ViewModel;
|
|
NavPanel.Content = UiPage;
|
|
break;
|
|
case "InputPage":
|
|
NavPanel.Content = InputPage;
|
|
break;
|
|
case "HotkeysPage":
|
|
NavPanel.Content = HotkeysPage;
|
|
break;
|
|
case "SystemPage":
|
|
SystemPage.ViewModel = ViewModel;
|
|
NavPanel.Content = SystemPage;
|
|
break;
|
|
case "CpuPage":
|
|
NavPanel.Content = CpuPage;
|
|
break;
|
|
case "GraphicsPage":
|
|
NavPanel.Content = GraphicsPage;
|
|
break;
|
|
case "AudioPage":
|
|
NavPanel.Content = AudioPage;
|
|
break;
|
|
case "NetworkPage":
|
|
NetworkPage.ViewModel = ViewModel;
|
|
NavPanel.Content = NetworkPage;
|
|
break;
|
|
case "LoggingPage":
|
|
NavPanel.Content = LoggingPage;
|
|
break;
|
|
case nameof(HacksPage):
|
|
HacksPage.DataContext = ViewModel;
|
|
NavPanel.Content = HacksPage;
|
|
break;
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnClosing(WindowClosingEventArgs e)
|
|
{
|
|
HotkeysPage.Dispose();
|
|
|
|
foreach (IGamepad gamepad in RyujinxApp.MainWindow.InputManager.GamepadDriver.GetGamepads())
|
|
{
|
|
gamepad?.ClearLed();
|
|
}
|
|
|
|
InputPage.Dispose();
|
|
base.OnClosing(e);
|
|
}
|
|
}
|
|
}
|