From 90db9a962d6115030c7f87e93942939f4a3921f6 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Mon, 9 Dec 2024 01:36:00 -0600 Subject: [PATCH] Iteration 2: Drop Headless-specific project, drop headless releases. Also prevent duplicate log targets by checking name equality. --- .github/workflows/build.yml | 23 ------ .github/workflows/canary.yml | 20 +---- .github/workflows/release.yml | 17 +--- Ryujinx.sln | 6 -- src/Ryujinx.Common/Logging/Logger.cs | 20 ++--- .../Ryujinx.Headless.SDL2.csproj | 15 ---- .../HeadlessDynamicTextInputHandler.cs | 2 +- .../Headless}/HeadlessHostUiTheme.cs | 2 +- .../Headless/HeadlessRyujinx.cs} | 73 +++++++++++++++--- .../Headless}/OpenGL/OpenGLWindow.cs | 2 +- .../Headless}/Options.cs | 11 ++- .../Headless}/Ryujinx.bmp | Bin .../Headless}/StatusUpdatedEventArgs.cs | 2 +- .../Headless}/Vulkan/VulkanWindow.cs | 2 +- .../Headless}/WindowBase.cs | 5 +- src/Ryujinx/Program.cs | 9 ++- src/Ryujinx/Ryujinx.csproj | 3 +- 17 files changed, 100 insertions(+), 112 deletions(-) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/HeadlessDynamicTextInputHandler.cs (97%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/HeadlessHostUiTheme.cs (93%) rename src/{Ryujinx.Headless.SDL2/Program.cs => Ryujinx/Headless/HeadlessRyujinx.cs} (91%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/OpenGL/OpenGLWindow.cs (99%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/Options.cs (97%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/Ryujinx.bmp (100%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/StatusUpdatedEventArgs.cs (94%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/Vulkan/VulkanWindow.cs (98%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/WindowBase.cs (99%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 21dc3eb0b..aeb12a575 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,14 +64,9 @@ jobs: run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - name: Publish Ryujinx.Headless.SDL2 - run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - name: Set executable bit run: | chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh - chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest' - name: Build AppImage @@ -119,13 +114,6 @@ jobs: name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage path: publish_appimage - - name: Upload Ryujinx.Headless.SDL2 artifact - uses: actions/upload-artifact@v4 - with: - name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }} - path: publish_sdl2_headless - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - build_macos: name: macOS Universal (${{ matrix.configuration }}) runs-on: ubuntu-latest @@ -171,20 +159,9 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - name: Upload Ryujinx artifact uses: actions/upload-artifact@v4 with: name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal path: "publish/*.tar.gz" if: github.event_name == 'pull_request' - - - name: Upload Ryujinx.Headless.SDL2 artifact - uses: actions/upload-artifact@v4 - with: - name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal - path: "publish_headless/*.tar.gz" - if: github.event_name == 'pull_request' diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index df28e4784..58b659117 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -104,7 +104,6 @@ jobs: - name: Publish run: | dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' @@ -113,11 +112,6 @@ jobs: rm publish/libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish popd - - pushd publish_sdl2_headless - rm publish/libarmeilleure-jitsupport.dylib - 7z a ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish - popd shell: bash - name: Packing Linux builds @@ -128,12 +122,6 @@ jobs: chmod +x publish/Ryujinx.sh publish/Ryujinx tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish popd - - pushd publish_sdl2_headless - rm publish/libarmeilleure-jitsupport.dylib - chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2 - tar -czvf ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish - popd shell: bash #- name: Build AppImage (Linux) @@ -179,7 +167,7 @@ jobs: with: name: ${{ steps.version_info.outputs.build_version }} artifacts: "release_output/*.tar.gz,release_output/*.zip" - #artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*" + #artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*" tag: ${{ steps.version_info.outputs.build_version }} body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}" omitBodyDuringUpdate: true @@ -238,15 +226,11 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 - - name: Pushing new release uses: ncipollo/release-action@v1 with: name: "Canary ${{ steps.version_info.outputs.build_version }}" - artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz" + artifacts: "publish_ava/*.tar.gz" tag: ${{ steps.version_info.outputs.build_version }} body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}" omitBodyDuringUpdate: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fbf715756..d4bdd2430 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,7 +103,6 @@ jobs: - name: Publish run: | dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' @@ -112,11 +111,6 @@ jobs: rm libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd - - pushd publish_sdl2_headless - rm libarmeilleure-jitsupport.dylib - 7z a ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish - popd shell: bash - name: Build AppImage (Linux) @@ -163,11 +157,6 @@ jobs: chmod +x Ryujinx.sh Ryujinx tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish popd - - pushd publish_sdl2_headless - chmod +x Ryujinx.sh Ryujinx.Headless.SDL2 - tar -czvf ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish - popd shell: bash - name: Pushing new release @@ -233,15 +222,11 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 - - name: Pushing new release uses: ncipollo/release-action@v1 with: name: ${{ steps.version_info.outputs.build_version }} - artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz" + artifacts: "publish/*.tar.gz" tag: ${{ steps.version_info.outputs.build_version }} body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}" omitBodyDuringUpdate: true diff --git a/Ryujinx.sln b/Ryujinx.sln index d661b903c..58c556efc 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -57,8 +57,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "src\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "src\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{D99A395A-8569-4DB0-B336-900647890052}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "src\Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "src\Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}" @@ -204,10 +202,6 @@ Global {D99A395A-8569-4DB0-B336-900647890052}.Debug|Any CPU.Build.0 = Debug|Any CPU {D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.ActiveCfg = Release|Any CPU {D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.Build.0 = Release|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.Build.0 = Debug|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.ActiveCfg = Release|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.Build.0 = Release|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/Ryujinx.Common/Logging/Logger.cs b/src/Ryujinx.Common/Logging/Logger.cs index 26d343969..6ea6b7ac3 100644 --- a/src/Ryujinx.Common/Logging/Logger.cs +++ b/src/Ryujinx.Common/Logging/Logger.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.CompilerServices; using System.Threading; @@ -157,21 +158,16 @@ namespace Ryujinx.Common.Logging _time.Restart(); } - private static ILogTarget GetTarget(string targetName) - { - foreach (var target in _logTargets) - { - if (target.Name.Equals(targetName)) - { - return target; - } - } - - return null; - } + private static ILogTarget GetTarget(string targetName) + => _logTargets.FirstOrDefault(target => target.Name.Equals(targetName)); public static void AddTarget(ILogTarget target) { + if (_logTargets.Any(t => t.Name == target.Name)) + { + return; + } + _logTargets.Add(target); Updated += target.Log; diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj index 8fbf9be1e..6cb8d66ae 100644 --- a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj +++ b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj @@ -38,27 +38,12 @@ - - - Always - THIRDPARTY.md - - - Always - LICENSE.txt - - - Always - - - - false diff --git a/src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs b/src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs similarity index 97% rename from src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs rename to src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs index 40eb5ba98..2a507d2b7 100644 --- a/src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs +++ b/src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs @@ -2,7 +2,7 @@ using Ryujinx.HLE.UI; using System.Threading; using System.Threading.Tasks; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { /// /// Headless text processing class, right now there is no way to forward the input to it. diff --git a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs similarity index 93% rename from src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs rename to src/Ryujinx/Headless/HeadlessHostUiTheme.cs index 78cd43ae5..b5e1ce526 100644 --- a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs +++ b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.UI; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { internal class HeadlessHostUiTheme : IHostUITheme { diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs similarity index 91% rename from src/Ryujinx.Headless.SDL2/Program.cs rename to src/Ryujinx/Headless/HeadlessRyujinx.cs index 46743b4eb..2918e130b 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -1,7 +1,12 @@ +using Avalonia.Threading; using CommandLine; +using DiscordRPC; using Gommon; using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.SDL2; +using Ryujinx.Ava; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.UI.Windows; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; @@ -21,8 +26,6 @@ using Ryujinx.Graphics.Gpu.Shader; using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.Vulkan; using Ryujinx.Graphics.Vulkan.MoltenVK; -using Ryujinx.Headless.SDL2.OpenGL; -using Ryujinx.Headless.SDL2.Vulkan; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; @@ -31,22 +34,25 @@ using Ryujinx.Input; using Ryujinx.Input.HLE; using Ryujinx.Input.SDL2; using Ryujinx.SDL2.Common; +using Ryujinx.UI.App.Common; +using Ryujinx.UI.Common; +using Ryujinx.UI.Common.Configuration; +using Ryujinx.UI.Common.Helper; using Silk.NET.Vulkan; using System; using System.Collections.Generic; using System.IO; using System.Text.Json; using System.Threading; +using System.Threading.Tasks; using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId; using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; using Key = Ryujinx.Common.Configuration.Hid.Key; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { - public class Program + public class HeadlessRyujinx { - public static string Version { get; private set; } - private static VirtualFileSystem _virtualFileSystem; private static ContentManager _contentManager; private static AccountManager _accountManager; @@ -62,14 +68,63 @@ namespace Ryujinx.Headless.SDL2 private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - public static void Main(string[] args) + public static void Initialize(string[] args) { - Version = ReleaseInformation.Version; + // Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched + DiscordIntegrationModule.StartedAt = Timestamps.Now; + // Delete backup files after updating. + Task.Run(Updater.CleanupUpdate); + + // Hook unhandled exception and process exit events. + AppDomain.CurrentDomain.UnhandledException += (sender, e) + => Program.ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating); + AppDomain.CurrentDomain.ProcessExit += (_, _) => Program.Exit(); + + // Setup base data directory. + AppDataManager.Initialize(CommandLineState.BaseDirPathArg); + + // Set the delegate for localizing the word "never" in the UI + ApplicationData.LocalizedNever = () => LocaleManager.Instance[LocaleKeys.Never]; + + // Initialize the configuration. + ConfigurationState.Initialize(); + + // Initialize the logger system. + LoggerModule.Initialize(); + + // Initialize Discord integration. + DiscordIntegrationModule.Initialize(); + + // Initialize SDL2 driver + SDL2Driver.MainThreadDispatcher = action => Dispatcher.UIThread.InvokeAsync(action, DispatcherPriority.Input); + + Program.ReloadConfig(); + + // Logging system information. + Program.PrintSystemInfo(); + + // Enable OGL multithreading on the driver, and some other flags. + DriverUtilities.InitDriverConfig(ConfigurationState.Instance.Graphics.BackendThreading == BackendThreading.Off); + + // Check if keys exists. + if (!File.Exists(Path.Combine(AppDataManager.KeysDirPath, "prod.keys"))) + { + if (!(AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "prod.keys")))) + { + Logger.Error?.Print(LogClass.Application, "Keys not found"); + } + } + + Entrypoint(args); + } + + public static void Entrypoint(string[] args) + { // Make process DPI aware for proper window sizing on high-res screens. ForceDpiAware.Windows(); - Console.Title = $"Ryujinx Console {Version} (Headless SDL2)"; + Console.Title = $"Ryujinx Console {Program.Version} (Headless SDL2)"; if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) { diff --git a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs b/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs similarity index 99% rename from src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs rename to src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs index 8c4854a11..c00a0648f 100644 --- a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs +++ b/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs @@ -7,7 +7,7 @@ using Ryujinx.Input.HLE; using System; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.OpenGL +namespace Ryujinx.Headless { class OpenGLWindow : WindowBase { diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx/Headless/Options.cs similarity index 97% rename from src/Ryujinx.Headless.SDL2/Options.cs rename to src/Ryujinx/Headless/Options.cs index 4e2ad5b58..db873b921 100644 --- a/src/Ryujinx.Headless.SDL2/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -2,13 +2,22 @@ using CommandLine; using Ryujinx.Common.Configuration; using Ryujinx.HLE; using Ryujinx.HLE.HOS.SystemState; +using Ryujinx.UI.Common.Configuration; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { public class Options { // General + public void InheritMainConfig(ConfigurationState configurationState) + { + + } + + [Option("use-main-config", Required = false, Default = false, HelpText = "Use the settings from what was configured via the UI.")] + public bool InheritConfig { get; set; } + [Option("root-data-dir", Required = false, HelpText = "Set the custom folder path for Ryujinx data.")] public string BaseDataDir { get; set; } diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.bmp b/src/Ryujinx/Headless/Ryujinx.bmp similarity index 100% rename from src/Ryujinx.Headless.SDL2/Ryujinx.bmp rename to src/Ryujinx/Headless/Ryujinx.bmp diff --git a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs similarity index 94% rename from src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs rename to src/Ryujinx/Headless/StatusUpdatedEventArgs.cs index c1dd3805f..6c76a43a1 100644 --- a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs +++ b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { class StatusUpdatedEventArgs( string vSyncMode, diff --git a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs b/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs similarity index 98% rename from src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs rename to src/Ryujinx/Headless/Vulkan/VulkanWindow.cs index b88e0fe83..92caad34e 100644 --- a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs +++ b/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs @@ -6,7 +6,7 @@ using System; using System.Runtime.InteropServices; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.Vulkan +namespace Ryujinx.Headless { class VulkanWindow : WindowBase { diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx/Headless/WindowBase.cs similarity index 99% rename from src/Ryujinx.Headless.SDL2/WindowBase.cs rename to src/Ryujinx/Headless/WindowBase.cs index fbe7cb49c..1862c2757 100644 --- a/src/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/src/Ryujinx/Headless/WindowBase.cs @@ -1,5 +1,6 @@ using Humanizer; using LibHac.Tools.Fs; +using Ryujinx.Ava; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; @@ -26,7 +27,7 @@ using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing; using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter; using Switch = Ryujinx.HLE.Switch; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { abstract partial class WindowBase : IHostUIHandler, IDisposable { @@ -318,7 +319,7 @@ namespace Ryujinx.Headless.SDL2 Device.VSyncMode.ToString(), dockedMode, Device.Configuration.AspectRatio.ToText(), - $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", + $"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", $"GPU: {_gpuDriverName}")); diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 0f6d1bfae..35cdb6c0e 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -14,6 +14,7 @@ using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.Vulkan.MoltenVK; +using Ryujinx.Headless; using Ryujinx.SDL2.Common; using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; @@ -57,7 +58,7 @@ namespace Ryujinx.Ava if (args[0] is "--no-gui" or "nogui") { - Headless.SDL2.Program.Main(args.Skip(1).ToArray()); + HeadlessRyujinx.Initialize(args[1..]); return 0; } @@ -228,7 +229,7 @@ namespace Ryujinx.Ava UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value; } - private static void PrintSystemInfo() + internal static void PrintSystemInfo() { Logger.Notice.Print(LogClass.Application, $"{App.FullAppName} Version: {Version}"); SystemInfo.Gather().Print(); @@ -245,7 +246,7 @@ namespace Ryujinx.Ava : $"Launch Mode: {AppDataManager.Mode}"); } - private static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating) + internal static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating) { Logger.Log log = Logger.Error ?? Logger.Notice; string message = $"Unhandled exception caught: {ex}"; @@ -260,7 +261,7 @@ namespace Ryujinx.Ava Exit(); } - public static void Exit() + internal static void Exit() { DiscordIntegrationModule.Exit(); diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 74f4e479a..8412044c7 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -43,6 +43,7 @@ + @@ -67,7 +68,6 @@ - @@ -163,6 +163,7 @@ +