Merge branch 'master' into fork/Jacobwasbeast/feature-playerSelect
This commit is contained in:
commit
696bc2081f
@ -3946,7 +3946,8 @@
|
|||||||
"zh_CN": "繁体中文(推荐)",
|
"zh_CN": "繁体中文(推荐)",
|
||||||
"zh_TW": "正體中文 (建議)"
|
"zh_TW": "正體中文 (建議)"
|
||||||
}
|
}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
"ID": "SettingsTabSystemSystemLanguageSwedish",
|
"ID": "SettingsTabSystemSystemLanguageSwedish",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
@ -3970,7 +3971,8 @@
|
|||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
"ID": "SettingsTabSystemSystemLanguageNorwegian",
|
"ID": "SettingsTabSystemSystemLanguageNorwegian",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
@ -22896,4 +22898,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -228,8 +228,6 @@ namespace Ryujinx.Headless
|
|||||||
_inputConfiguration ??= [];
|
_inputConfiguration ??= [];
|
||||||
_enableKeyboard = option.EnableKeyboard;
|
_enableKeyboard = option.EnableKeyboard;
|
||||||
_enableMouse = option.EnableMouse;
|
_enableMouse = option.EnableMouse;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1);
|
LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1);
|
||||||
LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2);
|
LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2);
|
||||||
@ -301,7 +299,10 @@ namespace Ryujinx.Headless
|
|||||||
_userChannelPersistence.ShouldRestart = false;
|
_userChannelPersistence.ShouldRestart = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inputManager.Dispose();
|
try
|
||||||
|
{
|
||||||
|
_inputManager.Dispose();
|
||||||
|
} catch {}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -338,12 +339,12 @@ namespace Ryujinx.Headless
|
|||||||
{
|
{
|
||||||
string label = state switch
|
string label = state switch
|
||||||
{
|
{
|
||||||
LoadState => $"PTC : {current}/{total}",
|
LoadState => "PTC",
|
||||||
ShaderCacheState => $"Shaders : {current}/{total}",
|
ShaderCacheState => "Shaders",
|
||||||
_ => throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}"),
|
_ => throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}")
|
||||||
};
|
};
|
||||||
|
|
||||||
Logger.Info?.Print(LogClass.Application, label);
|
Logger.Info?.Print(LogClass.Application, $"{label} : {current}/{total}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static WindowBase CreateWindow(Options options)
|
private static WindowBase CreateWindow(Options options)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 3.9 KiB |
@ -1,21 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace Ryujinx.Headless
|
|
||||||
{
|
|
||||||
class StatusUpdatedEventArgs(
|
|
||||||
string vSyncMode,
|
|
||||||
string dockedMode,
|
|
||||||
string aspectRatio,
|
|
||||||
string gameStatus,
|
|
||||||
string fifoStatus,
|
|
||||||
string gpuName)
|
|
||||||
: EventArgs
|
|
||||||
{
|
|
||||||
public string VSyncMode = vSyncMode;
|
|
||||||
public string DockedMode = dockedMode;
|
|
||||||
public string AspectRatio = aspectRatio;
|
|
||||||
public string GameStatus = gameStatus;
|
|
||||||
public string FifoStatus = fifoStatus;
|
|
||||||
public string GpuName = gpuName;
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,7 +26,7 @@ namespace Ryujinx.Headless
|
|||||||
bool ignoreControllerApplet)
|
bool ignoreControllerApplet)
|
||||||
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { }
|
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { }
|
||||||
|
|
||||||
public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_METAL;
|
public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_METAL;
|
||||||
|
|
||||||
protected override void InitializeWindowRenderer()
|
protected override void InitializeWindowRenderer()
|
||||||
{
|
{
|
@ -108,8 +108,7 @@ namespace Ryujinx.Headless
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly GraphicsDebugLevel _glLogLevel;
|
|
||||||
private SDL2OpenGLContext _openGLContext;
|
private SDL2OpenGLContext _openGLContext;
|
||||||
|
|
||||||
public OpenGLWindow(
|
public OpenGLWindow(
|
||||||
@ -121,15 +120,14 @@ namespace Ryujinx.Headless
|
|||||||
bool ignoreControllerApplet)
|
bool ignoreControllerApplet)
|
||||||
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet)
|
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet)
|
||||||
{
|
{
|
||||||
_glLogLevel = glLogLevel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_OPENGL;
|
public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_OPENGL;
|
||||||
|
|
||||||
protected override void InitializeWindowRenderer()
|
protected override void InitializeWindowRenderer()
|
||||||
{
|
{
|
||||||
// Ensure to not share this context with other contexts before this point.
|
// Ensure to not share this context with other contexts before this point.
|
||||||
SetupOpenGLAttributes(false, _glLogLevel);
|
SetupOpenGLAttributes(false, GlLogLevel);
|
||||||
nint context = SDL_GL_CreateContext(WindowHandle);
|
nint context = SDL_GL_CreateContext(WindowHandle);
|
||||||
CheckResult(SDL_GL_SetSwapInterval(1));
|
CheckResult(SDL_GL_SetSwapInterval(1));
|
||||||
|
|
@ -10,8 +10,6 @@ namespace Ryujinx.Headless
|
|||||||
{
|
{
|
||||||
class VulkanWindow : WindowBase
|
class VulkanWindow : WindowBase
|
||||||
{
|
{
|
||||||
private readonly GraphicsDebugLevel _glLogLevel;
|
|
||||||
|
|
||||||
public VulkanWindow(
|
public VulkanWindow(
|
||||||
InputManager inputManager,
|
InputManager inputManager,
|
||||||
GraphicsDebugLevel glLogLevel,
|
GraphicsDebugLevel glLogLevel,
|
||||||
@ -21,10 +19,9 @@ namespace Ryujinx.Headless
|
|||||||
bool ignoreControllerApplet)
|
bool ignoreControllerApplet)
|
||||||
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet)
|
: base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet)
|
||||||
{
|
{
|
||||||
_glLogLevel = glLogLevel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_VULKAN;
|
public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_VULKAN;
|
||||||
|
|
||||||
protected override void InitializeWindowRenderer() { }
|
protected override void InitializeWindowRenderer() { }
|
||||||
|
|
@ -1,12 +1,12 @@
|
|||||||
using Humanizer;
|
using Humanizer;
|
||||||
using LibHac.Tools.Fs;
|
|
||||||
using Ryujinx.Ava;
|
using Ryujinx.Ava;
|
||||||
|
using Ryujinx.Ava.UI.Models;
|
||||||
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Configuration.Hid;
|
using Ryujinx.Common.Configuration.Hid;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
using Ryujinx.Graphics.GAL.Multithreading;
|
using Ryujinx.Graphics.GAL.Multithreading;
|
||||||
using Ryujinx.Graphics.Gpu;
|
|
||||||
using Ryujinx.Graphics.OpenGL;
|
using Ryujinx.Graphics.OpenGL;
|
||||||
using Ryujinx.HLE.HOS.Applets;
|
using Ryujinx.HLE.HOS.Applets;
|
||||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||||
@ -54,8 +54,6 @@ namespace Ryujinx.Headless
|
|||||||
public Switch Device { get; private set; }
|
public Switch Device { get; private set; }
|
||||||
public IRenderer Renderer { get; private set; }
|
public IRenderer Renderer { get; private set; }
|
||||||
|
|
||||||
public event EventHandler<StatusUpdatedEventArgs> StatusUpdatedEvent;
|
|
||||||
|
|
||||||
protected nint WindowHandle { get; set; }
|
protected nint WindowHandle { get; set; }
|
||||||
|
|
||||||
public IHostUITheme HostUITheme { get; }
|
public IHostUITheme HostUITheme { get; }
|
||||||
@ -73,7 +71,7 @@ namespace Ryujinx.Headless
|
|||||||
protected SDL2MouseDriver MouseDriver;
|
protected SDL2MouseDriver MouseDriver;
|
||||||
private readonly InputManager _inputManager;
|
private readonly InputManager _inputManager;
|
||||||
private readonly IKeyboard _keyboardInterface;
|
private readonly IKeyboard _keyboardInterface;
|
||||||
private readonly GraphicsDebugLevel _glLogLevel;
|
protected readonly GraphicsDebugLevel GlLogLevel;
|
||||||
private readonly Stopwatch _chrono;
|
private readonly Stopwatch _chrono;
|
||||||
private readonly long _ticksPerFrame;
|
private readonly long _ticksPerFrame;
|
||||||
private readonly CancellationTokenSource _gpuCancellationTokenSource;
|
private readonly CancellationTokenSource _gpuCancellationTokenSource;
|
||||||
@ -105,7 +103,7 @@ namespace Ryujinx.Headless
|
|||||||
NpadManager = _inputManager.CreateNpadManager();
|
NpadManager = _inputManager.CreateNpadManager();
|
||||||
TouchScreenManager = _inputManager.CreateTouchScreenManager();
|
TouchScreenManager = _inputManager.CreateTouchScreenManager();
|
||||||
_keyboardInterface = (IKeyboard)_inputManager.KeyboardDriver.GetGamepad("0");
|
_keyboardInterface = (IKeyboard)_inputManager.KeyboardDriver.GetGamepad("0");
|
||||||
_glLogLevel = glLogLevel;
|
GlLogLevel = glLogLevel;
|
||||||
_chrono = new Stopwatch();
|
_chrono = new Stopwatch();
|
||||||
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
|
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
|
||||||
_gpuCancellationTokenSource = new CancellationTokenSource();
|
_gpuCancellationTokenSource = new CancellationTokenSource();
|
||||||
@ -138,7 +136,7 @@ namespace Ryujinx.Headless
|
|||||||
|
|
||||||
private void SetWindowIcon()
|
private void SetWindowIcon()
|
||||||
{
|
{
|
||||||
Stream iconStream = typeof(Program).Assembly.GetManifestResourceStream("HeadlessLogo");
|
Stream iconStream = EmbeddedResources.GetStream("Ryujinx/Assets/UIImages/Logo_Ryujinx.png");
|
||||||
byte[] iconBytes = new byte[iconStream!.Length];
|
byte[] iconBytes = new byte[iconStream!.Length];
|
||||||
|
|
||||||
if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length)
|
if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length)
|
||||||
@ -164,6 +162,8 @@ namespace Ryujinx.Headless
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private StatusUpdatedEventArgs _lastStatus;
|
||||||
|
|
||||||
private void InitializeWindow()
|
private void InitializeWindow()
|
||||||
{
|
{
|
||||||
var activeProcess = Device.Processes.ActiveApplication;
|
var activeProcess = Device.Processes.ActiveApplication;
|
||||||
@ -192,7 +192,7 @@ namespace Ryujinx.Headless
|
|||||||
FullscreenFlag = SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP;
|
FullscreenFlag = SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), Width, Height, DefaultFlags | FullscreenFlag | GetWindowFlags());
|
WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), Width, Height, DefaultFlags | FullscreenFlag | WindowFlags);
|
||||||
|
|
||||||
if (WindowHandle == nint.Zero)
|
if (WindowHandle == nint.Zero)
|
||||||
{
|
{
|
||||||
@ -247,7 +247,7 @@ namespace Ryujinx.Headless
|
|||||||
|
|
||||||
protected abstract void SwapBuffers();
|
protected abstract void SwapBuffers();
|
||||||
|
|
||||||
public abstract SDL_WindowFlags GetWindowFlags();
|
public abstract SDL_WindowFlags WindowFlags { get; }
|
||||||
|
|
||||||
private string GetGpuDriverName()
|
private string GetGpuDriverName()
|
||||||
{
|
{
|
||||||
@ -269,7 +269,7 @@ namespace Ryujinx.Headless
|
|||||||
{
|
{
|
||||||
InitializeWindowRenderer();
|
InitializeWindowRenderer();
|
||||||
|
|
||||||
Device.Gpu.Renderer.Initialize(_glLogLevel);
|
Device.Gpu.Renderer.Initialize(GlLogLevel);
|
||||||
|
|
||||||
InitializeRenderer();
|
InitializeRenderer();
|
||||||
|
|
||||||
@ -309,21 +309,6 @@ namespace Ryujinx.Headless
|
|||||||
|
|
||||||
if (_ticks >= _ticksPerFrame)
|
if (_ticks >= _ticksPerFrame)
|
||||||
{
|
{
|
||||||
string dockedMode = Device.System.State.DockedMode ? "Docked" : "Handheld";
|
|
||||||
float scale = GraphicsConfig.ResScale;
|
|
||||||
if (scale != 1)
|
|
||||||
{
|
|
||||||
dockedMode += $" ({scale}x)";
|
|
||||||
}
|
|
||||||
|
|
||||||
StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs(
|
|
||||||
Device.VSyncMode.ToString(),
|
|
||||||
dockedMode,
|
|
||||||
Device.Configuration.AspectRatio.ToText(),
|
|
||||||
$"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
|
|
||||||
$"FIFO: {Device.Statistics.GetFifoPercent():0.00} %",
|
|
||||||
$"GPU: {_gpuDriverName}"));
|
|
||||||
|
|
||||||
_ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame);
|
_ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -166,7 +166,6 @@
|
|||||||
<EmbeddedResource Include="Assets\UIImages\Logo_GitHub_Light.png" />
|
<EmbeddedResource Include="Assets\UIImages\Logo_GitHub_Light.png" />
|
||||||
<EmbeddedResource Include="Assets\UIImages\Logo_Ryujinx.png" />
|
<EmbeddedResource Include="Assets\UIImages\Logo_Ryujinx.png" />
|
||||||
<EmbeddedResource Include="Assets\UIImages\Logo_Ryujinx_AntiAlias.png" />
|
<EmbeddedResource Include="Assets\UIImages\Logo_Ryujinx_AntiAlias.png" />
|
||||||
<EmbeddedResource Include="Headless\Ryujinx.bmp" LogicalName="HeadlessLogo" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AdditionalFiles Include="Assets\locales.json" />
|
<AdditionalFiles Include="Assets\locales.json" />
|
||||||
|
@ -22,5 +22,22 @@ namespace Ryujinx.Ava.UI.Models
|
|||||||
FifoStatus = fifoStatus;
|
FifoStatus = fifoStatus;
|
||||||
ShaderCount = shaderCount;
|
ShaderCount = shaderCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (obj is not StatusUpdatedEventArgs suea) return false;
|
||||||
|
return
|
||||||
|
VSyncMode == suea.VSyncMode &&
|
||||||
|
VolumeStatus == suea.VolumeStatus &&
|
||||||
|
DockedMode == suea.DockedMode &&
|
||||||
|
AspectRatio == suea.AspectRatio &&
|
||||||
|
GameStatus == suea.GameStatus &&
|
||||||
|
FifoStatus == suea.FifoStatus &&
|
||||||
|
ShaderCount == suea.ShaderCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
=> HashCode.Combine(VSyncMode, VolumeStatus, AspectRatio, DockedMode, FifoStatus, GameStatus, ShaderCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.Versioning;
|
using System.Runtime.Versioning;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -136,6 +137,8 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
base.OnApplyTemplate(e);
|
base.OnApplyTemplate(e);
|
||||||
|
|
||||||
NotificationHelper.SetNotificationManager(this);
|
NotificationHelper.SetNotificationManager(this);
|
||||||
|
|
||||||
|
ShowIntelMacWarningAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnScalingChanged(object sender, EventArgs e)
|
private void OnScalingChanged(object sender, EventArgs e)
|
||||||
@ -731,5 +734,22 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
(int)Symbol.Checkmark);
|
(int)Symbol.Checkmark);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool _intelMacWarningShown;
|
||||||
|
|
||||||
|
public static async Task ShowIntelMacWarningAsync()
|
||||||
|
{
|
||||||
|
if (!_intelMacWarningShown &&
|
||||||
|
(OperatingSystem.IsMacOS() &&
|
||||||
|
(RuntimeInformation.OSArchitecture == Architecture.X64 ||
|
||||||
|
RuntimeInformation.OSArchitecture == Architecture.X86)))
|
||||||
|
{
|
||||||
|
_intelMacWarningShown = true;
|
||||||
|
|
||||||
|
await Dispatcher.UIThread.InvokeAsync(async () => await ContentDialogHelper.CreateWarningDialog(
|
||||||
|
"Intel Mac Warning",
|
||||||
|
"Intel Macs are not supported and will not work properly.\nIf you continue, do not come to our Discord asking for support."));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user