Compare commits

..

46 Commits

Author SHA1 Message Date
Evan Husted
af44726cec Merge branch 'master' into validation-v2 2024-12-28 05:51:19 -06:00
LotP1
8efefeaaca slight refactor
isGitRunner is now a variable passed to all tasks.
Validation project can now accept more arguments, only the first argument is used at the moment.
Execute is no longer static, and you can now pass extra data to the task constructor if needed.
2024-12-28 02:16:17 +01:00
LotP1
4e56b1493f validate that line endings are LF on build
if running on git it will now fail if the file contains CRLF line endings and tell the user to run a local build to fix it.
2024-12-28 02:01:23 +01:00
LotP1
43f6e4a873 remove dupelicates 2024-12-28 01:58:35 +01:00
LotP1
55f6b95d8d Merge remote-tracking branch 'upstream/master' into validation-v2 2024-12-28 01:50:18 +01:00
LotP1
4b84c5d240 fix duplicates 2024-12-28 01:39:03 +01:00
LotP1
9f22fc49c8 Merge branch 'master' into validation-v2 2024-12-28 01:38:32 +01:00
LotP1
4f206d0e73 Merge remote-tracking branch 'upstream/master' into validation-v2 2024-12-28 01:35:52 +01:00
LotP1
e2e8502278 force line endings to use LF 2024-12-27 12:10:50 +01:00
Evan Husted
aa806b1032 Rename program.cs to Program.cs 2024-12-26 21:07:29 -06:00
LotP1
aabb786016 fix spelling and names 2024-12-26 23:42:53 +01:00
LotP1
2a38f1bbbf only log runtime if a runtime is set 2024-12-26 23:34:43 +01:00
LotP1
fdece62f88 fix matching windows runner 2024-12-26 23:32:14 +01:00
LotP1
6fb58a611e revert .gitignore 2024-12-26 23:28:34 +01:00
LotP1
02ff76f89a revert packages.props 2024-12-26 23:26:50 +01:00
LotP1
d39b3a5864 fix locales.json to comply with validation 2024-12-26 23:20:29 +01:00
LotP1
f976c3c362 simplify 2024-12-26 23:20:06 +01:00
LotP1
d9f2b813a0 Merge remote-tracking branch 'upstream/master' into validation-v2 2024-12-26 23:12:30 +01:00
LotP1
8cb6767c7c slash instead of backslash 2024-12-26 23:10:36 +01:00
LotP1
80377c1553 run with dotnet dll runner 2024-12-26 23:04:05 +01:00
LotP1
1dbcaf1fd7 missing quote, will still fail 2024-12-26 22:57:07 +01:00
LotP1
bad1f72918 v4 first test, will fail due to new validation step 2024-12-26 22:54:22 +01:00
LotP1
a317184594 check target dir 2024-12-26 21:34:07 +01:00
LotP1
0cde245875 forgot to remove true 2024-12-26 21:31:24 +01:00
LotP1
e3638d13b1 correct form of --runtime 2024-12-26 21:29:10 +01:00
LotP1
2fe19044cf use RuntimeIdentifier instead 2024-12-26 21:25:45 +01:00
LotP1
9320decc45 test RuntimeIdentifiers 2024-12-26 21:06:08 +01:00
LotP1
35b23bcafb try simplified csproj and force runtime identifier 2024-12-26 20:45:37 +01:00
LotP1
4add4829c7 force restore 2024-12-26 20:38:46 +01:00
LotP1
eb46909808 manually run dotnet restore 2024-12-26 20:29:56 +01:00
LotP1
c91d9d8049 build target fix 2024-12-26 20:18:29 +01:00
LotP1
21f23f0a2e lets see what's actually going on 2024-12-26 20:13:18 +01:00
LotP1
9ca0926439 confirm that it actually builds 2024-12-26 20:07:45 +01:00
LotP1
7b8c8776a2 Revert "use outdir"
This reverts commit b00d80c17a.
2024-12-26 20:06:07 +01:00
LotP1
b00d80c17a use outdir 2024-12-26 20:00:04 +01:00
LotP1
8c0a82bb6e v4 2024-12-26 19:54:02 +01:00
LotP1
1bac6ab19e please 2024-12-26 00:00:05 +01:00
LotP1
dac137fd43 test stuff 2024-12-25 23:47:20 +01:00
LotP1
d83d80de73 here we go 2024-12-25 23:22:38 +01:00
LotP1
097836bfac NO-BREAK SPACE is now escaped 2024-12-25 22:14:20 +01:00
LotP1
695f9e277d v3 2024-12-25 22:13:54 +01:00
LotP1
b19ee23c6b this won't work 2024-12-25 20:48:28 +01:00
LotP1
748e93ba65 lets give this another shot
moved from netstandard to netframework
2024-12-25 17:09:57 +01:00
LotP1
732a1af863 copying is not necessary anymore 2024-12-25 04:02:22 +01:00
LotP1
f538cee2e8 please don't fail 2024-12-25 03:56:59 +01:00
LotP1
4275a778aa update gitignore 2024-12-24 23:28:44 +01:00
156 changed files with 868 additions and 1054 deletions

View File

@@ -61,6 +61,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmp
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.UI.Common", "src\Ryujinx.UI.Common\Ryujinx.UI.Common.csproj", "{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Generators", "src\Ryujinx.Horizon.Generators\Ryujinx.Horizon.Generators.csproj", "{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Vulkan", "src\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj", "{D4D09B08-D580-4D69-B886-C35D2853F6C8}"
@@ -217,6 +219,10 @@ Global
{7C1B2721-13DA-4B62-B046-C626605ECCE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C1B2721-13DA-4B62-B046-C626605ECCE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C1B2721-13DA-4B62-B046-C626605ECCE6}.Release|Any CPU.Build.0 = Release|Any CPU
{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Release|Any CPU.Build.0 = Release|Any CPU
{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -249,13 +255,12 @@ Global
{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.Build.0 = Release|Any CPU
{4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C08931FA-1191-417A-864F-3882D93E683B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C08931FA-1191-417A-864F-3882D93E683B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C08931FA-1191-417A-864F-3882D93E683B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C08931FA-1191-417A-864F-3882D93E683B}.Release|Any CPU.Build.0 = Release|Any CPU
{4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.ActiveCfg = Release|Any CPU

View File

@@ -13,7 +13,7 @@ mkdir -p AppDir/usr/bin
cp distribution/linux/Ryujinx.desktop AppDir/Ryujinx.desktop
cp distribution/linux/appimage/AppRun AppDir/AppRun
cp distribution/misc/Logo.svg AppDir/Ryujinx.svg
cp src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png AppDir/Ryujinx.svg
cp -r "$BUILDDIR"/* AppDir/usr/bin/

View File

@@ -9,12 +9,20 @@ namespace Ryujinx.Audio.Backends.Dummy
{
public class DummyHardwareDeviceDriver : IHardwareDeviceDriver
{
private readonly ManualResetEvent _updateRequiredEvent = new(false);
private readonly ManualResetEvent _pauseEvent = new(true);
private readonly ManualResetEvent _updateRequiredEvent;
private readonly ManualResetEvent _pauseEvent;
public static bool IsSupported => true;
public float Volume { get; set; } = 1f;
public float Volume { get; set; }
public DummyHardwareDeviceDriver()
{
_updateRequiredEvent = new ManualResetEvent(false);
_pauseEvent = new ManualResetEvent(true);
Volume = 1f;
}
public IHardwareDeviceSession OpenDeviceSession(Direction direction, IVirtualMemoryManager memoryManager, SampleFormat sampleFormat, uint sampleRate, uint channelCount)
{
@@ -52,7 +60,7 @@ namespace Ryujinx.Audio.Backends.Dummy
Dispose(true);
}
private void Dispose(bool disposing)
protected virtual void Dispose(bool disposing)
{
if (disposing)
{

View File

@@ -1,73 +0,0 @@
using System;
using Microsoft.Build.Utilities;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Newtonsoft.Json;
using Microsoft.Build.Framework;
namespace Ryujinx.BuildValidationTasks
{
public class LocaleValidationTask : Task
{
public override bool Execute()
{
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
if (path.Split(["src"], StringSplitOptions.None).Length == 1)
{
//i assume that we are in a build directory in the solution dir
path = new FileInfo(path).Directory!.Parent!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
}
else
{
path = path.Split(["src"], StringSplitOptions.None)[0];
path = new FileInfo(path).Directory!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
}
string data;
using (StreamReader sr = new(path))
{
data = sr.ReadToEnd();
}
LocalesJson json = JsonConvert.DeserializeObject<LocalesJson>(data);
for (int i = 0; i < json.Locales.Count; i++)
{
LocalesEntry locale = json.Locales[i];
foreach (string langCode in json.Languages.Where(it => !locale.Translations.ContainsKey(it)))
{
locale.Translations.Add(langCode, string.Empty);
Log.LogMessage(MessageImportance.High, $"Added '{langCode}' to Locale '{locale.ID}'");
}
locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
json.Locales[i] = locale;
}
string jsonString = JsonConvert.SerializeObject(json, Formatting.Indented);
using (StreamWriter sw = new(path))
{
sw.Write(jsonString);
}
return true;
}
struct LocalesJson
{
public List<string> Languages { get; set; }
public List<LocalesEntry> Locales { get; set; }
}
struct LocalesEntry
{
public string ID { get; set; }
public Dictionary<string, string> Translations { get; set; }
}
}
}

View File

@@ -0,0 +1,117 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.Json;
using System.Text.Encodings.Web;
namespace Ryujinx.BuildValidationTasks
{
public class LocalesValidationTask : ValidationTask
{
public LocalesValidationTask() { }
public bool Execute(string projectPath, bool isGitRunner)
{
Console.WriteLine("Running Locale Validation Task...");
string path = projectPath + "src/Ryujinx/Assets/locales.json";
string data;
using (StreamReader sr = new(path))
{
data = sr.ReadToEnd();
}
LocalesJson json;
if (isGitRunner && data.Contains("\r\n"))
throw new FormatException("locales.json is using CRLF line endings! It should be using LF line endings, build locally to fix...");
try
{
json = JsonSerializer.Deserialize<LocalesJson>(data);
}
catch (JsonException e)
{
throw new JsonException(e.Message); //shorter and easier stacktrace
}
bool encounteredIssue = false;
for (int i = 0; i < json.Locales.Count; i++)
{
LocalesEntry locale = json.Locales[i];
foreach (string langCode in json.Languages.Where(lang => !locale.Translations.ContainsKey(lang)))
{
encounteredIssue = true;
if (!isGitRunner)
{
locale.Translations.Add(langCode, string.Empty);
Console.WriteLine($"Added '{langCode}' to Locale '{locale.ID}'");
}
else
{
Console.WriteLine($"Missing '{langCode}' in Locale '{locale.ID}'!");
}
}
foreach (string langCode in json.Languages.Where(lang => locale.Translations.ContainsKey(lang) && lang != "en_US" && locale.Translations[lang] == locale.Translations["en_US"]))
{
encounteredIssue = true;
if (!isGitRunner)
{
locale.Translations[langCode] = string.Empty;
Console.WriteLine($"Lanugage '{langCode}' is a duplicate of en_US in Locale '{locale.ID}'! Resetting it...");
}
else
{
Console.WriteLine($"Lanugage '{langCode}' is a duplicate of en_US in Locale '{locale.ID}'!");
}
}
locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
json.Locales[i] = locale;
}
if (isGitRunner && encounteredIssue)
throw new JsonException("1 or more locales are invalid!");
JsonSerializerOptions jsonOptions = new JsonSerializerOptions()
{
WriteIndented = true,
NewLine = "\n",
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
string jsonString = JsonSerializer.Serialize(json, jsonOptions);
using (StreamWriter sw = new(path))
{
sw.Write(jsonString);
}
Console.WriteLine("Finished Locale Validation Task!");
return true;
}
struct LocalesJson
{
public List<string> Languages { get; set; }
public List<LocalesEntry> Locales { get; set; }
}
struct LocalesEntry
{
public string ID { get; set; }
public Dictionary<string, string> Translations { get; set; }
}
}
}

View File

@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ryujinx.BuildValidationTasks
{
public class Program
{
static void Main(string[] args)
{
// Display the number of command line arguments.
if (args.Length == 0)
throw new ArgumentException("Error: too few arguments!");
string path = args[0];
if (string.IsNullOrEmpty(path))
throw new ArgumentException("Error: path is null or empty!");
if (!Path.Exists(path))
throw new FileLoadException($"path {{{path}}} does not exist!");
path = Path.GetFullPath(path);
if (!Directory.GetDirectories(path).Contains($"{path}src"))
throw new FileLoadException($"path {{{path}}} is not a valid ryujinx project!");
bool isGitRunner = path.Contains("runner") || path.Contains("D:\\a\\Ryujinx\\Ryujinx");
if (isGitRunner)
Console.WriteLine("Is Git Runner!");
// Run tasks
// Pass extra info needed in the task constructors
new LocalesValidationTask().Execute(path, isGitRunner);
}
}
}

View File

@@ -1,19 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Build.Utilities.Core" />
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>
<Target Name="PostBuildTarget" AfterTargets="AfterBuild">
<Message Text="Running Validation Project" Importance="high" />
<UsingTask TaskName="Ryujinx.BuildValidationTasks.LocaleValidationTask" TaskFactory="TaskHostFactory" AssemblyFile="$(OutDir)Ryujinx.BuildValidationTasks.dll" />
<Target Name="LocalesJsonValidation" AfterTargets="AfterRebuild">
<LocaleValidationTask />
<Exec WorkingDirectory="$(ProjectDir)bin\Debug\$(TargetFramework)\"
Command="dotnet Ryujinx.BuildValidationTasks.dll &quot;$(ProjectDir)..\..\\&quot;"
ConsoleToMsBuild="true"
/>
</Target>
</Project>
</Project>

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ryujinx.BuildValidationTasks
{
public interface ValidationTask
{
public bool Execute(string projectPath, bool isGitRunner);
}
}

View File

@@ -1,35 +0,0 @@
namespace Ryujinx.Common
{
public class BitTricks
{
// Never actually written bit packing logic before, so I looked it up.
// This code is from https://gist.github.com/Alan-FGR/04938e93e2bffdf5802ceb218a37c195
public static ulong PackBitFields(uint[] values, byte[] bitFields)
{
ulong retVal = values[0]; //we set the first value right away
for (int f = 1; f < values.Length; f++)
{
retVal <<= bitFields[f]; // we shift the previous value
retVal += values[f];// and add our current value
}
return retVal;
}
public static uint[] UnpackBitFields(ulong packed, byte[] bitFields)
{
int fields = bitFields.Length - 1; // number of fields to unpack
uint[] retArr = new uint[fields + 1]; // init return array
int curPos = 0; // current field bit position (start)
int lastEnd; // position where last field ended
for (int f = fields; f >= 0; f--) // loop from last
{
lastEnd = curPos; // we store where the last value ended
curPos += bitFields[f]; // we get where the current value starts
int leftShift = 64 - curPos; // we figure how much left shift we gotta apply for the other numbers to overflow into oblivion
retArr[f] = (uint)((packed << leftShift) >> leftShift + lastEnd); // we do magic
}
return retArr;
}
}
}

View File

@@ -1,61 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Ryujinx.Common.Configuration
{
[Flags]
public enum DirtyHacks : byte
{
Xc2MenuSoftlockFix = 1,
ShaderCompilationThreadSleep = 2
}
public record EnabledDirtyHack(DirtyHacks Hack, int Value)
{
public static readonly byte[] PackedFormat = [8, 32];
public ulong Pack() => BitTricks.PackBitFields([(uint)Hack, (uint)Value], PackedFormat);
public static EnabledDirtyHack Unpack(ulong packedHack)
{
var unpackedFields = BitTricks.UnpackBitFields(packedHack, PackedFormat);
if (unpackedFields is not [var hack, var value])
throw new ArgumentException(nameof(packedHack));
return new EnabledDirtyHack((DirtyHacks)hack, (int)value);
}
}
public class DirtyHackCollection : Dictionary<DirtyHacks, int>
{
public DirtyHackCollection(EnabledDirtyHack[] hacks)
{
foreach ((DirtyHacks dirtyHacks, int value) in hacks)
{
Add(dirtyHacks, value);
}
}
public DirtyHackCollection(ulong[] packedHacks)
{
foreach ((DirtyHacks dirtyHacks, int value) in packedHacks.Select(EnabledDirtyHack.Unpack))
{
Add(dirtyHacks, value);
}
}
public ulong[] PackEntries() =>
this
.Select(it =>
BitTricks.PackBitFields([(uint)it.Key, (uint)it.Value], EnabledDirtyHack.PackedFormat))
.ToArray();
public static implicit operator DirtyHackCollection(EnabledDirtyHack[] hacks) => new(hacks);
public static implicit operator DirtyHackCollection(ulong[] packedHacks) => new(packedHacks);
public new int this[DirtyHacks hack] => TryGetValue(hack, out var value) ? value : -1;
public bool IsEnabled(DirtyHacks hack) => ContainsKey(hack);
}
}

View File

@@ -8,10 +8,10 @@ namespace Ryujinx.Common
public static class StreamExtensions
{
/// <summary>
/// Writes an int span to this stream.
/// Writes a <see cref="ReadOnlySpan{int}" /> to this stream.
///
/// This default implementation converts each buffer value to a stack-allocated
/// byte array, then writes it to the Stream using <see cref="Stream.Write(ReadOnlySpan{byte})" />.
/// byte array, then writes it to the Stream using <cref="System.Stream.Write(byte[])" />.
/// </summary>
/// <param name="stream">The stream to be written to</param>
/// <param name="buffer">The buffer of values to be written</param>

View File

@@ -8,8 +8,6 @@ namespace Ryujinx.Common
{
public static class TitleIDs
{
public static ReactiveObject<Optional<string>> CurrentApplication { get; set; } = new();
public static GraphicsBackend SelectGraphicsBackend(string titleId, GraphicsBackend currentBackend)
{
switch (currentBackend)
@@ -35,7 +33,6 @@ namespace Ryujinx.Common
"010028600EBDA000", // Mario 3D World
"0100152000022000", // Mario Kart 8 Deluxe
"01005CA01580E000", // Persona 5
"01001f5010dfa000", // Pokemon Legends Arceus
"01008C0016544000", // Sea of Stars
"01006A800016E000", // Smash Ultimate
"0100000000010000", // Super Mario Odyessy

View File

@@ -1,5 +1,4 @@
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Graphics.Device;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Gpu.Engine.GPFifo;
@@ -91,9 +90,6 @@ namespace Ryujinx.Graphics.Gpu
/// Support buffer updater.
/// </summary>
internal SupportBufferUpdater SupportBufferUpdater { get; }
internal DirtyHackCollection DirtyHacks { get; }
/// <summary>
/// Host hardware capabilities.
@@ -117,7 +113,7 @@ namespace Ryujinx.Graphics.Gpu
/// Creates a new instance of the GPU emulation context.
/// </summary>
/// <param name="renderer">Host renderer</param>
public GpuContext(IRenderer renderer, DirtyHackCollection hackCollection)
public GpuContext(IRenderer renderer)
{
Renderer = renderer;
@@ -140,8 +136,6 @@ namespace Ryujinx.Graphics.Gpu
SupportBufferUpdater = new SupportBufferUpdater(renderer);
DirtyHacks = hackCollection;
_firstTimestamp = ConvertNanosecondsToTicks((ulong)PerformanceCounter.ElapsedNanoseconds);
}

View File

@@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Gpu
/// Enables or disables high-level emulation of common GPU Macro code.
/// </summary>
public static bool EnableMacroHLE = true;
/// <summary>
/// Title id of the current running game.
/// Used by the shader cache.

View File

@@ -1,4 +1,3 @@
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
@@ -367,9 +366,6 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
{
try
{
if (_context.DirtyHacks.IsEnabled(DirtyHacks.ShaderCompilationThreadSleep))
Thread.Sleep(_context.DirtyHacks[DirtyHacks.ShaderCompilationThreadSleep]);
AsyncProgramTranslation asyncTranslation = new(guestShaders, specState, programIndex, isCompute);
_asyncTranslationQueue.Add(asyncTranslation, _cancellationToken);
}

View File

@@ -1,4 +1,3 @@
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;

View File

@@ -22,15 +22,13 @@ namespace Ryujinx.Graphics.Metal
private int _requestedWidth;
private int _requestedHeight;
// private bool _vsyncEnabled;
private AntiAliasing _currentAntiAliasing;
private bool _updateEffect;
private IPostProcessingEffect _effect;
private IScalingFilter _scalingFilter;
private bool _isLinear;
public bool IsVSyncEnabled => _metalLayer.DisplaySyncEnabled;
// private float _scalingFilterLevel;
private bool _updateScalingFilter;
private ScalingFilter _currentScalingFilter;
@@ -42,7 +40,7 @@ namespace Ryujinx.Graphics.Metal
_metalLayer = metalLayer;
}
private void ResizeIfNeeded()
private unsafe void ResizeIfNeeded()
{
if (_requestedWidth != 0 && _requestedHeight != 0)
{
@@ -56,7 +54,7 @@ namespace Ryujinx.Graphics.Metal
}
}
public void Present(ITexture texture, ImageCrop crop, Action swapBuffersCallback)
public unsafe void Present(ITexture texture, ImageCrop crop, Action swapBuffersCallback)
{
if (_renderer.Pipeline is Pipeline pipeline && texture is Texture tex)
{
@@ -143,7 +141,15 @@ namespace Ryujinx.Graphics.Metal
public void ChangeVSyncMode(VSyncMode vSyncMode)
{
_metalLayer.DisplaySyncEnabled = vSyncMode is VSyncMode.Switch;
switch (vSyncMode)
{
case VSyncMode.Unbounded:
_metalLayer.DisplaySyncEnabled = false;
break;
case VSyncMode.Switch:
_metalLayer.DisplaySyncEnabled = true;
break;
}
}
public void SetAntiAliasing(AntiAliasing effect)

View File

@@ -2,8 +2,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{
internal enum BitDepth
{
Bits8 = 8, // < 8 bits
Bits10 = 10, // < 10 bits
Bits12 = 12, // < 12 bits
Bits8 = 8, /**< 8 bits */
Bits10 = 10, /**< 10 bits */
Bits12 = 12, /**< 12 bits */
}
}

View File

@@ -1,4 +1,3 @@
using Gommon;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
@@ -891,12 +890,7 @@ namespace Ryujinx.Graphics.Vulkan
private void PrintGpuInformation()
{
string gpuInfoMessage = $"{GpuRenderer} ({GpuVersion})";
if (!GpuRenderer.StartsWithIgnoreCase(GpuVendor))
gpuInfoMessage = gpuInfoMessage.Prepend(GpuVendor);
Logger.Notice.Print(LogClass.Gpu, gpuInfoMessage);
Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})");
Logger.Notice.Print(LogClass.Gpu, $"GPU Memory: {GetTotalGPUMemory() / (1024 * 1024)} MiB");
}

View File

@@ -188,11 +188,6 @@ namespace Ryujinx.HLE
/// An action called when HLE force a refresh of output after docked mode changed.
/// </summary>
public Action RefreshInputConfig { internal get; set; }
/// <summary>
/// The desired hacky workarounds.
/// </summary>
public EnabledDirtyHack[] Hacks { internal get; set; }
public HLEConfiguration(VirtualFileSystem virtualFileSystem,
LibHacHorizonManager libHacHorizonManager,
@@ -223,8 +218,7 @@ namespace Ryujinx.HLE
bool multiplayerDisableP2p,
string multiplayerLdnPassphrase,
string multiplayerLdnServer,
int customVSyncInterval,
EnabledDirtyHack[] dirtyHacks = null)
int customVSyncInterval)
{
VirtualFileSystem = virtualFileSystem;
LibHacHorizonManager = libHacHorizonManager;
@@ -256,7 +250,6 @@ namespace Ryujinx.HLE
MultiplayerDisableP2p = multiplayerDisableP2p;
MultiplayerLdnPassphrase = multiplayerLdnPassphrase;
MultiplayerLdnServer = multiplayerLdnServer;
Hacks = dirtyHacks ?? [];
}
}
}

View File

@@ -1,9 +1,6 @@
using LibHac;
using LibHac.Common;
using LibHac.Sf;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
@@ -16,8 +13,6 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
_baseStorage = SharedRef<LibHac.FsSrv.Sf.IStorage>.CreateMove(ref baseStorage);
}
private const string Xc2TitleId = "0100e95004038000";
[CommandCmif(0)]
// Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer
public ResultCode Read(ServiceCtx context)
@@ -38,13 +33,6 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true);
Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size);
if (context.Device.DirtyHacks.IsEnabled(DirtyHacks.Xc2MenuSoftlockFix) && TitleIDs.CurrentApplication.Value == Xc2TitleId)
{
// Add a load-bearing sleep to avoid XC2 softlock
// https://web.archive.org/web/20240728045136/https://github.com/Ryujinx/Ryujinx/issues/2357
Thread.Sleep(2);
}
return (ResultCode)result.Value;
}

View File

@@ -4,10 +4,8 @@ using LibHac.Fs.Fsa;
using LibHac.Loader;
using LibHac.Ns;
using LibHac.Tools.FsSystem;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Gpu;
using Ryujinx.HLE.Loaders.Executables;
using Ryujinx.Memory;
using System;
@@ -104,7 +102,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
}
// Initialize GPU.
GraphicsConfig.TitleId = programId.ToString("X16");
Graphics.Gpu.GraphicsConfig.TitleId = programId.ToString("X16");
device.Gpu.HostInitalized.Set();
if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible))

View File

@@ -6,9 +6,7 @@ using LibHac.Ns;
using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Gpu;
using Ryujinx.HLE.Loaders.Executables;
using Ryujinx.HLE.Loaders.Processes.Extensions;
using System;
@@ -61,8 +59,6 @@ namespace Ryujinx.HLE.Loaders.Processes
{
_latestPid = processResult.ProcessId;
TitleIDs.CurrentApplication.Value = processResult.ProgramIdText;
return true;
}
}
@@ -90,8 +86,6 @@ namespace Ryujinx.HLE.Loaders.Processes
{
_latestPid = processResult.ProcessId;
TitleIDs.CurrentApplication.Value = processResult.ProgramIdText;
return true;
}
}
@@ -119,8 +113,6 @@ namespace Ryujinx.HLE.Loaders.Processes
if (processResult.ProgramId > 0x01000000000007FF)
{
_latestPid = processResult.ProcessId;
TitleIDs.CurrentApplication.Value = processResult.ProgramIdText;
}
return true;
@@ -140,8 +132,6 @@ namespace Ryujinx.HLE.Loaders.Processes
{
_latestPid = processResult.ProcessId;
TitleIDs.CurrentApplication.Value = processResult.ProgramIdText;
return true;
}
}
@@ -193,17 +183,14 @@ namespace Ryujinx.HLE.Loaders.Processes
if (nacpData.Value.PresenceGroupId != 0)
{
programId = nacpData.Value.PresenceGroupId;
TitleIDs.CurrentApplication.Value = programId.ToString("X16");
}
else if (nacpData.Value.SaveDataOwnerId != 0)
{
programId = nacpData.Value.SaveDataOwnerId;
TitleIDs.CurrentApplication.Value = programId.ToString("X16");
}
else if (nacpData.Value.AddOnContentBaseId != 0)
{
programId = nacpData.Value.AddOnContentBaseId - 0x1000;
TitleIDs.CurrentApplication.Value = programId.ToString("X16");
}
}
@@ -217,7 +204,7 @@ namespace Ryujinx.HLE.Loaders.Processes
}
// Explicitly null TitleId to disable the shader cache.
GraphicsConfig.TitleId = null;
Graphics.Gpu.GraphicsConfig.TitleId = null;
_device.Gpu.HostInitalized.Set();
ProcessResult processResult = ProcessLoaderHelper.LoadNsos(_device,

View File

@@ -2,7 +2,6 @@ using LibHac.Common;
using LibHac.Ns;
using Ryujinx.Audio.Backends.CompatLayer;
using Ryujinx.Audio.Integration;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Graphics.Gpu;
using Ryujinx.HLE.FileSystem;
@@ -18,8 +17,6 @@ namespace Ryujinx.HLE
{
public class Switch : IDisposable
{
public static Switch Shared { get; private set; }
public HLEConfiguration Configuration { get; }
public IHardwareDeviceDriver AudioDeviceDriver { get; }
public MemoryBlock Memory { get; }
@@ -40,8 +37,6 @@ namespace Ryujinx.HLE
public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable;
public DirtyHackCollection DirtyHacks { get; }
public Switch(HLEConfiguration configuration)
{
ArgumentNullException.ThrowIfNull(configuration.GpuRenderer);
@@ -57,10 +52,9 @@ namespace Ryujinx.HLE
: MemoryAllocationFlags.Reserve | MemoryAllocationFlags.Mirrorable;
#pragma warning disable IDE0055 // Disable formatting
DirtyHacks = new DirtyHackCollection(Configuration.Hacks);
AudioDeviceDriver = new CompatLayerHardwareDeviceDriver(Configuration.AudioDeviceDriver);
Memory = new MemoryBlock(Configuration.MemoryConfiguration.ToDramSize(), memoryAllocationFlags);
Gpu = new GpuContext(Configuration.GpuRenderer, DirtyHacks);
Gpu = new GpuContext(Configuration.GpuRenderer);
System = new HOS.Horizon(this);
Statistics = new PerformanceStatistics();
Hid = new Hid(this, System.HidStorage);
@@ -78,11 +72,8 @@ namespace Ryujinx.HLE
System.EnablePtc = Configuration.EnablePtc;
System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel;
System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode;
UpdateVSyncInterval();
#pragma warning restore IDE0055
Shared = this;
}
public void ProcessFrame()
@@ -151,9 +142,6 @@ namespace Ryujinx.HLE
AudioDeviceDriver.Dispose();
FileSystem.Dispose();
Memory.Dispose();
TitleIDs.CurrentApplication.Value = null;
Shared = null;
}
}
}

View File

@@ -1,6 +1,6 @@
using System;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
public class ApplicationCountUpdatedEventArgs : EventArgs
{

View File

@@ -10,14 +10,17 @@ using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.Loaders.Processes.Extensions;
using Ryujinx.UI.Common.Helper;
using System;
using System.IO;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
public class ApplicationData
{
public static Func<string> LocalizedNever { get; set; } = () => "Never";
public bool Favorite { get; set; }
public byte[] Icon { get; set; }
public string Name { get; set; } = "Unknown";
@@ -37,7 +40,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary
public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed);
public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n");
public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n") ?? LocalizedNever();
public string FileSizeString => ValueFormatUtils.FormatFileSize(FileSize);

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ApplicationMetadata))]

View File

@@ -10,10 +10,6 @@ using LibHac.Ns;
using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Models;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Ava.Utilities.Configuration.System;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Logging;
@@ -23,11 +19,16 @@ using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.Loaders.Npdm;
using Ryujinx.HLE.Loaders.Processes.Extensions;
using Ryujinx.HLE.Utilities;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Helper;
using Ryujinx.UI.Common.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading;
@@ -37,7 +38,7 @@ using MissingKeyException = LibHac.Common.Keys.MissingKeyException;
using Path = System.IO.Path;
using TimeSpan = System.TimeSpan;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
public class ApplicationLibrary
{
@@ -75,11 +76,21 @@ namespace Ryujinx.Ava.Utilities.AppLibrary
TitleUpdates = _titleUpdates.AsObservableCache();
DownloadableContents = _downloadableContents.AsObservableCache();
_nspIcon = EmbeddedResources.Read("Ryujinx.Assets.UIImages.Icon_NSP.png");
_xciIcon = EmbeddedResources.Read("Ryujinx.Assets.UIImages.Icon_XCI.png");
_ncaIcon = EmbeddedResources.Read("Ryujinx.Assets.UIImages.Icon_NCA.png");
_nroIcon = EmbeddedResources.Read("Ryujinx.Assets.UIImages.Icon_NRO.png");
_nsoIcon = EmbeddedResources.Read("Ryujinx.Assets.UIImages.Icon_NSO.png");
_nspIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NSP.png");
_xciIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_XCI.png");
_ncaIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NCA.png");
_nroIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NRO.png");
_nsoIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NSO.png");
}
private static byte[] GetResourceBytes(string resourceName)
{
Stream resourceStream = Assembly.GetCallingAssembly().GetManifestResourceStream(resourceName)!;
byte[] resourceByteArray = new byte[resourceStream.Length];
resourceStream.ReadExactly(resourceByteArray);
return resourceByteArray;
}
/// <exception cref="Ryujinx.HLE.Exceptions.InvalidNpdmException">The npdm file doesn't contain valid data.</exception>

View File

@@ -1,7 +1,7 @@
using System;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
public class ApplicationMetadata
{

View File

@@ -3,7 +3,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
public struct LdnGameData
{

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
public class LdnGameDataReceivedEventArgs : EventArgs
{

View File

@@ -1,8 +1,11 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.AppLibrary
namespace Ryujinx.UI.App.Common
{
[JsonSerializable(typeof(IEnumerable<LdnGameData>))]
internal partial class LdnGameDataSerializerContext : JsonSerializerContext;
internal partial class LdnGameDataSerializerContext : JsonSerializerContext
{
}
}

View File

@@ -1,7 +1,7 @@
using Ryujinx.Common.Utilities;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
[JsonConverter(typeof(TypedStringEnumConverter<AudioBackend>))]
public enum AudioBackend

View File

@@ -1,5 +1,3 @@
using Ryujinx.Ava.Utilities.Configuration.System;
using Ryujinx.Ava.Utilities.Configuration.UI;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
@@ -7,17 +5,19 @@ using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Configuration.UI;
using System.Collections.Generic;
using System.Text.Json.Nodes;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
public class ConfigurationFileFormat
{
/// <summary>
/// The current version of the file format
/// </summary>
public const int CurrentVersion = 59;
public const int CurrentVersion = 57;
/// <summary>
/// Version of the configuration file format
@@ -429,17 +429,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
/// Uses Hypervisor over JIT if available
/// </summary>
public bool UseHypervisor { get; set; }
/// <summary>
/// Show toggles for dirty hacks in the UI.
/// </summary>
public bool ShowDirtyHacks { get; set; }
/// <summary>
/// The packed values of the enabled dirty hacks.
/// </summary>
public ulong[] DirtyHacks { get; set; }
/// <summary>
/// Loads a configuration file from disk
/// </summary>

View File

@@ -1,6 +1,6 @@
using Ryujinx.Common.Utilities;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
internal static class ConfigurationFileFormatSettings
{

View File

@@ -1,8 +1,10 @@
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ConfigurationFileFormat))]
internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext;
internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext
{
}
}

View File

@@ -1,5 +1,3 @@
using Ryujinx.Ava.Utilities.Configuration.System;
using Ryujinx.Ava.Utilities.Configuration.UI;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
@@ -7,11 +5,12 @@ using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Logging;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Configuration.UI;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
public partial class ConfigurationState
{
@@ -638,18 +637,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
configurationFileUpdated = true;
}
// 58 migration accidentally got skipped but it worked with no issues somehow lol
if (configurationFileFormat.Version < 59)
{
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 59.");
configurationFileFormat.ShowDirtyHacks = false;
configurationFileFormat.DirtyHacks = [];
configurationFileUpdated = true;
}
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
Graphics.ResScale.Value = configurationFileFormat.ResScale;
@@ -748,19 +735,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
Multiplayer.DisableP2p.Value = configurationFileFormat.MultiplayerDisableP2p;
Multiplayer.LdnPassphrase.Value = configurationFileFormat.MultiplayerLdnPassphrase;
Multiplayer.LdnServer.Value = configurationFileFormat.LdnServer;
Hacks.ShowDirtyHacks.Value = configurationFileFormat.ShowDirtyHacks;
{
EnabledDirtyHack[] hacks = (configurationFileFormat.DirtyHacks ?? []).Select(EnabledDirtyHack.Unpack).ToArray();
Hacks.Xc2MenuSoftlockFix.Value = hacks.Any(it => it.Hack == DirtyHacks.Xc2MenuSoftlockFix);
var shaderCompilationThreadSleep = hacks.FirstOrDefault(it =>
it.Hack == DirtyHacks.ShaderCompilationThreadSleep);
Hacks.EnableShaderTranslationDelay.Value = shaderCompilationThreadSleep != null;
Hacks.ShaderTranslationDelay.Value = shaderCompilationThreadSleep?.Value ?? 0;
}
if (configurationFileUpdated)
{

View File

@@ -1,18 +1,15 @@
using ARMeilleure;
using Gommon;
using Ryujinx.Ava.Utilities.Configuration.System;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Helper;
using Ryujinx.Common.Logging;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Helper;
using System.Collections.Generic;
using System.Linq;
using RyuLogger = Ryujinx.Common.Logging.Logger;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
public partial class ConfigurationState
{
@@ -620,67 +617,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
}
}
public class HacksSection
{
/// <summary>
/// Show toggles for dirty hacks in the UI.
/// </summary>
public ReactiveObject<bool> ShowDirtyHacks { get; private set; }
public ReactiveObject<bool> Xc2MenuSoftlockFix { get; private set; }
public ReactiveObject<bool> EnableShaderTranslationDelay { get; private set; }
public ReactiveObject<int> ShaderTranslationDelay { get; private set; }
public HacksSection()
{
ShowDirtyHacks = new ReactiveObject<bool>();
Xc2MenuSoftlockFix = new ReactiveObject<bool>();
Xc2MenuSoftlockFix.Event += HackChanged;
EnableShaderTranslationDelay = new ReactiveObject<bool>();
EnableShaderTranslationDelay.Event += HackChanged;
ShaderTranslationDelay = new ReactiveObject<int>();
}
private void HackChanged(object sender, ReactiveEventArgs<bool> rxe)
{
var newHacks = EnabledHacks.Select(x => x.Hack)
.JoinToString(", ");
if (newHacks != _lastHackCollection)
{
RyuLogger.Info?.Print(LogClass.Configuration,
$"EnabledDirtyHacks set to: [{newHacks}]", "LogValueChange");
_lastHackCollection = newHacks;
}
}
private static string _lastHackCollection;
public EnabledDirtyHack[] EnabledHacks
{
get
{
List<EnabledDirtyHack> enabledHacks = [];
if (Xc2MenuSoftlockFix)
Apply(DirtyHacks.Xc2MenuSoftlockFix);
if (EnableShaderTranslationDelay)
Apply(DirtyHacks.ShaderCompilationThreadSleep, ShaderTranslationDelay);
return enabledHacks.ToArray();
void Apply(DirtyHacks hack, int value = 0)
{
enabledHacks.Add(new EnabledDirtyHack(hack, value));
}
}
}
}
/// <summary>
/// The default configuration instance
/// </summary>
@@ -715,11 +651,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
/// The Multiplayer section
/// </summary>
public MultiplayerSection Multiplayer { get; private set; }
/// <summary>
/// The Dirty Hacks section
/// </summary>
public HacksSection Hacks { get; private set; }
/// <summary>
/// Enables or disables Discord Rich Presence
@@ -769,7 +700,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
Graphics = new GraphicsSection();
Hid = new HidSection();
Multiplayer = new MultiplayerSection();
Hacks = new HacksSection();
EnableDiscordIntegration = new ReactiveObject<bool>();
CheckUpdatesOnStart = new ReactiveObject<bool>();
ShowConfirmExit = new ReactiveObject<bool>();

View File

@@ -1,15 +1,14 @@
using Ryujinx.Ava.Utilities.Configuration.System;
using Ryujinx.Ava.Utilities.Configuration.UI;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Configuration.UI;
using System;
using System.Linq;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
public partial class ConfigurationState
{
@@ -139,8 +138,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
MultiplayerDisableP2p = Multiplayer.DisableP2p,
MultiplayerLdnPassphrase = Multiplayer.LdnPassphrase,
LdnServer = Multiplayer.LdnServer,
ShowDirtyHacks = Hacks.ShowDirtyHacks,
DirtyHacks = Hacks.EnabledHacks.Select(it => it.Pack()).ToArray(),
};
return configurationFile;

View File

@@ -0,0 +1,12 @@
namespace Ryujinx.UI.Common
{
public enum FileTypes
{
NSP,
PFS0,
XCI,
NCA,
NRO,
NSO
}
}

View File

@@ -4,7 +4,7 @@ using Ryujinx.Common.Logging.Targets;
using System;
using System.IO;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common.Configuration
{
public static class LoggerModule
{

View File

@@ -1,7 +1,8 @@
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.HOS.SystemState;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.Configuration.System
namespace Ryujinx.UI.Common.Configuration.System
{
[JsonConverter(typeof(TypedStringEnumConverter<Language>))]
public enum Language

View File

@@ -1,7 +1,7 @@
using Ryujinx.Common.Utilities;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Utilities.Configuration.System
namespace Ryujinx.UI.Common.Configuration.System
{
[JsonConverter(typeof(TypedStringEnumConverter<Region>))]
public enum Region

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Utilities.Configuration.UI
namespace Ryujinx.UI.Common.Configuration.UI
{
public struct ColumnSort
{

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Utilities.Configuration.UI
namespace Ryujinx.UI.Common.Configuration.UI
{
public struct GuiColumns
{

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Utilities.Configuration.UI
namespace Ryujinx.UI.Common.Configuration.UI
{
public struct ShownFileTypes
{

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Utilities.Configuration.UI
namespace Ryujinx.UI.Common.Configuration.UI
{
public struct WindowStartup
{

View File

@@ -1,14 +1,13 @@
using DiscordRPC;
using Humanizer;
using Humanizer.Localisation;
using Ryujinx.Ava.Utilities.AppLibrary;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common;
using Ryujinx.HLE;
using Ryujinx.HLE.Loaders.Processes;
using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common.Configuration;
using System.Text;
namespace Ryujinx.Ava
namespace Ryujinx.UI.Common
{
public static class DiscordIntegrationModule
{
@@ -45,16 +44,6 @@ namespace Ryujinx.Ava
};
ConfigurationState.Instance.EnableDiscordIntegration.Event += Update;
TitleIDs.CurrentApplication.Event += (_, e) =>
{
if (e.NewValue)
SwitchToPlayingState(
ApplicationLibrary.LoadAndSaveMetaData(e.NewValue),
Switch.Shared.Processes.ActiveApplication
);
else
SwitchToMainState();
};
}
private static void Update(object sender, ReactiveEventArgs<bool> evnt)
@@ -80,7 +69,7 @@ namespace Ryujinx.Ava
}
}
private static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes)
public static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes)
{
_discordClient?.SetPresence(new RichPresence
{
@@ -99,7 +88,7 @@ namespace Ryujinx.Ava
});
}
private static void SwitchToMainState() => _discordClient?.SetPresence(_discordPresenceMain);
public static void SwitchToMainState() => _discordClient?.SetPresence(_discordPresenceMain);
private static string TruncateToByteLength(string input)
{

View File

@@ -1,19 +1,8 @@
using System;
using static Ryujinx.UI.Common.Configuration.ConfigurationState.UISection;
using static Ryujinx.Ava.Utilities.Configuration.ConfigurationState.UISection;
namespace Ryujinx.Ava.Utilities.Configuration
namespace Ryujinx.UI.Common
{
public enum FileTypes
{
NSP,
PFS0,
XCI,
NCA,
NRO,
NSO
}
public static class FileTypesExtensions
{
/// <summary>
@@ -21,7 +10,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
/// </summary>
/// <param name="type">The name of the <see cref="ShownFileTypeSettings"/> parameter to get the value of.</param>
/// <param name="config">The config instance to get the value from.</param>
/// <returns>The current value of the setting. Value is <see langword="true"/> if the file type is to be shown on the games list, <see langword="false"/> otherwise.</returns>
/// <returns>The current value of the setting. Value is <see langword="true"/> if the file type is the be shown on the games list, <see langword="false"/> otherwise.</returns>
public static bool GetConfigValue(this FileTypes type, ShownFileTypeSettings config) => type switch
{
FileTypes.NSP => config.NSP.Value,

View File

@@ -0,0 +1,64 @@
using LibHac.Common;
using LibHac.Ncm;
using LibHac.Ns;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem;
using Ryujinx.UI.App.Common;
namespace Ryujinx.UI.Common.Helper
{
public readonly struct AppletMetadata
{
private readonly ContentManager _contentManager;
public string Name { get; }
public ulong ProgramId { get; }
public string Version { get; }
public AppletMetadata(ContentManager contentManager, string name, ulong programId, string version = "1.0.0")
: this(name, programId, version)
{
_contentManager = contentManager;
}
public AppletMetadata(string name, ulong programId, string version = "1.0.0")
{
Name = name;
ProgramId = programId;
Version = version;
}
public string GetContentPath(ContentManager contentManager)
=> (contentManager ?? _contentManager)
.GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program);
public bool CanStart(ContentManager contentManager, out ApplicationData appData, out BlitStruct<ApplicationControlProperty> appControl)
{
contentManager ??= _contentManager;
if (contentManager == null)
{
appData = null;
appControl = new BlitStruct<ApplicationControlProperty>(0);
return false;
}
appData = new()
{
Name = Name,
Id = ProgramId,
Path = GetContentPath(contentManager)
};
if (string.IsNullOrEmpty(appData.Path))
{
appControl = new BlitStruct<ApplicationControlProperty>(0);
return false;
}
appControl = StructHelpers.CreateCustomNacpData(Name, Version);
return true;
}
}
}

View File

@@ -1,7 +1,7 @@
using Ryujinx.Common.Logging;
using System.Collections.Generic;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
public static class CommandLineState
{

View File

@@ -3,7 +3,7 @@ using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
namespace Ryujinx.Common.Helper
namespace Ryujinx.UI.Common.Helper
{
public static partial class ConsoleHelper
{

View File

@@ -3,18 +3,18 @@ using LibHac.Fs;
using LibHac.Fs.Fsa;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Models;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.Utilities;
using Ryujinx.UI.Common.Models;
using System;
using System.Collections.Generic;
using System.IO;
using Path = System.IO.Path;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
public static class DownloadableContentsHelper
{

View File

@@ -8,7 +8,7 @@ using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
namespace Ryujinx.Common.Helper
namespace Ryujinx.UI.Common.Helper
{
public static partial class FileAssociationHelper
{

View File

@@ -3,7 +3,7 @@ using System.Diagnostics;
using System.IO;
using System.Runtime.Versioning;
namespace Ryujinx.Common.Helper
namespace Ryujinx.UI.Common.Helper
{
[SupportedOSPlatform("linux")]
public static class LinuxHelper

View File

@@ -2,7 +2,7 @@ using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
namespace Ryujinx.Common.Helper
namespace Ryujinx.UI.Common.Helper
{
[SupportedOSPlatform("macos")]
public static partial class ObjectiveC

View File

@@ -5,7 +5,7 @@ using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
namespace Ryujinx.Common.Helper
namespace Ryujinx.UI.Common.Helper
{
public static partial class OpenHelper
{

View File

@@ -1,10 +1,9 @@
using Ryujinx.Common.Logging;
using Ryujinx.Common.UI;
using Ryujinx.HLE.FileSystem;
using System;
using System.IO;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
/// <summary>
/// Ensure installation validity

View File

@@ -7,7 +7,7 @@ using System.Collections.Generic;
using System.IO;
using System.Runtime.Versioning;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
public static class ShortcutHelper
{
@@ -31,7 +31,7 @@ namespace Ryujinx.Ava.Utilities
private static void CreateShortcutLinux(string applicationFilePath, string applicationId, byte[] iconData, string iconPath, string desktopPath, string cleanedAppName)
{
string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx.sh");
var desktopFile = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-template.desktop");
var desktopFile = EmbeddedResources.ReadAllText("Ryujinx.UI.Common/shortcut-template.desktop");
iconPath += ".png";
var image = SKBitmap.Decode(iconData);
@@ -47,8 +47,8 @@ namespace Ryujinx.Ava.Utilities
private static void CreateShortcutMacos(string appFilePath, string applicationId, byte[] iconData, string desktopPath, string cleanedAppName)
{
string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx");
var plistFile = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-template.plist");
var shortcutScript = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-launch-script.sh");
var plistFile = EmbeddedResources.ReadAllText("Ryujinx.UI.Common/shortcut-template.plist");
var shortcutScript = EmbeddedResources.ReadAllText("Ryujinx.UI.Common/shortcut-launch-script.sh");
// Macos .App folder
string contentFolderPath = Path.Combine("/Applications", cleanedAppName + ".app", "Contents");
string scriptFolderPath = Path.Combine(contentFolderPath, "MacOS");

View File

@@ -1,6 +1,7 @@
using Ryujinx.HLE.Loaders.Processes;
using System;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
public static class TitleHelper
{

View File

@@ -6,14 +6,14 @@ using LibHac.Ncm;
using LibHac.Ns;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Models;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.Loaders.Processes.Extensions;
using Ryujinx.HLE.Utilities;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Models;
using System;
using System.Collections.Generic;
using System.IO;
@@ -22,7 +22,7 @@ using Path = System.IO.Path;
using SpanHelpers = LibHac.Common.SpanHelpers;
using TitleUpdateMetadata = Ryujinx.Common.Configuration.TitleUpdateMetadata;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
public static class TitleUpdatesHelper
{

View File

@@ -1,9 +1,8 @@
using Ryujinx.Ava.Common.Locale;
using System;
using System.Globalization;
using System.Linq;
namespace Ryujinx.Ava.Utilities
namespace Ryujinx.UI.Common.Helper
{
public static class ValueFormatUtils
{
@@ -76,7 +75,7 @@ namespace Ryujinx.Ava.Utilities
{
culture ??= CultureInfo.CurrentCulture;
return utcDateTime?.ToLocalTime().ToString(culture) ?? LocaleManager.Instance[LocaleKeys.Never];
return utcDateTime?.ToLocalTime().ToString(culture);
}
/// <summary>

View File

@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Common.Models.Amiibo
namespace Ryujinx.UI.Common.Models.Amiibo
{
public struct AmiiboApi : IEquatable<AmiiboApi>
{

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Common.Models.Amiibo
namespace Ryujinx.UI.Common.Models.Amiibo
{
public class AmiiboApiGamesSwitch
{

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Common.Models.Amiibo
namespace Ryujinx.UI.Common.Models.Amiibo
{
public class AmiiboApiUsage
{

View File

@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Common.Models.Amiibo
namespace Ryujinx.UI.Common.Models.Amiibo
{
public struct AmiiboJson
{

View File

@@ -1,7 +1,9 @@
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Common.Models.Amiibo
namespace Ryujinx.UI.Common.Models.Amiibo
{
[JsonSerializable(typeof(AmiiboJson))]
public partial class AmiiboJsonSerializerContext : JsonSerializerContext;
public partial class AmiiboJsonSerializerContext : JsonSerializerContext
{
}
}

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Common.Models
namespace Ryujinx.UI.Common.Models
{
// NOTE: most consuming code relies on this model being value-comparable
public record DownloadableContentModel(ulong TitleId, string ContainerPath, string FullPath)

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Common.Models.Github
namespace Ryujinx.UI.Common.Models.Github
{
public class GithubReleaseAssetJsonResponse
{

View File

@@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ryujinx.Ava.Common.Models.Github
namespace Ryujinx.UI.Common.Models.Github
{
public class GithubReleasesJsonResponse
{

View File

@@ -1,7 +1,9 @@
using System.Text.Json.Serialization;
namespace Ryujinx.Ava.Common.Models.Github
namespace Ryujinx.UI.Common.Models.Github
{
[JsonSerializable(typeof(GithubReleasesJsonResponse), GenerationMode = JsonSourceGenerationMode.Metadata)]
public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext;
public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext
{
}
}

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Ava.Common.Models
namespace Ryujinx.UI.Common.Models
{
// NOTE: most consuming code relies on this model being value-comparable
public record TitleUpdateModel(ulong TitleId, ulong Version, string DisplayVersion, string Path)

View File

@@ -1,8 +1,8 @@
using Ryujinx.Ava.Utilities.AppLibrary;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.UI.App.Common;
namespace Ryujinx.Ava.Common.Models
namespace Ryujinx.UI.Common.Models
{
public record XCITrimmerFileModel(
string Name,

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 68 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 66 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1050 1050.5"
style="enable-background:new 0 0 1050 1050.5;" xml:space="preserve">
<style type="text/css">
.st0{fill:#20221F;}
.st1{fill:#3B3B3B;}
.st2{fill:#121212;}
.st3{fill:#444542;}
.st4{fill:#FFFFFF;}
.st5{fill:#444542;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
.st6{fill:#454644;}
.st7{fill:#454644;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
.st8{fill:#3B3C3A;}
.st9{font-family:'Helvetica-Bold';}
.st10{font-size:40px;}
.st11{fill:#0D0D0A;}
</style>
<g id="Front">
<path id="Right_Grip_00000028282943321285403220000008369785803052272051_" class="st0" d="M766,850.5
c34,28.2,27.6,35.9,68.5,108.5c36.7,74.7,64.4,104.4,125.1,84.1v0c95.3-57.9,59.3-145.3,43.6-275.2c-10-60.6-35.6-190.3-35.6-190.3
L766,850.5z"/>
<path id="Left_Grip" class="st0" d="M82.3,577.6c0,0-25.6,129.7-35.6,190.3C31,897.8-5,985.1,90.3,1043v0
c60.8,20.3,88.4-9.4,125.1-84.1c40.9-72.7,34.5-80.3,68.5-108.5L82.3,577.6z"/>
<path id="Right_Bumper_00000006710349871522532470000011078040965381267594_" class="st1" d="M676.3,378.4
c10.1-4.3,39.7-22.5,58.7-19.7c59.5,0.9,166.7,17.7,172.6,81.2"/>
<path id="Left_Bumper_00000024680414077879639570000011759596763560342154_" class="st1" d="M142.4,439.9
c5.9-63.4,113-80.2,172.6-81.2c19-2.8,48.6,15.4,58.7,19.7"/>
<path id="Background_00000141418846164053065470000016150094984198570163_" class="st2" d="M766,850.5
c35.5-30.8,68.5-74.7,96-113.5c26.9-36.3,94.7-136.7,105.6-159.3c0-2.4-6.3-30.1-12.8-56.2C919.1,361.9,702.2,378.1,525,378.1
c-177.4,0-394.1-16.2-429.9,143.3c-6.5,26-12.8,53.8-12.8,56.2c10.9,22.6,78.8,123,105.6,159.3c27.5,38.8,60.5,82.8,96,113.5"/>
<g id="Directional_Pad">
<path id="Background_00000032628022449190479560000015279211462520783249_" class="st3" d="M466.2,683.5h-40c-2.8,0-5-2.2-5-5v-40
c0-2.8-2.2-5-5-5h-30c-2.8,0-5,2.2-5,5v40c0,2.8-2.2,5-5,5h-40c-2.8,0-5,2.2-5,5v30c0,2.8,2.2,5,5,5h40c2.8,0,5,2.2,5,5v40
c0,2.8,2.2,5,5,5h30c2.8,0,5-2.2,5-5v-40c0-2.8,2.2-5,5-5h40c2.8,0,5-2.2,5-5v-30C471.2,685.8,469,683.5,466.2,683.5z"/>
<g id="Arrows">
<g>
<polygon class="st4" points="393.7,746 408.7,746 401.2,761 "/>
</g>
<g>
<polygon class="st4" points="358.7,696 358.7,711 343.7,703.5 "/>
</g>
<g>
<polygon class="st4" points="408.7,661 393.7,661 401.2,646 "/>
</g>
<g>
<polygon class="st4" points="443.7,711 443.7,696 458.7,703.5 "/>
</g>
</g>
</g>
<g id="R_Thumbstick_00000152226188525111835500000011838297421350334865_">
<circle id="Background_00000035532849542660068350000006517224202948159422_" class="st0" cx="650.6" cy="703.5" r="55"/>
<circle id="Stick" class="st5" cx="650.6" cy="703.5" r="45"/>
</g>
<g id="L_Thumbstick_00000047032468231999382210000005512347386782594484_">
<circle id="Background_00000182502673988292164000000007125719133096369561_" class="st0" cx="240.2" cy="564.8" r="55"/>
<circle id="Stick_00000075121990265259598900000000214370239054002365_" class="st5" cx="240.2" cy="564.8" r="45"/>
</g>
<g id="Minus_Button">
<circle id="_Background_00000120554951013892796430000015877571645746699662_" class="st6" cx="401" cy="489.3" r="22.5"/>
<polyline id="Plus_00000039131319101621183460000006196023733899658629_" class="st4" points="386.2,491.8 386.2,486.8
416.2,486.8 416.2,491.8 "/>
</g>
<g id="Plus_Button">
<circle id="_Background" class="st6" cx="650.4" cy="489.6" r="22.5"/>
<polygon id="Plus" class="st4" points="665.6,487.1 653.1,487.1 653.1,474.4 648.1,474.4 648.1,487.1 635.6,487.1 635.6,492.1
648.1,492.1 648.1,504.4 653.1,504.4 653.1,492.1 665.6,492.1 "/>
</g>
<g id="Home_Button_00000029758737660217614780000001403165237001195407_">
<circle id="_Background_00000132788487854287834010000009548421243227981499_" class="st6" cx="605.4" cy="564.8" r="22.5"/>
<path id="Home" class="st4" d="M605.4,549.8l-15,15h5v15h20v-15h5L605.4,549.8z M610.4,574.8h-10v-10h10V574.8z"/>
</g>
<g id="Capture_Button_00000105394663133565750060000017455731898661404072_">
<path class="st6" d="M468.6,586.5h-30c-2.8,0-5-2.2-5-5v-29.5c0-2.8,2.2-5,5-5h30c2.8,0,5,2.2,5,5v29.5
C473.6,584.2,471.4,586.5,468.6,586.5z"/>
<circle class="st7" cx="453.6" cy="566.7" r="15"/>
</g>
<g id="Buttons_00000023239109225132251950000005218343074279628213_">
<g id="A_Button">
<circle id="Background_00000006699118933065716380000004636085088820886913_" class="st8" cx="863.9" cy="564.8" r="35"/>
<text transform="matrix(1 0 0 1 849.4224 578.6607)" class="st4 st9 st10">A</text>
</g>
<g id="X_Button">
<circle id="Background_00000083074713085756701790000016893839312974798515_" class="st8" cx="793.9" cy="494.8" r="35"/>
<text transform="matrix(1 0 0 1 780.5266 508.6604)" class="st4 st9 st10">X</text>
</g>
<g id="Y_Button_00000100344340438574137780000014238704828967683973_">
<circle id="Background_00000137100455694543496620000011124722786613194377_" class="st8" cx="723.9" cy="564.8" r="35"/>
<text transform="matrix(1 0 0 1 710.5263 578.661)" class="st4 st9 st10">Y</text>
</g>
<g id="B_Button_00000041994261956088037220000013468634544777304733_">
<circle id="Background_00000096038108578846046800000001873940014252420514_" class="st8" cx="793.9" cy="634.8" r="35"/>
<text transform="matrix(1 0 0 1 780.9706 648.6605)" class="st4 st9 st10">B</text>
</g>
</g>
</g>
<g id="Top_Down">
<path id="Left_Grip_00000026131988385328425370000016677941743356253314_" class="st0" d="M219.2,78.5
c-12.5-17.6-25.9-42.3-45.6-58.6C153.5,3.3,112.1-4.7,87.1,5.8c-13.9,5.8-33.4,33.1-42.7,52.8C33.9,80.9,30.4,109.9,32,141.4
c1.2,25.1,5.3,51.7,14.2,78.6c0,0,14.3,53.8,42.8,80.8c11.2,10.6,35,26.6,35,26.6l116-217.5C240,109.9,224.6,86.2,219.2,78.5z"/>
<path id="Right_Grip_00000016782759094708820330000002450847065936193693_" class="st0" d="M828.6,78.5
c12.5-17.6,25.9-42.3,45.6-58.6c20.1-16.6,61.4-24.5,86.5-14.1c13.9,5.8,33.4,33.1,42.7,52.8c10.5,22.3,13.9,51.3,12.4,82.8
c-1.2,25.1-5.3,51.7-14.2,78.6c0,0-14.3,53.8-42.8,80.8c-11.2,10.6-35,26.6-35,26.6l-116-217.5C807.8,109.9,823.2,86.2,828.6,78.5z
"/>
<path id="Background_00000169534857628063347190000007586592143875928969_" class="st11" d="M866,122.2
c66.3,18.7,85.1,128.8,69,186c-2.5,54.2-148.9,15.3-265.1,31.2c-41.1,1.7-91.8,2.4-145.9,2.3c-54.1,0-104.8-0.6-145.9-2.3
c-116.2-15.9-262.6,23.1-265.1-31.2c-16.1-57.1,2.6-167.3,69-186l60.5-18.8l38.9-1.9c40.2,0.1,142.8,0,242.7,0
c99.9,0,202.4,0.1,242.7,0l38.9,1.9L866,122.2z"/>
<g id="ZL_Trigger_00000005254517714433203260000014117442438696169895_">
<path id="Background_00000111870097528015387240000017384507710402295183_" class="st1" d="M145.9,239.2
c15.2-97.4,38.1-147.2,141.7-137c8.2,16.4,43.3,83,50.6,105.7C280.6,227.2,204.7,225.6,145.9,239.2z"/>
<text id="ZL_Trigger" transform="matrix(1.0139 0 0 1 218.3906 179.3992)" class="st4 st9 st10">ZL</text>
</g>
<g id="ZR_Trigger">
<path id="Background_00000133526766189752063450000016781240006605114763_" class="st1" d="M716.2,207.9
c7.4-22.7,42.5-89.3,50.6-105.7c103.7-10.2,126.5,39.6,141.7,137C849.8,225.6,773.8,227.2,716.2,207.9z"/>
<text id="ZL_Trigger_00000000206350378518266660000001315160307759857328_" transform="matrix(1.0139 0 0 1 784.2356 179.3992)" class="st4 st9 st10">ZR</text>
</g>
<g id="R_Trigger_00000085939413106284991650000014018840000393673094_">
<path id="Background" class="st1" d="M664,318.5c7-10.1,27.8-78.4,45.4-78.7C1040.8,243.7,897.1,334,664,318.5z"/>
<text id="R_Trigger" transform="matrix(1 0 0 1 769.6461 292.8947)" class="st4 st9 st10">R</text>
</g>
<g id="L_Trigger">
<path id="Background_00000043427985111927735300000011910735497762731703_" class="st1" d="M340.6,238.6
c17.6,0.3,38.4,68.6,45.4,78.7C152.9,332.8,9.2,242.6,340.6,238.6z"/>
<text id="R_Trigger_00000092444210070373642420000009814634285137007748_" transform="matrix(1 0 0 1 253.7327 291.7279)" class="st4 st9 st10">L</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 253 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -21,6 +21,34 @@
<None Remove="Resources\Logo_Ryujinx.png" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Controller_JoyConLeft.svg" />
<EmbeddedResource Include="Resources\Controller_JoyConPair.svg" />
<EmbeddedResource Include="Resources\Controller_JoyConRight.svg" />
<EmbeddedResource Include="Resources\Controller_ProCon.svg" />
<EmbeddedResource Include="Resources\Icon_NCA.png" />
<EmbeddedResource Include="Resources\Icon_NRO.png" />
<EmbeddedResource Include="Resources\Icon_NSO.png" />
<EmbeddedResource Include="Resources\Icon_NSP.png" />
<EmbeddedResource Include="Resources\Icon_XCI.png" />
<EmbeddedResource Include="Resources\Logo_Amiibo.png" />
<EmbeddedResource Include="Resources\Logo_Ryujinx.png" />
<EmbeddedResource Include="Resources\Logo_Ryujinx_AntiAlias.png" />
<EmbeddedResource Include="Resources\Logo_Discord_Dark.png" />
<EmbeddedResource Include="Resources\Logo_Discord_Light.png" />
<EmbeddedResource Include="Resources\Logo_GitHub_Dark.png" />
<EmbeddedResource Include="Resources\Logo_GitHub_Light.png" />
</ItemGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR '$(RuntimeIdentifier)' == 'linux-arm64' OR '$(RuntimeIdentifier)' == ''">
<EmbeddedResource Include="..\..\distribution\linux\shortcut-template.desktop" />
</ItemGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'osx-x64' OR '$(RuntimeIdentifier)' == 'osx-arm64' OR '$(RuntimeIdentifier)' == ''">
<EmbeddedResource Include="..\..\distribution\macos\shortcut-template.plist" />
<EmbeddedResource Include="..\..\distribution\macos\shortcut-launch-script.sh" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DiscordRichPresence" />
<PackageReference Include="DynamicData" />

View File

@@ -5,7 +5,7 @@ using System.Globalization;
using System.IO;
using System.Runtime.Versioning;
namespace Ryujinx.Ava.Utilities.SystemInfo
namespace Ryujinx.UI.Common.SystemInfo
{
[SupportedOSPlatform("linux")]
class LinuxSystemInfo : SystemInfo

View File

@@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
namespace Ryujinx.Ava.Utilities.SystemInfo
namespace Ryujinx.UI.Common.SystemInfo
{
[SupportedOSPlatform("macos")]
partial class MacOSSystemInfo : SystemInfo

View File

@@ -1,10 +1,11 @@
using Ryujinx.Common.Logging;
using Ryujinx.UI.Common.Helper;
using System;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics.X86;
using System.Text;
namespace Ryujinx.Ava.Utilities.SystemInfo
namespace Ryujinx.UI.Common.SystemInfo
{
public class SystemInfo
{

View File

@@ -4,7 +4,7 @@ using System.Management;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
namespace Ryujinx.Ava.Utilities.SystemInfo
namespace Ryujinx.UI.Common.SystemInfo
{
[SupportedOSPlatform("windows")]
partial class WindowsSystemInfo : SystemInfo

View File

@@ -1,4 +1,4 @@
namespace Ryujinx.Common.UI
namespace Ryujinx.UI.Common
{
/// <summary>
/// Represent a common error that could be reported to the user by the emulator.

View File

@@ -20,15 +20,11 @@ using Ryujinx.Ava.UI.Models;
using Ryujinx.Ava.UI.Renderer;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Ava.Utilities;
using Ryujinx.Ava.Utilities.AppLibrary;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Logging;
using Ryujinx.Common.SystemInterop;
using Ryujinx.Common.UI;
using Ryujinx.Common.Utilities;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.GAL.Multithreading;
@@ -43,6 +39,10 @@ using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.Input;
using Ryujinx.Input.HLE;
using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper;
using Silk.NET.Vulkan;
using SkiaSharp;
using SPB.Graphics.Vulkan;
@@ -311,7 +311,6 @@ namespace Ryujinx.Ava
Device.VSyncMode = e.NewValue;
Device.UpdateVSyncInterval();
}
_renderer.Window?.ChangeVSyncMode(e.NewValue);
_viewModel.ShowCustomVSyncIntervalPicker = (e.NewValue == VSyncMode.Custom);
@@ -578,6 +577,7 @@ namespace Ryujinx.Ava
public void Stop()
{
_isActive = false;
DiscordIntegrationModule.SwitchToMainState();
}
private void Exit()
@@ -861,11 +861,13 @@ namespace Ryujinx.Ava
return false;
}
ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
ApplicationMetadata appMeta = ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
appMetadata => appMetadata.UpdatePreGame()
);
DiscordIntegrationModule.SwitchToPlayingState(appMeta, Device.Processes.ActiveApplication);
return true;
}
@@ -921,7 +923,7 @@ namespace Ryujinx.Ava
// Initialize Configuration.
var memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value;
Device = new Switch(new HLEConfiguration(
Device = new HLE.Switch(new HLEConfiguration(
VirtualFileSystem,
_viewModel.LibHacHorizonManager,
ContentManager,
@@ -951,8 +953,7 @@ namespace Ryujinx.Ava
ConfigurationState.Instance.Multiplayer.DisableP2p,
ConfigurationState.Instance.Multiplayer.LdnPassphrase,
ConfigurationState.Instance.Multiplayer.LdnServer,
ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value,
ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : null));
ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value));
}
private static IHardwareDeviceDriver InitializeAudio()

View File

@@ -1564,7 +1564,7 @@
"pl_PL": "Wersja",
"pt_BR": "Versão",
"ru_RU": "Версия",
"sv_SE": "Version",
"sv_SE": "",
"th_TH": "เวอร์ชั่น",
"tr_TR": "Sürüm",
"uk_UA": "Версія",
@@ -2213,8 +2213,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "ExeFS",
"sv_SE": "ExeFS",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -2263,8 +2263,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "RomFS",
"sv_SE": "RomFS",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -2310,7 +2310,7 @@
"it_IT": "",
"ja_JP": "ロゴ",
"ko_KR": "로고",
"no_NO": "Logo",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Лого",
@@ -3260,11 +3260,11 @@
"it_IT": "Sistema",
"ja_JP": "システム",
"ko_KR": "시스템",
"no_NO": "System",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Sistema",
"ru_RU": "Система",
"sv_SE": "System",
"sv_SE": "",
"th_TH": "ระบบ",
"tr_TR": "Sistem",
"uk_UA": "Система",
@@ -3335,11 +3335,11 @@
"it_IT": "Giappone",
"ja_JP": "日本",
"ko_KR": "일본",
"no_NO": "Japan",
"no_NO": "",
"pl_PL": "Japonia",
"pt_BR": "Japão",
"ru_RU": "Япония",
"sv_SE": "Japan",
"sv_SE": "",
"th_TH": "ญี่ปุ่น",
"tr_TR": "Japonya",
"uk_UA": "Японія",
@@ -3360,11 +3360,11 @@
"it_IT": "Stati Uniti d'America",
"ja_JP": "アメリカ",
"ko_KR": "미국",
"no_NO": "USA",
"no_NO": "",
"pl_PL": "Stany Zjednoczone",
"pt_BR": "EUA",
"ru_RU": "США",
"sv_SE": "USA",
"sv_SE": "",
"th_TH": "สหรัฐอเมริกา",
"tr_TR": "ABD",
"uk_UA": "США",
@@ -3410,7 +3410,7 @@
"it_IT": "",
"ja_JP": "オーストラリア",
"ko_KR": "호주",
"no_NO": "Australia",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Austrália",
"ru_RU": "Австралия",
@@ -3460,11 +3460,11 @@
"it_IT": "Corea",
"ja_JP": "韓国",
"ko_KR": "한국",
"no_NO": "Korea",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Coreia",
"ru_RU": "Корея",
"sv_SE": "Korea",
"sv_SE": "",
"th_TH": "เกาหลี",
"tr_TR": "Kore",
"uk_UA": "Корея",
@@ -3485,11 +3485,11 @@
"it_IT": "",
"ja_JP": "台湾",
"ko_KR": "대만",
"no_NO": "Taiwan",
"no_NO": "",
"pl_PL": "Tajwan",
"pt_BR": "",
"ru_RU": "Тайвань",
"sv_SE": "Taiwan",
"sv_SE": "",
"th_TH": "ไต้หวัน",
"tr_TR": "Tayvan",
"uk_UA": "Тайвань",
@@ -3955,7 +3955,7 @@
"el_GR": "Ζώνη Ώρας Συστήματος:",
"en_US": "System Time Zone:",
"es_ES": "Zona horaria del sistema:",
"fr_FR": "Fuseau horaire du système :",
"fr_FR": "Fuseau horaire du système\u00A0:",
"he_IL": "אזור זמן מערכת:",
"it_IT": "Fuso orario del sistema:",
"ja_JP": "タイムゾーン:",
@@ -4135,11 +4135,11 @@
"it_IT": "",
"ja_JP": "ダミー",
"ko_KR": "더미",
"no_NO": "Dummy",
"no_NO": "",
"pl_PL": "Atrapa",
"pt_BR": "Nenhuma",
"ru_RU": "Без звука",
"sv_SE": "Dummy",
"sv_SE": "",
"th_TH": "",
"tr_TR": "Yapay",
"uk_UA": "",
@@ -4163,8 +4163,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "OpenAL",
"sv_SE": "OpenAL",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4188,8 +4188,8 @@
"no_NO": "Lyd Inn/Ut",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "SoundIO",
"sv_SE": "SoundIO",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4213,8 +4213,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "SDL2",
"sv_SE": "SDL2",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4230,12 +4230,12 @@
"el_GR": "Μικροδιορθώσεις",
"en_US": "Hacks",
"es_ES": "",
"fr_FR": "Hacks",
"fr_FR": "",
"he_IL": "האצות",
"it_IT": "Espedienti",
"ja_JP": "ハック",
"ko_KR": "핵",
"no_NO": "Hacks",
"no_NO": "",
"pl_PL": "Hacki",
"pt_BR": "",
"ru_RU": "Хаки",
@@ -4314,7 +4314,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "4ГиБ",
"sv_SE": "4GiB",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "4Гб",
@@ -4339,7 +4339,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "6ГиБ",
"sv_SE": "6GiB",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "6Гб",
@@ -4364,7 +4364,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "8ГиБ",
"sv_SE": "8GiB",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "8Гб",
@@ -4389,7 +4389,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "12ГиБ",
"sv_SE": "12GiB",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "12Гб",
@@ -4585,11 +4585,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "2배",
"no_NO": "2x",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "2x",
"sv_SE": "2x",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4610,11 +4610,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "4배",
"no_NO": "4x",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "4x",
"sv_SE": "4x",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4635,11 +4635,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "8배",
"no_NO": "8x",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "8x",
"sv_SE": "8x",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4660,11 +4660,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "16배",
"no_NO": "16x",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "16x",
"sv_SE": "16x",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4760,11 +4760,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "2배(1440p/2160p)",
"no_NO": "2x (1440p/2160p)",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "2x (1440p/2160p)",
"sv_SE": "2x (1440p/2160p)",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4785,11 +4785,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "3배(2160p/3240p)",
"no_NO": "3x (2160p/3240p)",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "3x (2160p/3240p)",
"sv_SE": "3x (2160p/3240p)",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4863,8 +4863,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "4:3",
"sv_SE": "4:3",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4888,8 +4888,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "16:9",
"sv_SE": "16:9",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4913,8 +4913,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "16:10",
"sv_SE": "16:10",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4938,8 +4938,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "21:9",
"sv_SE": "21:9",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -4960,11 +4960,11 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "32:9",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "32:9",
"sv_SE": "32:9",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -5060,7 +5060,7 @@
"it_IT": "Log",
"ja_JP": "ロギング",
"ko_KR": "로그 기록",
"no_NO": "Logging",
"no_NO": "",
"pl_PL": "Dziennik zdarzeń",
"pt_BR": "Log",
"ru_RU": "Журналирование",
@@ -5085,7 +5085,7 @@
"it_IT": "Log",
"ja_JP": "ロギング",
"ko_KR": "로그 기록",
"no_NO": "Logging",
"no_NO": "",
"pl_PL": "Dziennik zdarzeń",
"pt_BR": "Log",
"ru_RU": "Журналирование",
@@ -6113,8 +6113,8 @@
"no_NO": "",
"pl_PL": "Pro Kontroler",
"pt_BR": "",
"ru_RU": "Pro Controller",
"sv_SE": "Pro Controller",
"ru_RU": "",
"sv_SE": "",
"th_TH": "โปรคอนโทรลเลอร์",
"tr_TR": "Profesyonel Kumanda",
"uk_UA": "Контролер Pro",
@@ -8088,8 +8088,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Enter",
"sv_SE": "Enter",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8114,7 +8114,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Esc",
"sv_SE": "Escape",
"sv_SE": "",
"th_TH": "",
"tr_TR": "Esc",
"uk_UA": "",
@@ -8163,8 +8163,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Tab",
"sv_SE": "Tab",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8188,8 +8188,8 @@
"no_NO": "Tilbaketast",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Backspace",
"sv_SE": "Backspace",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "Geri tuşu",
"uk_UA": "",
@@ -8213,8 +8213,8 @@
"no_NO": "Sett inn",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Insert",
"sv_SE": "Insert",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8238,8 +8238,8 @@
"no_NO": "Slett",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Delete",
"sv_SE": "Delete",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8263,8 +8263,8 @@
"no_NO": "Side opp",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Page Up",
"sv_SE": "Page Up",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8288,8 +8288,8 @@
"no_NO": "Side ned",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Page Down",
"sv_SE": "Page Down",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8313,8 +8313,8 @@
"no_NO": "Hjem",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Home",
"sv_SE": "Home",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8338,8 +8338,8 @@
"no_NO": "Avslutt",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "End",
"sv_SE": "End",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8363,8 +8363,8 @@
"no_NO": "Skiftelås",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Caps Lock",
"sv_SE": "Caps Lock",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8388,8 +8388,8 @@
"no_NO": "Rullelås",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Scroll Lock",
"sv_SE": "Scroll Lock",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8413,8 +8413,8 @@
"no_NO": "Skjermbilde",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Print Screen",
"sv_SE": "Print Screen",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8438,8 +8438,8 @@
"no_NO": "Stans midlertidig",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Pause",
"sv_SE": "Pause",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8463,8 +8463,8 @@
"no_NO": "Numerisk Lås",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Num Lock",
"sv_SE": "Num Lock",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8514,7 +8514,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 0",
"sv_SE": "Keypad 0",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8539,7 +8539,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 1",
"sv_SE": "Keypad 1",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8564,7 +8564,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 2",
"sv_SE": "Keypad 2",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8589,7 +8589,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 3",
"sv_SE": "Keypad 3",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8614,7 +8614,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 4",
"sv_SE": "Keypad 4",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8639,7 +8639,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 5",
"sv_SE": "Keypad 5",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8664,7 +8664,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 6",
"sv_SE": "Keypad 6",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8689,7 +8689,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 7",
"sv_SE": "Keypad 7",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8714,7 +8714,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 8",
"sv_SE": "Keypad 8",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8739,7 +8739,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Блок цифр 9",
"sv_SE": "Keypad 9",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8889,7 +8889,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Enter (блок цифр)",
"sv_SE": "Keypad Enter",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -8913,7 +8913,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "0",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -8938,7 +8938,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "1",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -8963,7 +8963,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "2",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -8988,7 +8988,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "3",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9013,7 +9013,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "4",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9038,7 +9038,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "5",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9063,7 +9063,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "6",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9088,7 +9088,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "7",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9113,7 +9113,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "8",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9138,7 +9138,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "9",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9163,7 +9163,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "~",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9188,7 +9188,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "`",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9213,7 +9213,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "-",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9238,7 +9238,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "+",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9263,7 +9263,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "[",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9288,7 +9288,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "]",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9313,7 +9313,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": ";",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9363,7 +9363,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": ",",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9388,7 +9388,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": ".",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9413,7 +9413,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "/",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9738,7 +9738,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "-",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -9763,7 +9763,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "+",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "4",
@@ -9789,7 +9789,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Кнопка меню",
"sv_SE": "Guide",
"sv_SE": "",
"th_TH": "",
"tr_TR": "Rehber",
"uk_UA": "",
@@ -12438,7 +12438,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "{0}: {1}",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -14289,7 +14289,7 @@
"pl_PL": "Seria Amiibo",
"pt_BR": "Franquia Amiibo",
"ru_RU": "Серия Amiibo",
"sv_SE": "Amiibo Series",
"sv_SE": "",
"th_TH": "",
"tr_TR": "Amiibo Serisi",
"uk_UA": "Серія Amiibo",
@@ -15755,7 +15755,7 @@
"el_GR": "",
"en_US": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
"es_ES": "Relación de aspecto aplicada a la ventana del renderizador.\n\nSolamente modificar esto si estás utilizando un mod de relación de aspecto para su juego, en cualquier otro caso los gráficos se estirarán.\n\nDejar en 16:9 si no sabe que hacer.",
"fr_FR": "Format d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.",
"fr_FR": "Format\u00A0d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format\u00A0d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.",
"he_IL": "",
"it_IT": "Proporzioni dello schermo applicate alla finestra di renderizzazione.\n\nCambialo solo se stai usando una mod di proporzioni per il tuo gioco, altrimenti la grafica verrà allungata.\n\nLasciare il 16:9 se incerto.",
"ja_JP": "レンダリングウインドウに適用するアスペクト比です.\n\nゲームにアスペクト比を変更する mod を使用している場合のみ変更してください.\n\nわからない場合は16:9のままにしておいてください.\n",
@@ -17428,23 +17428,23 @@
"ar_SA": "الإصدار: {0}",
"de_DE": "",
"el_GR": "",
"en_US": "Version {0}",
"es_ES": "Versión {0}",
"en_US": "Version {0} - {1}",
"es_ES": "Versión {0} - {1}",
"fr_FR": "",
"he_IL": "גרסה: {0}",
"it_IT": "Versione {0}",
"ja_JP": "バージョン {0}",
"ko_KR": "버전 {0}",
"no_NO": "Versjon {0}",
"pl_PL": "Wersja {0}",
"pt_BR": "Versão {0}",
"ru_RU": "Версия {0}",
"sv_SE": "Version {0}",
"th_TH": "เวอร์ชั่น {0}",
"tr_TR": "Sürüm {0}",
"uk_UA": "Версія {0}",
"zh_CN": "游戏更新的版本 {0}",
"zh_TW": "版本 {0}"
"he_IL": "גרסה {0} - {1}",
"it_IT": "Versione {0} - {1}",
"ja_JP": "バージョン {0} - {1}",
"ko_KR": "버전 {0} - {1}",
"no_NO": "Versjon {0} - {1}",
"pl_PL": "Wersja {0} - {1}",
"pt_BR": "Versão {0} - {1}",
"ru_RU": "Версия {0} - {1}",
"sv_SE": "",
"th_TH": "เวอร์ชั่น {0} - {1}",
"tr_TR": "Sürüm {0} - {1}",
"uk_UA": "Версія {0} - {1}",
"zh_CN": "游戏更新的版本 {0} - {1}",
"zh_TW": "版本 {0} - {1}"
}
},
{
@@ -17664,7 +17664,7 @@
"pl_PL": "",
"pt_BR": "Ryujinx - Informação",
"ru_RU": "Ryujinx - Информация",
"sv_SE": "Ryujinx - Info",
"sv_SE": "",
"th_TH": "Ryujinx ข้อมูล",
"tr_TR": "Ryujinx - Bilgi",
"uk_UA": "Ryujin x - Інформація",
@@ -18813,8 +18813,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Amiibo",
"sv_SE": "Amiibo",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -19435,7 +19435,7 @@
"it_IT": "",
"ja_JP": "",
"ko_KR": "XCI 파일 트리머",
"no_NO": "XCI File Trimmer",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Уменьшение размера XCI файлов",
@@ -19639,7 +19639,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "{0:n0} Мб",
"sv_SE": "{0:n0} Mb",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "{0:n0} Мб",
@@ -20914,7 +20914,7 @@
"pl_PL": "Głoś",
"pt_BR": "",
"ru_RU": "Громкость",
"sv_SE": "Vol",
"sv_SE": "",
"th_TH": "ระดับเสียง",
"tr_TR": "Ses",
"uk_UA": "Гуч.",
@@ -21055,7 +21055,7 @@
"el_GR": "Όνομα",
"en_US": "Name",
"es_ES": "Nombre",
"fr_FR": "Nom ",
"fr_FR": "Nom\u00A0",
"he_IL": "שם",
"it_IT": "Nome",
"ja_JP": "名称",
@@ -21388,8 +21388,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "FSR",
"sv_SE": "FSR",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -21888,8 +21888,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "ldn_mitm",
"sv_SE": "ldn_mitm",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -21913,8 +21913,8 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "RyuLDN",
"sv_SE": "RyuLDN",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -22214,7 +22214,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Вертикальная синхронизация:",
"sv_SE": "VSync:",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Вертикальна синхронізація (VSync):",
@@ -22255,7 +22255,7 @@
"el_GR": "",
"en_US": "Switch",
"es_ES": "",
"fr_FR": "Switch",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
@@ -22264,7 +22264,7 @@
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Консоль",
"sv_SE": "Switch",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -22598,4 +22598,4 @@
}
}
]
}
}

View File

@@ -15,12 +15,12 @@ using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common.Helper;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.Loaders.Processes.Extensions;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper;
using System;
using System.Buffers;
using System.IO;

View File

@@ -1,8 +1,8 @@
using Gommon;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common;
using Ryujinx.Common.Utilities;
using Ryujinx.UI.Common.Configuration;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

Some files were not shown because too many files have changed in this diff Show More