Merge branch 'master' into master
This commit is contained in:
commit
be9ff1eaae
@ -1,4 +1,6 @@
|
|||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
|
using Ryujinx.Common.Logging;
|
||||||
|
using Ryujinx.Graphics.GAL.Multithreading;
|
||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
@ -10,6 +12,20 @@ namespace Ryujinx.Graphics.GAL
|
|||||||
|
|
||||||
bool PreferThreading { get; }
|
bool PreferThreading { get; }
|
||||||
|
|
||||||
|
public IRenderer TryMakeThreaded(BackendThreading backendThreading = BackendThreading.Auto)
|
||||||
|
{
|
||||||
|
if (backendThreading is BackendThreading.On ||
|
||||||
|
(backendThreading is BackendThreading.Auto && PreferThreading))
|
||||||
|
{
|
||||||
|
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({backendThreading}): True");
|
||||||
|
return new ThreadedRenderer(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({backendThreading}): False");
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
IPipeline Pipeline { get; }
|
IPipeline Pipeline { get; }
|
||||||
|
|
||||||
IWindow Window { get; }
|
IWindow Window { get; }
|
||||||
|
@ -19,7 +19,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm
|
|||||||
|
|
||||||
private readonly LanDiscovery _lanDiscovery;
|
private readonly LanDiscovery _lanDiscovery;
|
||||||
|
|
||||||
public LdnMitmClient(HLEConfiguration config)
|
public LdnMitmClient(HleConfiguration config)
|
||||||
{
|
{
|
||||||
UnicastIPAddressInformation localIpInterface = NetworkHelpers.GetLocalInterface(config.MultiplayerLanInterfaceId).Item2;
|
UnicastIPAddressInformation localIpInterface = NetworkHelpers.GetLocalInterface(config.MultiplayerLanInterfaceId).Item2;
|
||||||
|
|
||||||
|
@ -51,13 +51,13 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu
|
|||||||
private string _passphrase;
|
private string _passphrase;
|
||||||
private byte[] _gameVersion = new byte[0x10];
|
private byte[] _gameVersion = new byte[0x10];
|
||||||
|
|
||||||
private readonly HLEConfiguration _config;
|
private readonly HleConfiguration _config;
|
||||||
|
|
||||||
public event EventHandler<NetworkChangeEventArgs> NetworkChange;
|
public event EventHandler<NetworkChangeEventArgs> NetworkChange;
|
||||||
|
|
||||||
public ProxyConfig Config { get; private set; }
|
public ProxyConfig Config { get; private set; }
|
||||||
|
|
||||||
public LdnMasterProxyClient(string address, int port, HLEConfiguration config) : base(address, port)
|
public LdnMasterProxyClient(string address, int port, HleConfiguration config) : base(address, port)
|
||||||
{
|
{
|
||||||
if (ProxyHelpers.SupportsNoDelay())
|
if (ProxyHelpers.SupportsNoDelay())
|
||||||
{
|
{
|
||||||
|
@ -15,55 +15,55 @@ namespace Ryujinx.HLE
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// HLE configuration.
|
/// HLE configuration.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class HLEConfiguration
|
public class HleConfiguration
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The virtual file system used by the FS service.
|
/// The virtual file system used by the FS service.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly VirtualFileSystem VirtualFileSystem;
|
internal VirtualFileSystem VirtualFileSystem { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The manager for handling a LibHac Horizon instance.
|
/// The manager for handling a LibHac Horizon instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly LibHacHorizonManager LibHacHorizonManager;
|
internal LibHacHorizonManager LibHacHorizonManager { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The account manager used by the account service.
|
/// The account manager used by the account service.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly AccountManager AccountManager;
|
internal AccountManager AccountManager { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The content manager used by the NCM service.
|
/// The content manager used by the NCM service.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly ContentManager ContentManager;
|
internal ContentManager ContentManager { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The persistent information between run for multi-application capabilities.
|
/// The persistent information between run for multi-application capabilities.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
public readonly UserChannelPersistence UserChannelPersistence;
|
public UserChannelPersistence UserChannelPersistence { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The GPU renderer to use for all GPU operations.
|
/// The GPU renderer to use for all GPU operations.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly IRenderer GpuRenderer;
|
internal IRenderer GpuRenderer { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The audio device driver to use for all audio operations.
|
/// The audio device driver to use for all audio operations.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly IHardwareDeviceDriver AudioDeviceDriver;
|
internal IHardwareDeviceDriver AudioDeviceDriver { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The handler for various UI related operations needed outside of HLE.
|
/// The handler for various UI related operations needed outside of HLE.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
internal readonly IHostUIHandler HostUIHandler;
|
internal IHostUIHandler HostUIHandler { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Control the memory configuration used by the emulation context.
|
/// Control the memory configuration used by the emulation context.
|
||||||
@ -195,15 +195,7 @@ namespace Ryujinx.HLE
|
|||||||
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
/// <remarks>This cannot be changed after <see cref="Switch"/> instantiation.</remarks>
|
||||||
public EnabledDirtyHack[] Hacks { internal get; set; }
|
public EnabledDirtyHack[] Hacks { internal get; set; }
|
||||||
|
|
||||||
public HLEConfiguration(VirtualFileSystem virtualFileSystem,
|
public HleConfiguration(MemoryConfiguration memoryConfiguration,
|
||||||
LibHacHorizonManager libHacHorizonManager,
|
|
||||||
ContentManager contentManager,
|
|
||||||
AccountManager accountManager,
|
|
||||||
UserChannelPersistence userChannelPersistence,
|
|
||||||
IRenderer gpuRenderer,
|
|
||||||
IHardwareDeviceDriver audioDeviceDriver,
|
|
||||||
MemoryConfiguration memoryConfiguration,
|
|
||||||
IHostUIHandler hostUIHandler,
|
|
||||||
SystemLanguage systemLanguage,
|
SystemLanguage systemLanguage,
|
||||||
RegionCode region,
|
RegionCode region,
|
||||||
VSyncMode vSyncMode,
|
VSyncMode vSyncMode,
|
||||||
@ -227,15 +219,7 @@ namespace Ryujinx.HLE
|
|||||||
int customVSyncInterval,
|
int customVSyncInterval,
|
||||||
EnabledDirtyHack[] dirtyHacks = null)
|
EnabledDirtyHack[] dirtyHacks = null)
|
||||||
{
|
{
|
||||||
VirtualFileSystem = virtualFileSystem;
|
|
||||||
LibHacHorizonManager = libHacHorizonManager;
|
|
||||||
AccountManager = accountManager;
|
|
||||||
ContentManager = contentManager;
|
|
||||||
UserChannelPersistence = userChannelPersistence;
|
|
||||||
GpuRenderer = gpuRenderer;
|
|
||||||
AudioDeviceDriver = audioDeviceDriver;
|
|
||||||
MemoryConfiguration = memoryConfiguration;
|
MemoryConfiguration = memoryConfiguration;
|
||||||
HostUIHandler = hostUIHandler;
|
|
||||||
SystemLanguage = systemLanguage;
|
SystemLanguage = systemLanguage;
|
||||||
Region = region;
|
Region = region;
|
||||||
VSyncMode = vSyncMode;
|
VSyncMode = vSyncMode;
|
||||||
@ -259,5 +243,30 @@ namespace Ryujinx.HLE
|
|||||||
MultiplayerLdnServer = multiplayerLdnServer;
|
MultiplayerLdnServer = multiplayerLdnServer;
|
||||||
Hacks = dirtyHacks ?? [];
|
Hacks = dirtyHacks ?? [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the pre-configured services to use for this <see cref="HleConfiguration"/> instance.
|
||||||
|
/// </summary>
|
||||||
|
public HleConfiguration Configure(
|
||||||
|
VirtualFileSystem virtualFileSystem,
|
||||||
|
LibHacHorizonManager libHacHorizonManager,
|
||||||
|
ContentManager contentManager,
|
||||||
|
AccountManager accountManager,
|
||||||
|
UserChannelPersistence userChannelPersistence,
|
||||||
|
IRenderer gpuRenderer,
|
||||||
|
IHardwareDeviceDriver audioDeviceDriver,
|
||||||
|
IHostUIHandler hostUIHandler
|
||||||
|
)
|
||||||
|
{
|
||||||
|
VirtualFileSystem = virtualFileSystem;
|
||||||
|
LibHacHorizonManager = libHacHorizonManager;
|
||||||
|
AccountManager = accountManager;
|
||||||
|
ContentManager = contentManager;
|
||||||
|
UserChannelPersistence = userChannelPersistence;
|
||||||
|
GpuRenderer = gpuRenderer;
|
||||||
|
AudioDeviceDriver = audioDeviceDriver;
|
||||||
|
HostUIHandler = hostUIHandler;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,7 +20,7 @@ namespace Ryujinx.HLE
|
|||||||
{
|
{
|
||||||
public static Switch Shared { get; private set; }
|
public static Switch Shared { get; private set; }
|
||||||
|
|
||||||
public HLEConfiguration Configuration { get; }
|
public HleConfiguration Configuration { get; }
|
||||||
public IHardwareDeviceDriver AudioDeviceDriver { get; }
|
public IHardwareDeviceDriver AudioDeviceDriver { get; }
|
||||||
public MemoryBlock Memory { get; }
|
public MemoryBlock Memory { get; }
|
||||||
public GpuContext Gpu { get; }
|
public GpuContext Gpu { get; }
|
||||||
@ -44,7 +44,7 @@ namespace Ryujinx.HLE
|
|||||||
|
|
||||||
public DirtyHacks DirtyHacks { get; }
|
public DirtyHacks DirtyHacks { get; }
|
||||||
|
|
||||||
public Switch(HLEConfiguration configuration)
|
public Switch(HleConfiguration configuration)
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(configuration.GpuRenderer);
|
ArgumentNullException.ThrowIfNull(configuration.GpuRenderer);
|
||||||
ArgumentNullException.ThrowIfNull(configuration.AudioDeviceDriver);
|
ArgumentNullException.ThrowIfNull(configuration.AudioDeviceDriver);
|
||||||
@ -94,16 +94,20 @@ namespace Ryujinx.HLE
|
|||||||
Gpu.GPFifo.DispatchCalls();
|
Gpu.GPFifo.DispatchCalls();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void IncrementCustomVSyncInterval()
|
public int IncrementCustomVSyncInterval()
|
||||||
{
|
{
|
||||||
CustomVSyncInterval += 1;
|
CustomVSyncInterval += 1;
|
||||||
UpdateVSyncInterval();
|
UpdateVSyncInterval();
|
||||||
|
|
||||||
|
return CustomVSyncInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DecrementCustomVSyncInterval()
|
public int DecrementCustomVSyncInterval()
|
||||||
{
|
{
|
||||||
CustomVSyncInterval -= 1;
|
CustomVSyncInterval -= 1;
|
||||||
UpdateVSyncInterval();
|
UpdateVSyncInterval();
|
||||||
|
|
||||||
|
return CustomVSyncInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateVSyncInterval()
|
public void UpdateVSyncInterval()
|
||||||
|
@ -902,53 +902,19 @@ namespace Ryujinx.Ava
|
|||||||
_ => new OpenGLRenderer()
|
_ => new OpenGLRenderer()
|
||||||
};
|
};
|
||||||
|
|
||||||
BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading;
|
|
||||||
|
|
||||||
bool isGALThreaded = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading);
|
|
||||||
if (isGALThreaded)
|
|
||||||
{
|
|
||||||
renderer = new ThreadedRenderer(renderer);
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
|
|
||||||
|
|
||||||
// Initialize Configuration.
|
// Initialize Configuration.
|
||||||
MemoryConfiguration memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value;
|
Device = new Switch(ConfigurationState.Instance.CreateHleConfiguration()
|
||||||
|
.Configure(
|
||||||
Device = new Switch(new HLEConfiguration(
|
VirtualFileSystem,
|
||||||
VirtualFileSystem,
|
_viewModel.LibHacHorizonManager,
|
||||||
_viewModel.LibHacHorizonManager,
|
ContentManager,
|
||||||
ContentManager,
|
_accountManager,
|
||||||
_accountManager,
|
_userChannelPersistence,
|
||||||
_userChannelPersistence,
|
renderer.TryMakeThreaded(ConfigurationState.Instance.Graphics.BackendThreading),
|
||||||
renderer,
|
InitializeAudio(),
|
||||||
InitializeAudio(),
|
_viewModel.UiHandler
|
||||||
memoryConfiguration,
|
)
|
||||||
_viewModel.UiHandler,
|
);
|
||||||
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
|
||||||
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
|
||||||
ConfigurationState.Instance.Graphics.VSyncMode,
|
|
||||||
ConfigurationState.Instance.System.EnableDockedMode,
|
|
||||||
ConfigurationState.Instance.System.EnablePtc,
|
|
||||||
ConfigurationState.Instance.System.EnableInternetAccess,
|
|
||||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
|
||||||
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
|
||||||
ConfigurationState.Instance.System.MatchSystemTime
|
|
||||||
? 0
|
|
||||||
: ConfigurationState.Instance.System.SystemTimeOffset,
|
|
||||||
ConfigurationState.Instance.System.TimeZone,
|
|
||||||
ConfigurationState.Instance.System.MemoryManagerMode,
|
|
||||||
ConfigurationState.Instance.System.IgnoreMissingServices,
|
|
||||||
ConfigurationState.Instance.Graphics.AspectRatio,
|
|
||||||
ConfigurationState.Instance.System.AudioVolume,
|
|
||||||
ConfigurationState.Instance.System.UseHypervisor,
|
|
||||||
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
|
|
||||||
ConfigurationState.Instance.Multiplayer.Mode,
|
|
||||||
ConfigurationState.Instance.Multiplayer.DisableP2p,
|
|
||||||
ConfigurationState.Instance.Multiplayer.LdnPassphrase,
|
|
||||||
ConfigurationState.Instance.Multiplayer.GetLdnServer(),
|
|
||||||
ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value,
|
|
||||||
ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : null));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IHardwareDeviceDriver InitializeAudio()
|
private static IHardwareDeviceDriver InitializeAudio()
|
||||||
@ -1182,6 +1148,9 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
private void UpdateShaderCount()
|
private void UpdateShaderCount()
|
||||||
{
|
{
|
||||||
|
if (_displayCount is 0 && _renderer.ProgramCount is 0)
|
||||||
|
return;
|
||||||
|
|
||||||
// If there is a mismatch between total program compile and previous count
|
// If there is a mismatch between total program compile and previous count
|
||||||
// this means new shaders have been compiled and should be displayed.
|
// this means new shaders have been compiled and should be displayed.
|
||||||
if (_renderer.ProgramCount != _previousCount)
|
if (_renderer.ProgramCount != _previousCount)
|
||||||
@ -1255,12 +1224,10 @@ namespace Ryujinx.Ava
|
|||||||
VSyncModeToggle();
|
VSyncModeToggle();
|
||||||
break;
|
break;
|
||||||
case KeyboardHotkeyState.CustomVSyncIntervalDecrement:
|
case KeyboardHotkeyState.CustomVSyncIntervalDecrement:
|
||||||
Device.DecrementCustomVSyncInterval();
|
_viewModel.CustomVSyncInterval = Device.DecrementCustomVSyncInterval();
|
||||||
_viewModel.CustomVSyncInterval -= 1;
|
|
||||||
break;
|
break;
|
||||||
case KeyboardHotkeyState.CustomVSyncIntervalIncrement:
|
case KeyboardHotkeyState.CustomVSyncIntervalIncrement:
|
||||||
Device.IncrementCustomVSyncInterval();
|
_viewModel.CustomVSyncInterval = Device.IncrementCustomVSyncInterval();
|
||||||
_viewModel.CustomVSyncInterval += 1;
|
|
||||||
break;
|
break;
|
||||||
case KeyboardHotkeyState.Screenshot:
|
case KeyboardHotkeyState.Screenshot:
|
||||||
ScreenshotRequested = true;
|
ScreenshotRequested = true;
|
||||||
|
@ -312,49 +312,42 @@ namespace Ryujinx.Headless
|
|||||||
return new OpenGLRenderer();
|
return new OpenGLRenderer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options)
|
private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) =>
|
||||||
{
|
new(
|
||||||
BackendThreading threadingMode = options.BackendThreading;
|
new HleConfiguration(
|
||||||
|
options.DramSize,
|
||||||
bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading);
|
options.SystemLanguage,
|
||||||
|
options.SystemRegion,
|
||||||
if (threadedGAL)
|
options.VSyncMode,
|
||||||
{
|
!options.DisableDockedMode,
|
||||||
renderer = new ThreadedRenderer(renderer);
|
!options.DisablePTC,
|
||||||
}
|
options.EnableInternetAccess,
|
||||||
|
!options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||||
HLEConfiguration configuration = new(_virtualFileSystem,
|
options.FsGlobalAccessLogMode,
|
||||||
_libHacHorizonManager,
|
options.SystemTimeOffset,
|
||||||
_contentManager,
|
options.SystemTimeZone,
|
||||||
_accountManager,
|
options.MemoryManagerMode,
|
||||||
_userChannelPersistence,
|
options.IgnoreMissingServices,
|
||||||
renderer,
|
options.AspectRatio,
|
||||||
new SDL2HardwareDeviceDriver(),
|
options.AudioVolume,
|
||||||
options.DramSize,
|
options.UseHypervisor ?? true,
|
||||||
window,
|
options.MultiplayerLanInterfaceId,
|
||||||
options.SystemLanguage,
|
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
|
||||||
options.SystemRegion,
|
false,
|
||||||
options.VSyncMode,
|
string.Empty,
|
||||||
!options.DisableDockedMode,
|
string.Empty,
|
||||||
!options.DisablePTC,
|
options.CustomVSyncInterval
|
||||||
options.EnableInternetAccess,
|
)
|
||||||
!options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
.Configure(
|
||||||
options.FsGlobalAccessLogMode,
|
_virtualFileSystem,
|
||||||
options.SystemTimeOffset,
|
_libHacHorizonManager,
|
||||||
options.SystemTimeZone,
|
_contentManager,
|
||||||
options.MemoryManagerMode,
|
_accountManager,
|
||||||
options.IgnoreMissingServices,
|
_userChannelPersistence,
|
||||||
options.AspectRatio,
|
renderer.TryMakeThreaded(options.BackendThreading),
|
||||||
options.AudioVolume,
|
new SDL2HardwareDeviceDriver(),
|
||||||
options.UseHypervisor ?? true,
|
window
|
||||||
options.MultiplayerLanInterfaceId,
|
)
|
||||||
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
|
);
|
||||||
false,
|
|
||||||
string.Empty,
|
|
||||||
string.Empty,
|
|
||||||
options.CustomVSyncInterval);
|
|
||||||
|
|
||||||
return new Switch(configuration);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ using Avalonia.Controls.ApplicationLifetimes;
|
|||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Layout;
|
using Avalonia.Layout;
|
||||||
using Avalonia.Media;
|
using Avalonia.Media;
|
||||||
|
using Avalonia.Styling;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using FluentAvalonia.Core;
|
using FluentAvalonia.Core;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
@ -21,6 +22,23 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
private static bool _isChoiceDialogOpen;
|
private static bool _isChoiceDialogOpen;
|
||||||
private static ContentDialogOverlayWindow _contentDialogOverlayWindow;
|
private static ContentDialogOverlayWindow _contentDialogOverlayWindow;
|
||||||
|
|
||||||
|
public static ContentDialog ApplyStyles(
|
||||||
|
this ContentDialog contentDialog,
|
||||||
|
double closeButtonWidth = 80,
|
||||||
|
HorizontalAlignment buttonSpaceAlignment = HorizontalAlignment.Right)
|
||||||
|
{
|
||||||
|
Style closeButton = new(x => x.Name("CloseButton"));
|
||||||
|
closeButton.Setters.Add(new Setter(Layoutable.WidthProperty, closeButtonWidth));
|
||||||
|
|
||||||
|
Style closeButtonParent = new(x => x.Name("CommandSpace"));
|
||||||
|
closeButtonParent.Setters.Add(new Setter(Layoutable.HorizontalAlignmentProperty, buttonSpaceAlignment));
|
||||||
|
|
||||||
|
contentDialog.Styles.Add(closeButton);
|
||||||
|
contentDialog.Styles.Add(closeButtonParent);
|
||||||
|
|
||||||
|
return contentDialog;
|
||||||
|
}
|
||||||
|
|
||||||
private async static Task<UserResult> ShowContentDialog(
|
private async static Task<UserResult> ShowContentDialog(
|
||||||
string title,
|
string title,
|
||||||
object content,
|
object content,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Input.Platform;
|
using Avalonia.Input.Platform;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Layout;
|
||||||
using Avalonia.Styling;
|
using Avalonia.Styling;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
@ -29,17 +30,7 @@ namespace Ryujinx.Ava.UI.Views.Misc
|
|||||||
Content = new ApplicationDataView { ViewModel = new ApplicationDataViewModel(appData) }
|
Content = new ApplicationDataView { ViewModel = new ApplicationDataViewModel(appData) }
|
||||||
};
|
};
|
||||||
|
|
||||||
Style closeButton = new(x => x.Name("CloseButton"));
|
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles(160, HorizontalAlignment.Center));
|
||||||
closeButton.Setters.Add(new Setter(WidthProperty, 160d));
|
|
||||||
|
|
||||||
Style closeButtonParent = new(x => x.Name("CommandSpace"));
|
|
||||||
closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty,
|
|
||||||
Avalonia.Layout.HorizontalAlignment.Center));
|
|
||||||
|
|
||||||
contentDialog.Styles.Add(closeButton);
|
|
||||||
contentDialog.Styles.Add(closeButtonParent);
|
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApplicationDataView()
|
public ApplicationDataView()
|
||||||
|
@ -32,17 +32,7 @@ namespace Ryujinx.Ava.UI.Views.Misc
|
|||||||
Content = new DlcSelectView { ViewModel = viewModel }
|
Content = new DlcSelectView { ViewModel = viewModel }
|
||||||
};
|
};
|
||||||
|
|
||||||
Style closeButton = new(x => x.Name("CloseButton"));
|
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
|
||||||
closeButton.Setters.Add(new Setter(WidthProperty, 80d));
|
|
||||||
|
|
||||||
Style closeButtonParent = new(x => x.Name("CommandSpace"));
|
|
||||||
closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty,
|
|
||||||
Avalonia.Layout.HorizontalAlignment.Right));
|
|
||||||
|
|
||||||
contentDialog.Styles.Add(closeButton);
|
|
||||||
contentDialog.Styles.Add(closeButtonParent);
|
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog);
|
|
||||||
|
|
||||||
return viewModel.SelectedDlc;
|
return viewModel.SelectedDlc;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ using Avalonia.Layout;
|
|||||||
using Avalonia.Styling;
|
using Avalonia.Styling;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
|
using Ryujinx.Ava.UI.Controls;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
@ -14,7 +15,7 @@ using Button = Avalonia.Controls.Button;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Windows
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class AboutWindow : UserControl
|
public partial class AboutWindow : RyujinxControl<AboutWindowViewModel>
|
||||||
{
|
{
|
||||||
public AboutWindow()
|
public AboutWindow()
|
||||||
{
|
{
|
||||||
@ -33,19 +34,10 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
SecondaryButtonText = string.Empty,
|
SecondaryButtonText = string.Empty,
|
||||||
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
|
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
|
||||||
Content = new AboutWindow { DataContext = viewModel }
|
Content = new AboutWindow { ViewModel = viewModel }
|
||||||
};
|
};
|
||||||
|
|
||||||
Style closeButton = new(x => x.Name("CloseButton"));
|
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
|
||||||
closeButton.Setters.Add(new Setter(WidthProperty, 80d));
|
|
||||||
|
|
||||||
Style closeButtonParent = new(x => x.Name("CommandSpace"));
|
|
||||||
closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty, HorizontalAlignment.Right));
|
|
||||||
|
|
||||||
contentDialog.Styles.Add(closeButton);
|
|
||||||
contentDialog.Styles.Add(closeButtonParent);
|
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Button_OnClick(object sender, RoutedEventArgs e)
|
private void Button_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
@ -25,16 +25,7 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Style closeButton = new(x => x.Name("CloseButton"));
|
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
|
||||||
closeButton.Setters.Add(new Setter(WidthProperty, 80d));
|
|
||||||
|
|
||||||
Style closeButtonParent = new(x => x.Name("CommandSpace"));
|
|
||||||
closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty, Avalonia.Layout.HorizontalAlignment.Right));
|
|
||||||
|
|
||||||
contentDialog.Styles.Add(closeButton);
|
|
||||||
contentDialog.Styles.Add(closeButtonParent);
|
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompatibilityList()
|
public CompatibilityList()
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using ARMeilleure;
|
using ARMeilleure;
|
||||||
using Gommon;
|
using Gommon;
|
||||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Ava.Utilities.Configuration.System;
|
using Ryujinx.Ava.Utilities.Configuration.System;
|
||||||
using Ryujinx.Ava.Utilities.Configuration.UI;
|
using Ryujinx.Ava.Utilities.Configuration.UI;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
@ -11,6 +11,7 @@ using Ryujinx.Common.Helper;
|
|||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
using Ryujinx.HLE;
|
using Ryujinx.HLE;
|
||||||
|
using Ryujinx.HLE.HOS.SystemState;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using RyuLogger = Ryujinx.Common.Logging.Logger;
|
using RyuLogger = Ryujinx.Common.Logging.Logger;
|
||||||
@ -19,7 +20,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
|||||||
{
|
{
|
||||||
public partial class ConfigurationState
|
public partial class ConfigurationState
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// UI configuration section
|
/// UI configuration section
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UISection
|
public class UISection
|
||||||
@ -838,5 +839,35 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
|||||||
EnableHardwareAcceleration = new ReactiveObject<bool>();
|
EnableHardwareAcceleration = new ReactiveObject<bool>();
|
||||||
HideCursor = new ReactiveObject<HideCursorMode>();
|
HideCursor = new ReactiveObject<HideCursorMode>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HleConfiguration CreateHleConfiguration() =>
|
||||||
|
new(
|
||||||
|
System.DramSize,
|
||||||
|
(SystemLanguage)System.Language.Value,
|
||||||
|
(RegionCode)System.Region.Value,
|
||||||
|
Graphics.VSyncMode,
|
||||||
|
System.EnableDockedMode,
|
||||||
|
System.EnablePtc,
|
||||||
|
System.EnableInternetAccess,
|
||||||
|
System.EnableFsIntegrityChecks
|
||||||
|
? IntegrityCheckLevel.ErrorOnInvalid
|
||||||
|
: IntegrityCheckLevel.None,
|
||||||
|
System.FsGlobalAccessLogMode,
|
||||||
|
System.MatchSystemTime
|
||||||
|
? 0
|
||||||
|
: System.SystemTimeOffset,
|
||||||
|
System.TimeZone,
|
||||||
|
System.MemoryManagerMode,
|
||||||
|
System.IgnoreMissingServices,
|
||||||
|
Graphics.AspectRatio,
|
||||||
|
System.AudioVolume,
|
||||||
|
System.UseHypervisor,
|
||||||
|
Multiplayer.LanInterfaceId,
|
||||||
|
Multiplayer.Mode,
|
||||||
|
Multiplayer.DisableP2p,
|
||||||
|
Multiplayer.LdnPassphrase,
|
||||||
|
Instance.Multiplayer.GetLdnServer(),
|
||||||
|
Instance.Graphics.CustomVSyncInterval,
|
||||||
|
Instance.Hacks.ShowDirtyHacks ? Instance.Hacks.EnabledHacks : null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,5 +327,5 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
|||||||
|
|
||||||
return GraphicsBackend.OpenGl;
|
return GraphicsBackend.OpenGl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user