diff --git a/README.md b/README.md
index ce8cc9a61..ef3e683e6 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
[](https://github.com/Ryubing/Ryujinx/releases/latest)
[](https://github.com/Ryubing/Ryujinx/actions/workflows/canary.yml)
-[](https://github.com/Ryubing/Ryujinx-Canary/releases/latest)
+[](https://github.com/Ryubing/Canary-Releases/releases/latest)
@@ -64,7 +64,7 @@ Canary builds are compiled automatically for each commit on the `master` branch.
While we strive to ensure optimal stability and performance prior to pushing an update, these builds **may be unstable or completely broken**.
These canary builds are only recommended for experienced users.
-You can find the latest canary release [here](https://github.com/Ryubing/Ryujinx-Canary/releases/latest).
+You can find the latest canary release [here](https://github.com/Ryubing/Canary-Releases/releases/latest).
## Documentation
diff --git a/src/ARMeilleure/CodeGen/CompiledFunction.cs b/src/ARMeilleure/CodeGen/CompiledFunction.cs
index 8ea7ff532..7014f715a 100644
--- a/src/ARMeilleure/CodeGen/CompiledFunction.cs
+++ b/src/ARMeilleure/CodeGen/CompiledFunction.cs
@@ -1,7 +1,6 @@
using ARMeilleure.CodeGen.Linking;
using ARMeilleure.CodeGen.Unwinding;
using ARMeilleure.Translation.Cache;
-using System;
using System.Runtime.InteropServices;
namespace ARMeilleure.CodeGen
diff --git a/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs b/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs
index 45695396f..d22c89a75 100644
--- a/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs
+++ b/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs
@@ -1,4 +1,3 @@
-using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
diff --git a/src/ARMeilleure/Native/JitSupportDarwin.cs b/src/ARMeilleure/Native/JitSupportDarwin.cs
index 39df3878f..9383b9a08 100644
--- a/src/ARMeilleure/Native/JitSupportDarwin.cs
+++ b/src/ARMeilleure/Native/JitSupportDarwin.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/ARMeilleure/Signal/TestMethods.cs b/src/ARMeilleure/Signal/TestMethods.cs
index 5f9f456bc..684157860 100644
--- a/src/ARMeilleure/Signal/TestMethods.cs
+++ b/src/ARMeilleure/Signal/TestMethods.cs
@@ -1,6 +1,5 @@
using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation;
-using System;
using System.Runtime.InteropServices;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
diff --git a/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs b/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs
index 7aa3e4788..0df2f41cd 100644
--- a/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs
+++ b/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs
@@ -1,7 +1,6 @@
using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation;
using Ryujinx.Common.Memory.PartialUnmaps;
-using System;
using System.Runtime.InteropServices;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
diff --git a/src/ARMeilleure/State/ExecutionContext.cs b/src/ARMeilleure/State/ExecutionContext.cs
index 314b06b13..6996ec221 100644
--- a/src/ARMeilleure/State/ExecutionContext.cs
+++ b/src/ARMeilleure/State/ExecutionContext.cs
@@ -1,5 +1,4 @@
using ARMeilleure.Memory;
-using System;
namespace ARMeilleure.State
{
diff --git a/src/ARMeilleure/Translation/ArmEmitterContext.cs b/src/ARMeilleure/Translation/ArmEmitterContext.cs
index 5d09783ff..196120e92 100644
--- a/src/ARMeilleure/Translation/ArmEmitterContext.cs
+++ b/src/ARMeilleure/Translation/ArmEmitterContext.cs
@@ -6,7 +6,6 @@ using ARMeilleure.Instructions;
using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Memory;
using ARMeilleure.State;
-using System;
using System.Collections.Generic;
using System.Reflection;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
diff --git a/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs b/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs
index e24f5e864..02e27b941 100644
--- a/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs
+++ b/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs
@@ -1,5 +1,4 @@
using ARMeilleure.Memory;
-using System;
using System.Runtime.InteropServices;
namespace ARMeilleure.Translation.Cache
diff --git a/src/ARMeilleure/Translation/DelegateInfo.cs b/src/ARMeilleure/Translation/DelegateInfo.cs
index 64ee7bc9c..c27dbd6b4 100644
--- a/src/ARMeilleure/Translation/DelegateInfo.cs
+++ b/src/ARMeilleure/Translation/DelegateInfo.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace ARMeilleure.Translation
{
class DelegateInfo
diff --git a/src/ARMeilleure/Translation/DispatcherFunction.cs b/src/ARMeilleure/Translation/DispatcherFunction.cs
index f8b9dc31e..db5e27344 100644
--- a/src/ARMeilleure/Translation/DispatcherFunction.cs
+++ b/src/ARMeilleure/Translation/DispatcherFunction.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace ARMeilleure.Translation
{
delegate void DispatcherFunction(nint nativeContext, ulong startAddress);
diff --git a/src/ARMeilleure/Translation/GuestFunction.cs b/src/ARMeilleure/Translation/GuestFunction.cs
index 5c7c733f9..b02d260df 100644
--- a/src/ARMeilleure/Translation/GuestFunction.cs
+++ b/src/ARMeilleure/Translation/GuestFunction.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace ARMeilleure.Translation
{
delegate ulong GuestFunction(nint nativeContextPtr);
diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs
index b53fdd4df..1301aaebe 100644
--- a/src/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/src/ARMeilleure/Translation/PTC/Ptc.cs
@@ -3,6 +3,8 @@ using ARMeilleure.CodeGen.Linking;
using ARMeilleure.CodeGen.Unwinding;
using ARMeilleure.Common;
using ARMeilleure.Memory;
+using ARMeilleure.State;
+using Humanizer;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
@@ -30,8 +32,8 @@ namespace ARMeilleure.Translation.PTC
{
private const string OuterHeaderMagicString = "PTCohd\0\0";
private const string InnerHeaderMagicString = "PTCihd\0\0";
-
- private const uint InternalVersion = 6998; //! To be incremented manually for each change to the ARMeilleure project.
+
+ private const uint InternalVersion = 7007; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0";
private const string BackupDir = "1";
@@ -184,6 +186,36 @@ namespace ARMeilleure.Translation.PTC
InitializeCarriers();
}
+ private bool ContainsBlacklistedFunctions()
+ {
+ List blacklist = Profiler.GetBlacklistedFunctions();
+ bool containsBlacklistedFunctions = false;
+ _infosStream.Seek(0L, SeekOrigin.Begin);
+ bool foundBadFunction = false;
+
+ for (int index = 0; index < GetEntriesCount(); index++)
+ {
+ InfoEntry infoEntry = DeserializeStructure(_infosStream);
+ foreach (ulong address in blacklist)
+ {
+ if (infoEntry.Address == address)
+ {
+ containsBlacklistedFunctions = true;
+ Logger.Warning?.Print(LogClass.Ptc, "PPTC cache invalidated: Found blacklisted functions in PPTC cache");
+ foundBadFunction = true;
+ break;
+ }
+ }
+
+ if (foundBadFunction)
+ {
+ break;
+ }
+ }
+
+ return containsBlacklistedFunctions;
+ }
+
private void PreLoad()
{
string fileNameActual = $"{CachePathActual}.cache";
@@ -532,7 +564,7 @@ namespace ARMeilleure.Translation.PTC
public void LoadTranslations(Translator translator)
{
- if (AreCarriersEmpty())
+ if (AreCarriersEmpty() || ContainsBlacklistedFunctions())
{
return;
}
@@ -835,10 +867,18 @@ namespace ARMeilleure.Translation.PTC
while (profiledFuncsToTranslate.TryDequeue(out (ulong address, PtcProfiler.FuncProfile funcProfile) item))
{
ulong address = item.address;
+ ExecutionMode executionMode = item.funcProfile.Mode;
+ bool highCq = item.funcProfile.HighCq;
Debug.Assert(Profiler.IsAddressInStaticCodeRange(address));
- TranslatedFunction func = translator.Translate(address, item.funcProfile.Mode, item.funcProfile.HighCq);
+ TranslatedFunction func = translator.Translate(address, executionMode, highCq);
+
+ if (func == null)
+ {
+ Profiler.UpdateEntry(address, executionMode, true, true);
+ continue;
+ }
bool isAddressUnique = translator.Functions.TryAdd(address, func.GuestSize, func);
@@ -884,8 +924,11 @@ namespace ARMeilleure.Translation.PTC
sw.Stop();
PtcStateChanged?.Invoke(PtcLoadingState.Loaded, _translateCount, _translateTotalCount);
-
- Logger.Info?.Print(LogClass.Ptc, $"{_translateCount} of {_translateTotalCount} functions translated | Thread count: {degreeOfParallelism} in {sw.Elapsed.TotalSeconds} s");
+
+ Logger.Info?.Print(LogClass.Ptc,
+ $"{_translateCount} of {_translateTotalCount} functions translated in {sw.Elapsed.TotalSeconds} seconds " +
+ $"| {"function".ToQuantity(_translateTotalCount - _translateCount)} blacklisted " +
+ $"| Thread count: {degreeOfParallelism}");
Thread preSaveThread = new(PreSave)
{
diff --git a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
index 21987f72d..de0b78dbe 100644
--- a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
+++ b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
@@ -24,11 +24,12 @@ namespace ARMeilleure.Translation.PTC
{
private const string OuterHeaderMagicString = "Pohd\0\0\0\0";
- private const uint InternalVersion = 5518; //! Not to be incremented manually for each change to the ARMeilleure project.
+ private const uint InternalVersion = 7007; //! Not to be incremented manually for each change to the ARMeilleure project.
- private static readonly uint[] _migrateInternalVersions =
+ private static readonly uint[] _migrateInternalVersions =
[
- 1866
+ 1866,
+ 5518,
];
private const int SaveInterval = 30; // Seconds.
@@ -77,20 +78,30 @@ namespace ARMeilleure.Translation.PTC
private void TimerElapsed(object _, ElapsedEventArgs __)
=> new Thread(PreSave) { Name = "Ptc.DiskWriter" }.Start();
- public void AddEntry(ulong address, ExecutionMode mode, bool highCq)
+ public void AddEntry(ulong address, ExecutionMode mode, bool highCq, bool blacklist = false)
{
if (IsAddressInStaticCodeRange(address))
{
Debug.Assert(!highCq);
- lock (_lock)
+ if (blacklist)
{
- ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false));
+ lock (_lock)
+ {
+ ProfiledFuncs[address] = new FuncProfile(mode, highCq: false, true);
+ }
+ }
+ else
+ {
+ lock (_lock)
+ {
+ ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false, false));
+ }
}
}
}
- public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq)
+ public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq, bool? blacklist = null)
{
if (IsAddressInStaticCodeRange(address))
{
@@ -100,7 +111,7 @@ namespace ARMeilleure.Translation.PTC
{
Debug.Assert(ProfiledFuncs.ContainsKey(address));
- ProfiledFuncs[address] = new FuncProfile(mode, highCq: true);
+ ProfiledFuncs[address] = new FuncProfile(mode, highCq: true, blacklist ?? ProfiledFuncs[address].Blacklist);
}
}
}
@@ -116,7 +127,7 @@ namespace ARMeilleure.Translation.PTC
foreach (KeyValuePair profiledFunc in ProfiledFuncs)
{
- if (!funcs.ContainsKey(profiledFunc.Key))
+ if (!funcs.ContainsKey(profiledFunc.Key) && !profiledFunc.Value.Blacklist)
{
profiledFuncsToTranslate.Enqueue((profiledFunc.Key, profiledFunc.Value));
}
@@ -131,6 +142,24 @@ namespace ARMeilleure.Translation.PTC
ProfiledFuncs.TrimExcess();
}
+ public List GetBlacklistedFunctions()
+ {
+ List funcs = new List();
+
+ foreach (var profiledFunc in ProfiledFuncs)
+ {
+ if (profiledFunc.Value.Blacklist)
+ {
+ if (!funcs.Contains(profiledFunc.Key))
+ {
+ funcs.Add(profiledFunc.Key);
+ }
+ }
+ }
+
+ return funcs;
+ }
+
public void PreLoad()
{
_lastHash = default;
@@ -221,13 +250,18 @@ namespace ARMeilleure.Translation.PTC
return false;
}
+ Func migrateEntryFunc = null;
+
switch (outerHeader.InfoFileVersion)
{
case InternalVersion:
ProfiledFuncs = Deserialize(stream);
break;
case 1866:
- ProfiledFuncs = Deserialize(stream, (address, profile) => (address + 0x500000UL, profile));
+ migrateEntryFunc = (address, profile) => (address + 0x500000UL, profile);
+ goto case 5518;
+ case 5518:
+ ProfiledFuncs = DeserializeAddBlacklist(stream, migrateEntryFunc);
break;
default:
Logger.Error?.Print(LogClass.Ptc, $"No migration path for {nameof(outerHeader.InfoFileVersion)} '{outerHeader.InfoFileVersion}'. Discarding cache.");
@@ -257,6 +291,16 @@ namespace ARMeilleure.Translation.PTC
return DeserializeDictionary(stream, DeserializeStructure);
}
+ private static Dictionary DeserializeAddBlacklist(Stream stream, Func migrateEntryFunc = null)
+ {
+ if (migrateEntryFunc != null)
+ {
+ return DeserializeAndUpdateDictionary(stream, (Stream stream) => { return new FuncProfile(DeserializeStructure(stream)); }, migrateEntryFunc);
+ }
+
+ return DeserializeDictionary(stream, (Stream stream) => { return new FuncProfile(DeserializeStructure(stream)); });
+ }
+
private static ReadOnlySpan GetReadOnlySpan(MemoryStream memoryStream)
{
return new(memoryStream.GetBuffer(), (int)memoryStream.Position, (int)memoryStream.Length - (int)memoryStream.Position);
@@ -388,13 +432,35 @@ namespace ARMeilleure.Translation.PTC
}
}
- [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)]
+ [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 6*/)]
public struct FuncProfile
{
public ExecutionMode Mode;
public bool HighCq;
+ public bool Blacklist;
- public FuncProfile(ExecutionMode mode, bool highCq)
+ public FuncProfile(ExecutionMode mode, bool highCq, bool blacklist)
+ {
+ Mode = mode;
+ HighCq = highCq;
+ Blacklist = blacklist;
+ }
+
+ public FuncProfile(FuncProfilePreBlacklist fp)
+ {
+ Mode = fp.Mode;
+ HighCq = fp.HighCq;
+ Blacklist = false;
+ }
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)]
+ public struct FuncProfilePreBlacklist
+ {
+ public ExecutionMode Mode;
+ public bool HighCq;
+
+ public FuncProfilePreBlacklist(ExecutionMode mode, bool highCq)
{
Mode = mode;
HighCq = highCq;
diff --git a/src/ARMeilleure/Translation/TranslatedFunction.cs b/src/ARMeilleure/Translation/TranslatedFunction.cs
index 3d7ae9ffe..181cc5578 100644
--- a/src/ARMeilleure/Translation/TranslatedFunction.cs
+++ b/src/ARMeilleure/Translation/TranslatedFunction.cs
@@ -1,5 +1,4 @@
using ARMeilleure.Common;
-using System;
namespace ARMeilleure.Translation
{
diff --git a/src/ARMeilleure/Translation/Translator.cs b/src/ARMeilleure/Translation/Translator.cs
index 0f18c8045..14c80f24b 100644
--- a/src/ARMeilleure/Translation/Translator.cs
+++ b/src/ARMeilleure/Translation/Translator.cs
@@ -5,7 +5,6 @@ using ARMeilleure.Diagnostics;
using ARMeilleure.Instructions;
using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Memory;
-using ARMeilleure.Signal;
using ARMeilleure.State;
using ARMeilleure.Translation.Cache;
using ARMeilleure.Translation.PTC;
@@ -249,6 +248,11 @@ namespace ARMeilleure.Translation
ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter counter);
+ if (cfg == null)
+ {
+ return null;
+ }
+
ulong funcSize = funcRange.End - funcRange.Start;
Logger.EndPass(PassName.Translation, cfg);
@@ -407,6 +411,11 @@ namespace ARMeilleure.Translation
if (opCode.Instruction.Emitter != null)
{
opCode.Instruction.Emitter(context);
+ if (opCode.Instruction.Name == InstName.Und && blkIndex == 0)
+ {
+ range = new Range(rangeStart, rangeEnd);
+ return null;
+ }
}
else
{
diff --git a/src/ARMeilleure/Translation/TranslatorStubs.cs b/src/ARMeilleure/Translation/TranslatorStubs.cs
index f719dba31..458a42434 100644
--- a/src/ARMeilleure/Translation/TranslatorStubs.cs
+++ b/src/ARMeilleure/Translation/TranslatorStubs.cs
@@ -4,7 +4,6 @@ using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.State;
using ARMeilleure.Translation.Cache;
using System;
-using System.Reflection;
using System.Runtime.InteropServices;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs
index 51cd43c55..9170b73c7 100644
--- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs
+++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs
@@ -4,7 +4,6 @@ using Ryujinx.Common.Logging;
using Ryujinx.Common.Memory;
using Ryujinx.Memory;
using System;
-using System.Buffers;
using System.Collections.Concurrent;
using System.Threading;
diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs
index 9decd79fc..6a12e8c0c 100644
--- a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs
+++ b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common.Memory;
-using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs
index efea52b35..7c782bd76 100644
--- a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs
+++ b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using static Ryujinx.Audio.Backends.SoundIo.Native.SoundIo;
diff --git a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs
index e9cc6a8e1..1540cd0e3 100644
--- a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs
+++ b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs
@@ -4,7 +4,6 @@ using Ryujinx.Audio.Common;
using Ryujinx.Common.Memory;
using Ryujinx.Memory;
using System;
-using System.Buffers;
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;
using System.Threading;
diff --git a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
index 6f31755a3..a06ab21a7 100644
--- a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
+++ b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
@@ -1,7 +1,6 @@
using Ryujinx.Common;
using Ryujinx.Common.Memory;
using System;
-using System.Buffers;
using System.Threading;
namespace Ryujinx.Audio.Backends.Common
diff --git a/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs b/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs
index d0133622a..50153af37 100644
--- a/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using CpuAddress = System.UInt64;
using DspAddress = System.UInt64;
diff --git a/src/Ryujinx.Common/Configuration/VSyncMode.cs b/src/Ryujinx.Common/Configuration/VSyncMode.cs
index ca93b5e1c..e0bf2591f 100644
--- a/src/Ryujinx.Common/Configuration/VSyncMode.cs
+++ b/src/Ryujinx.Common/Configuration/VSyncMode.cs
@@ -6,4 +6,16 @@ namespace Ryujinx.Common.Configuration
Unbounded,
Custom
}
+
+ public static class VSyncModeExtensions
+ {
+ public static VSyncMode Next(this VSyncMode vsync, bool customEnabled = false) =>
+ vsync switch
+ {
+ VSyncMode.Switch => customEnabled ? VSyncMode.Custom : VSyncMode.Unbounded,
+ VSyncMode.Unbounded => VSyncMode.Switch,
+ VSyncMode.Custom => VSyncMode.Unbounded,
+ _ => VSyncMode.Switch
+ };
+ }
}
diff --git a/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs
index 7ed5e869a..6e14a796e 100644
--- a/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs
+++ b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs
@@ -1,5 +1,4 @@
using Microsoft.Win32;
-using Ryujinx.Common;
using Ryujinx.Common.Logging;
using System;
using System.Diagnostics;
diff --git a/src/Ryujinx.Common/Helpers/ObjectiveC.cs b/src/Ryujinx.Common/Helpers/ObjectiveC.cs
index d8e02f54d..4c2481f6e 100644
--- a/src/Ryujinx.Common/Helpers/ObjectiveC.cs
+++ b/src/Ryujinx.Common/Helpers/ObjectiveC.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.Common/Helpers/RefEvent.cs b/src/Ryujinx.Common/Helpers/RefEvent.cs
new file mode 100644
index 000000000..f339dfb7c
--- /dev/null
+++ b/src/Ryujinx.Common/Helpers/RefEvent.cs
@@ -0,0 +1,58 @@
+using Gommon;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace Ryujinx.Common.Helper
+{
+ public class RefEvent
+ {
+ public delegate void Handler(ref T arg);
+
+ private readonly Lock _subLock = new();
+ private readonly List _subscriptions = [];
+
+ public bool HasSubscribers
+ {
+ get
+ {
+ lock (_subLock)
+ return _subscriptions.Count != 0;
+ }
+ }
+
+ public IReadOnlyList Subscriptions
+ {
+ get
+ {
+ lock (_subLock)
+ return _subscriptions;
+ }
+ }
+
+ public void Add(Handler subscriber)
+ {
+ Guard.Require(subscriber, nameof(subscriber));
+ lock (_subLock)
+ _subscriptions.Add(subscriber);
+ }
+
+ public void Remove(Handler subscriber)
+ {
+ Guard.Require(subscriber, nameof(subscriber));
+ lock (_subLock)
+ _subscriptions.Remove(subscriber);
+ }
+
+ public void Clear()
+ {
+ lock (_subLock)
+ _subscriptions.Clear();
+ }
+
+ public void Call(ref T arg)
+ {
+ foreach (Handler subscription in Subscriptions)
+ subscription(ref arg);
+ }
+ }
+}
diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs
index 72262c6a0..609dc572a 100644
--- a/src/Ryujinx.Common/TitleIDs.cs
+++ b/src/Ryujinx.Common/TitleIDs.cs
@@ -3,7 +3,6 @@ using Ryujinx.Common.Configuration;
using Ryujinx.Common.Helper;
using System;
using System.Linq;
-using System.Runtime.InteropServices;
namespace Ryujinx.Common
{
@@ -30,10 +29,11 @@ namespace Ryujinx.Common
public static readonly string[] GreatMetalTitles =
[
- "010076f0049a2000", // Bayonetta
+ "01009b500007c000", // ARMS
"0100a5c00d162000", // Cuphead
"010023800d64a000", // Deltarune
"01003a30012c0000", // LEGO City Undercover
+ "010048701995e000", // Luigi's Manion 2 HD
"010028600EBDA000", // Mario 3D World
"0100152000022000", // Mario Kart 8 Deluxe
"010075a016a3a000", // Persona 4 Arena Ultimax
@@ -48,10 +48,14 @@ namespace Ryujinx.Common
"01009bf0072d4000", // Captain Toad: Treasure Tracker
"01009510001ca000", // Fast RMX
"01005CA01580E000", // Persona 5 Royale
+ "010015100b514000", // Super Mario Bros. Wonder
"0100000000010000", // Super Mario Odyssey
- //Isaac claims it has a issue in level 2, but I am not able to replicate it on my M3. More testing would be appreciated:
- "010015100b514000", // Super Mario Bros. Wonder
+ // Further testing is appreciated, I did not test the entire game:
+ "01007300020fa000", // Astral Chain
+ "010076f0049a2000", // Bayonetta
+ "0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon
+ "0100f4300bf2c000", // New Pokemon Snap
];
public static string GetDiscordGameAsset(string titleId)
diff --git a/src/Ryujinx.Common/Utilities/Rainbow.cs b/src/Ryujinx.Common/Utilities/Rainbow.cs
index a3db94925..eb1c187c4 100644
--- a/src/Ryujinx.Common/Utilities/Rainbow.cs
+++ b/src/Ryujinx.Common/Utilities/Rainbow.cs
@@ -1,4 +1,5 @@
using Gommon;
+using Ryujinx.Common.Helper;
using System;
using System.Drawing;
using System.Threading;
@@ -55,7 +56,7 @@ namespace Ryujinx.Common.Utilities
{
_color = HsbToRgb((_color.GetHue() + Speed) / 360);
- _updatedHandler.Call(_color.ToArgb());
+ _updatedHandler.Call(ref _color);
}
}
@@ -67,13 +68,13 @@ namespace Ryujinx.Common.Utilities
_color = Color.Blue;
}
- public static event Action Updated
+ public static event RefEvent.Handler Updated
{
add => _updatedHandler.Add(value);
remove => _updatedHandler.Remove(value);
}
- private static readonly Event _updatedHandler = new();
+ private static readonly RefEvent _updatedHandler = new();
private static Color HsbToRgb(float hue, float saturation = 1, float brightness = 1)
{
diff --git a/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs b/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs
index 9d459d062..1949cabdf 100644
--- a/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs
+++ b/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs
@@ -1,6 +1,5 @@
using ARMeilleure.State;
using Ryujinx.Memory;
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
index 28c78074d..decb0e4e3 100644
--- a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
+++ b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
@@ -5,7 +5,6 @@ using Ryujinx.Memory.Tracking;
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.Cpu/AppleHv/HvVm.cs b/src/Ryujinx.Cpu/AppleHv/HvVm.cs
index dc115f515..6ad44621b 100644
--- a/src/Ryujinx.Cpu/AppleHv/HvVm.cs
+++ b/src/Ryujinx.Cpu/AppleHv/HvVm.cs
@@ -1,5 +1,4 @@
using Ryujinx.Memory;
-using System;
using System.Runtime.Versioning;
using System.Threading;
diff --git a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs
index 0793f382d..a29def8e8 100644
--- a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs
+++ b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs
@@ -2,7 +2,6 @@ using ARMeilleure.Common;
using ARMeilleure.Memory;
using ARMeilleure.Translation;
using Ryujinx.Cpu.Signal;
-using Ryujinx.Memory;
namespace Ryujinx.Cpu.Jit
{
diff --git a/src/Ryujinx.Cpu/Jit/MemoryManager.cs b/src/Ryujinx.Cpu/Jit/MemoryManager.cs
index 2635a2c7d..9e5d29cca 100644
--- a/src/Ryujinx.Cpu/Jit/MemoryManager.cs
+++ b/src/Ryujinx.Cpu/Jit/MemoryManager.cs
@@ -5,7 +5,6 @@ using Ryujinx.Memory.Tracking;
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading;
diff --git a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
index c2f7d3f4b..9ae4ca5a9 100644
--- a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
+++ b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
@@ -8,7 +8,6 @@ using Ryujinx.Memory.Tracking;
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.Linq;
using System.Runtime.CompilerServices;
namespace Ryujinx.Cpu.Jit
diff --git a/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs b/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs
index 89e1499c0..68dff624c 100644
--- a/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs
+++ b/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs
@@ -3,7 +3,6 @@ using ARMeilleure.Memory;
using Ryujinx.Cpu.LightningJit.Arm32;
using Ryujinx.Cpu.LightningJit.Arm64;
using Ryujinx.Cpu.LightningJit.State;
-using System;
using System.Runtime.InteropServices;
namespace Ryujinx.Cpu.LightningJit
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs
index 0d56f28c9..3121d4f95 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs
@@ -2,7 +2,6 @@ using ARMeilleure.Common;
using ARMeilleure.Memory;
using Ryujinx.Cpu.LightningJit.CodeGen;
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
-using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Numerics;
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs
index f5f306099..c1b51750f 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs
@@ -1,5 +1,4 @@
using Ryujinx.Cpu.LightningJit.CodeGen;
-using System;
using System.Diagnostics;
namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs
index 5c1eefacf..2be82ff2a 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs
@@ -1,5 +1,3 @@
-using Ryujinx.Cpu.LightningJit.CodeGen;
-
namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
{
static class InstEmitVfpMove
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs
index 69689a391..a61f35280 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs
@@ -1,5 +1,3 @@
-using System.Diagnostics;
-
namespace Ryujinx.Cpu.LightningJit.Arm64
{
static class SysUtils
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs
index 2900cbda4..1e087591c 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs
@@ -3,7 +3,6 @@ using ARMeilleure.Memory;
using Ryujinx.Cpu.LightningJit.CodeGen;
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
using Ryujinx.Cpu.LightningJit.Graph;
-using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Numerics;
diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs b/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs
index e851327d4..ae71aa1d3 100644
--- a/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs
@@ -1,5 +1,4 @@
using ARMeilleure.Memory;
-using System;
using System.Runtime.InteropServices;
namespace Ryujinx.Cpu.LightningJit.Cache
diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs b/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs
index ed02a9c28..e0de1e7e0 100644
--- a/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
index 1432c4598..491132408 100644
--- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
+++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
diff --git a/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs b/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs
index 375c09d26..f5bbc65d3 100644
--- a/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs
+++ b/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
namespace Ryujinx.Cpu.LightningJit
diff --git a/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs b/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs
index df0f52b8c..70cdd0bfe 100644
--- a/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs
+++ b/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Cpu.LightningJit
{
class TranslatedFunction
diff --git a/src/Ryujinx.Cpu/LightningJit/Translator.cs b/src/Ryujinx.Cpu/LightningJit/Translator.cs
index cb3957490..5f3fe8783 100644
--- a/src/Ryujinx.Cpu/LightningJit/Translator.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Translator.cs
@@ -5,7 +5,6 @@ using Ryujinx.Cpu.LightningJit.Cache;
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
using Ryujinx.Cpu.LightningJit.State;
using Ryujinx.Cpu.Signal;
-using Ryujinx.Memory;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
diff --git a/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs b/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs
index 7ac15b816..8afaeef0f 100644
--- a/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs
+++ b/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
namespace Ryujinx.Cpu.Signal
diff --git a/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs b/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs
index 2a8d1d9b7..5c2b6a2e3 100644
--- a/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs
+++ b/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs
@@ -1,6 +1,4 @@
-using Ryujinx.Common.Logging;
using System;
-using System.Threading;
namespace Ryujinx.Graphics.Device
{
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs
index c2276480b..5d420a140 100644
--- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs
+++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs
@@ -1,6 +1,5 @@
using Ryujinx.Common;
using Ryujinx.Graphics.GAL;
-using System;
using System.Collections.Generic;
namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs
index d1a1cc35c..9383d3a3f 100644
--- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs
+++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs
@@ -1,4 +1,3 @@
-using Ryujinx.Graphics.Device;
using System;
using System.Collections.Generic;
using System.Diagnostics;
diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs
index 17ed57d96..fc3b64c03 100644
--- a/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs
+++ b/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs
@@ -4,7 +4,6 @@ using Ryujinx.Graphics.Gpu.Memory;
using Ryujinx.Graphics.Shader;
using System;
using System.Collections.Generic;
-using System.Linq;
using System.Runtime.InteropServices;
namespace Ryujinx.Graphics.Gpu.Image
diff --git a/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs b/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
index 0bd715d89..6efb7f334 100644
--- a/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
+++ b/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common.Memory;
-using Ryujinx.Graphics.Gpu.Image;
using Ryujinx.Memory;
using Ryujinx.Memory.Range;
using System;
diff --git a/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs b/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
index d9dd7f1d9..8a78b99e0 100644
--- a/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
+++ b/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
@@ -7,7 +7,6 @@ using Ryujinx.Memory;
using Ryujinx.Memory.Range;
using Ryujinx.Memory.Tracking;
using System;
-using System.Buffers;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
diff --git a/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs b/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
index beaad0579..b6ece6f83 100644
--- a/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
+++ b/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
@@ -1,6 +1,5 @@
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
-using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs b/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs
index ef314501d..4683a5d0c 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs
@@ -2,7 +2,6 @@ using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Gpu.Engine;
using Ryujinx.Graphics.Gpu.Image;
using Ryujinx.Graphics.Shader;
-using System;
using System.Linq;
namespace Ryujinx.Graphics.Gpu.Shader
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index e7e0ba154..476ae3d82 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -1,4 +1,3 @@
-using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
diff --git a/src/Ryujinx.Graphics.Metal/EnumConversion.cs b/src/Ryujinx.Graphics.Metal/EnumConversion.cs
index e498546e8..7cfb5cbd4 100644
--- a/src/Ryujinx.Graphics.Metal/EnumConversion.cs
+++ b/src/Ryujinx.Graphics.Metal/EnumConversion.cs
@@ -1,7 +1,6 @@
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
using SharpMetal.Metal;
-using System;
using System.Runtime.Versioning;
namespace Ryujinx.Graphics.Metal
diff --git a/src/Ryujinx.Graphics.Metal/HardwareInfo.cs b/src/Ryujinx.Graphics.Metal/HardwareInfo.cs
index 413fabf09..f6a132f09 100644
--- a/src/Ryujinx.Graphics.Metal/HardwareInfo.cs
+++ b/src/Ryujinx.Graphics.Metal/HardwareInfo.cs
@@ -76,7 +76,7 @@ namespace Ryujinx.Graphics.Metal
return model;
}
- return "";
+ return string.Empty;
}
}
}
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs
index b5ef710b1..098622b2a 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{
struct AVCodec
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs
index d745e9f04..256ccd0a8 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{
struct AVCodec501
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs
index 1de0a13e4..96c1a0f67 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common.Memory;
-using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs
index 97c30c718..46b1e06a7 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common.Memory;
-using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs
index 95926298c..09bcc9c31 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{
struct FFCodec where T : struct
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs
index 873d2518a..ee0db4730 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{
struct FFCodecLegacy where T : struct
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs
index c13cfe1aa..023b470f2 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs
@@ -1,6 +1,5 @@
using Ryujinx.Graphics.Nvdec.FFmpeg.Native;
using Ryujinx.Graphics.Video;
-using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg
{
diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs
index cfccb3bee..5c82b4a32 100644
--- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs
+++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs
@@ -1,4 +1,4 @@
-using Ryujinx.Common.Memory;
+using Ryujinx.Common.Memory;
using Ryujinx.Graphics.Nvdec.Vp9.Common;
using Ryujinx.Graphics.Video;
using System;
diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs b/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs
index 927f4cbfe..c95463e37 100644
--- a/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs
@@ -2,7 +2,6 @@ using OpenTK.Graphics.OpenGL;
using Ryujinx.Common;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.OpenGL.Image;
-using System;
using static Ryujinx.Graphics.OpenGL.Effects.ShaderHelper;
namespace Ryujinx.Graphics.OpenGL.Effects
diff --git a/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs b/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs
index b722bbf04..d7ca560a1 100644
--- a/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs b/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs
index 7072bbd9f..54516c81e 100644
--- a/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs b/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs
index 525418d74..5443465ea 100644
--- a/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs
+++ b/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs
@@ -1,4 +1,3 @@
-using Ryujinx.Graphics.OpenGL.Helper;
using System;
namespace Ryujinx.Graphics.OpenGL
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Declarations.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Declarations.cs
index c779f5e8d..a9464834a 100644
--- a/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Declarations.cs
+++ b/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Declarations.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common;
-using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
using Ryujinx.Graphics.Shader.StructuredIr;
using Ryujinx.Graphics.Shader.Translation;
@@ -218,7 +217,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
foreach (MemoryDefinition memory in memories)
{
- string arraySize = "";
+ string arraySize = string.Empty;
if ((memory.Type & AggregateType.Array) != 0)
{
arraySize = $"[{memory.ArrayLength}]";
@@ -240,7 +239,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
BufferDefinition buffer = buffers[i];
bool needsPadding = buffer.Layout == BufferLayout.Std140;
- string fsiSuffix = !constant && fsi ? " [[raster_order_group(0)]]" : "";
+ string fsiSuffix = !constant && fsi ? " [[raster_order_group(0)]]" : string.Empty;
bufferDec[i] = $"{addressSpace} {Defaults.StructPrefix}_{buffer.Name}* {buffer.Name}{fsiSuffix};";
@@ -257,7 +256,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
type &= ~AggregateType.Array;
string typeName = GetVarTypeName(type);
- string arraySuffix = "";
+ string arraySuffix = string.Empty;
if (field.Type.HasFlag(AggregateType.Array))
{
@@ -353,7 +352,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
imageTypeName = $"array<{imageTypeName}, {image.ArrayLength}>";
}
- string fsiSuffix = fsi ? " [[raster_order_group(0)]]" : "";
+ string fsiSuffix = fsi ? " [[raster_order_group(0)]]" : string.Empty;
imageDec[i] = $"{imageTypeName} {image.Name}{fsiSuffix};";
}
@@ -454,7 +453,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
IoVariable.VertexIndex => "[[vertex_id]]",
// IoVariable.PointCoord => "[[point_coord]]",
IoVariable.UserDefined => context.Definitions.Stage == ShaderStage.Fragment ? $"[[user(loc{ioDefinition.Location})]]" : $"[[attribute({ioDefinition.Location})]]",
- _ => ""
+ _ => string.Empty
};
context.AppendLine($"{type} {name} {iq}{suffix};");
@@ -545,7 +544,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
IoVariable.FragmentOutputColor => $"[[color({ioDefinition.Location})]]",
IoVariable.FragmentOutputDepth => "[[depth(any)]]",
IoVariable.ClipDistance => $"[[clip_distance]][{Defaults.TotalClipDistances}]",
- _ => ""
+ _ => string.Empty
};
context.AppendLine($"{type} {name} {suffix};");
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Instructions/InstGenMemory.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Instructions/InstGenMemory.cs
index b3a995c6a..a84a75e4f 100644
--- a/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Instructions/InstGenMemory.cs
+++ b/src/Ryujinx.Graphics.Shader/CodeGen/Msl/Instructions/InstGenMemory.cs
@@ -27,7 +27,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
inputsCount--;
}
- string fieldName = "";
+ string fieldName = string.Empty;
switch (storageKind)
{
case StorageKind.ConstantBuffer:
@@ -140,7 +140,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
}
}
varName += fieldName;
- varName += fieldHasPadding ? ".x" : "";
+ varName += fieldHasPadding ? ".x" : string.Empty;
if (isStore)
{
@@ -434,7 +434,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
string prefix = intCoords ? "uint" : "float";
- return prefix + (count > 1 ? count : "") + "(" + coords + ")";
+ return prefix + (count > 1 ? count : string.Empty) + "(" + coords + ")";
}
Append(AssemblePVector(pCount));
@@ -504,7 +504,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
}
texCallBuilder.Append(')');
- texCallBuilder.Append(colorIsVector ? GetMaskMultiDest(texOp.Index) : "");
+ texCallBuilder.Append(colorIsVector ? GetMaskMultiDest(texOp.Index) : string.Empty);
return texCallBuilder.ToString();
}
@@ -558,7 +558,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
{
if (mask == 0x0)
{
- return "";
+ return string.Empty;
}
string swizzle = ".";
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Msl/MslGenerator.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Msl/MslGenerator.cs
index bc38ea26b..8ca24fcd3 100644
--- a/src/Ryujinx.Graphics.Shader/CodeGen/Msl/MslGenerator.cs
+++ b/src/Ryujinx.Graphics.Shader/CodeGen/Msl/MslGenerator.cs
@@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
if (parameters.Definitions.Stage is not (ShaderStage.Vertex or ShaderStage.Fragment or ShaderStage.Compute))
{
Logger.Warning?.Print(LogClass.Gpu, $"Attempted to generate unsupported shader type {parameters.Definitions.Stage}!");
- return "";
+ return string.Empty;
}
CodeGenContext context = new(info, parameters);
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs
index 5abbf1fa8..4fe214778 100644
--- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs
+++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs
@@ -4,7 +4,6 @@ using Ryujinx.Graphics.Shader.Translation;
using Spv.Generator;
using System;
using System.Collections.Generic;
-using static Spv.Specification;
using Instruction = Spv.Generator.Instruction;
namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
diff --git a/src/Ryujinx.Graphics.Shader/SamplerType.cs b/src/Ryujinx.Graphics.Shader/SamplerType.cs
index 20352d13e..f81d512fa 100644
--- a/src/Ryujinx.Graphics.Shader/SamplerType.cs
+++ b/src/Ryujinx.Graphics.Shader/SamplerType.cs
@@ -199,7 +199,7 @@ namespace Ryujinx.Graphics.Shader
_ => "float"
};
- return $"{typeName}<{format}{(image ? ", access::read_write" : "")}>";
+ return $"{typeName}<{format}{(image ? ", access::read_write" : string.Empty)}>";
}
}
}
diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs
index 5d46ab498..3f2e4991f 100644
--- a/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs
+++ b/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs
@@ -1,5 +1,4 @@
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
-using Ryujinx.Graphics.Shader.Translation;
using System.Collections.Generic;
using System.Linq;
diff --git a/src/Ryujinx.Graphics.Video/Plane.cs b/src/Ryujinx.Graphics.Video/Plane.cs
index 4e4e65b32..338de1644 100644
--- a/src/Ryujinx.Graphics.Video/Plane.cs
+++ b/src/Ryujinx.Graphics.Video/Plane.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Graphics.Video
{
public readonly record struct Plane(nint Pointer, int Length);
diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
index 5e3bf39db..406f33304 100644
--- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
+++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
@@ -3,7 +3,6 @@ using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
using Silk.NET.Vulkan;
using System;
-using System.Buffers;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
index ba8b3e499..191811593 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
@@ -11,7 +11,6 @@ using System.Runtime.InteropServices;
using BlendOp = Silk.NET.Vulkan.BlendOp;
using Buffer = Silk.NET.Vulkan.Buffer;
using CompareOp = Ryujinx.Graphics.GAL.CompareOp;
-using Format = Ryujinx.Graphics.GAL.Format;
using FrontFace = Ryujinx.Graphics.GAL.FrontFace;
using IndexType = Ryujinx.Graphics.GAL.IndexType;
using PolygonMode = Ryujinx.Graphics.GAL.PolygonMode;
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs b/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs
index dfbf19013..b9074dfdb 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs
@@ -1,5 +1,4 @@
using Silk.NET.Vulkan;
-using VkFormat = Silk.NET.Vulkan.Format;
namespace Ryujinx.Graphics.Vulkan
{
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs
index 1cf569290..612a8b25d 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs
@@ -1,7 +1,5 @@
-using Ryujinx.Common.Memory;
using Ryujinx.Graphics.GAL;
using Silk.NET.Vulkan;
-using System;
using System.Collections.ObjectModel;
namespace Ryujinx.Graphics.Vulkan
diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
index 8dd94a42d..24b0e7787 100644
--- a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
@@ -2,7 +2,6 @@ using Ryujinx.Graphics.GAL;
using Silk.NET.Vulkan;
using System;
using System.Collections.Generic;
-using System.Linq;
using System.Threading;
namespace Ryujinx.Graphics.Vulkan.Queries
diff --git a/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs b/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs
index 073eee2ca..8a2cd2102 100644
--- a/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs
+++ b/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs
@@ -2,8 +2,6 @@ using Ryujinx.Common.Memory;
using Ryujinx.Graphics.GAL;
using Silk.NET.Vulkan;
using System;
-using System.Collections.Generic;
-using Format = Ryujinx.Graphics.GAL.Format;
using VkFormat = Silk.NET.Vulkan.Format;
namespace Ryujinx.Graphics.Vulkan
diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanException.cs b/src/Ryujinx.Graphics.Vulkan/VulkanException.cs
index e203a3a21..5d67ab838 100644
--- a/src/Ryujinx.Graphics.Vulkan/VulkanException.cs
+++ b/src/Ryujinx.Graphics.Vulkan/VulkanException.cs
@@ -1,6 +1,5 @@
using Silk.NET.Vulkan;
using System;
-using System.Runtime.Serialization;
namespace Ryujinx.Graphics.Vulkan
{
diff --git a/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs b/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs
index 17aab8105..23068bf72 100644
--- a/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs
+++ b/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs
@@ -7,7 +7,6 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
-using System.Runtime.Serialization;
using System.Text;
namespace Ryujinx.HLE.Exceptions
diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HLEConfiguration.cs
index 8ac76508f..0b7ae3974 100644
--- a/src/Ryujinx.HLE/HLEConfiguration.cs
+++ b/src/Ryujinx.HLE/HLEConfiguration.cs
@@ -192,6 +192,7 @@ namespace Ryujinx.HLE
///
/// The desired hacky workarounds.
///
+ /// This cannot be changed after instantiation.
public EnabledDirtyHack[] Hacks { internal get; set; }
public HLEConfiguration(VirtualFileSystem virtualFileSystem,
diff --git a/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs b/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs
index 5895c67bb..5bda957bc 100644
--- a/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs
@@ -4,8 +4,6 @@ using Ryujinx.HLE.HOS.Applets.Cabinet;
using Ryujinx.HLE.HOS.Applets.Dummy;
using Ryujinx.HLE.HOS.Applets.Error;
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
-using System;
-using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Applets
{
diff --git a/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs
index 6b16aee7b..a581e1864 100644
--- a/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs
@@ -1,10 +1,8 @@
-using Ryujinx.Common.Logging;
using Ryujinx.Common.Memory;
-using Ryujinx.HLE.HOS.Applets;
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
using System;
using System.IO;
-using System.Runtime.InteropServices;
+
namespace Ryujinx.HLE.HOS.Applets.Dummy
{
internal class DummyApplet : IApplet
diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs
index 4d4ef8996..11f527285 100644
--- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs
@@ -5,7 +5,6 @@ using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
-using System.Runtime.InteropServices;
using System.Threading;
namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
diff --git a/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs b/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs
index 95b6167f3..08d929bf0 100644
--- a/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs
+++ b/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs
@@ -20,6 +20,7 @@ namespace Ryujinx.HLE.HOS
private readonly string _titleIdText;
private readonly string _displayVersion;
private readonly bool _diskCacheEnabled;
+ private readonly string _diskCacheSelector;
private readonly ulong _codeAddress;
private readonly ulong _codeSize;
@@ -31,6 +32,7 @@ namespace Ryujinx.HLE.HOS
string titleIdText,
string displayVersion,
bool diskCacheEnabled,
+ string diskCacheSelector,
ulong codeAddress,
ulong codeSize)
{
@@ -39,6 +41,7 @@ namespace Ryujinx.HLE.HOS
_titleIdText = titleIdText;
_displayVersion = displayVersion;
_diskCacheEnabled = diskCacheEnabled;
+ _diskCacheSelector = diskCacheSelector;
_codeAddress = codeAddress;
_codeSize = codeSize;
}
@@ -114,7 +117,7 @@ namespace Ryujinx.HLE.HOS
}
}
- DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, "default"); //Ready for exefs profiles
+ DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, _diskCacheSelector ?? "default");
return processContext;
}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs
index e036f366b..25c663e9a 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs
@@ -2,7 +2,6 @@ using Ryujinx.Common;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.Horizon.Common;
using System.Collections.Generic;
-using System.Threading;
namespace Ryujinx.HLE.HOS.Kernel.Common
{
diff --git a/src/Ryujinx.HLE/HOS/ModLoader.cs b/src/Ryujinx.HLE/HOS/ModLoader.cs
index ff691914c..c652024cf 100644
--- a/src/Ryujinx.HLE/HOS/ModLoader.cs
+++ b/src/Ryujinx.HLE/HOS/ModLoader.cs
@@ -6,6 +6,7 @@ using LibHac.Loader;
using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.RomFs;
+using LibHac.Util;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
@@ -19,6 +20,7 @@ using System.Collections.Specialized;
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Security.Cryptography;
using LazyFile = Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy.LazyFile;
using Path = System.IO.Path;
@@ -294,7 +296,7 @@ namespace Ryujinx.HLE.HOS
AddModsFromDirectory(mods, applicationDir, modMetadata);
}
- public static void QueryContentsDir(ModCache mods, DirectoryInfo contentsDir, ulong applicationId)
+ public static void QueryContentsDir(ModCache mods, DirectoryInfo contentsDir, ulong applicationId, ulong[] installedDlcs)
{
if (!contentsDir.Exists)
{
@@ -309,6 +311,16 @@ namespace Ryujinx.HLE.HOS
{
QueryApplicationDir(mods, applicationDir, applicationId);
}
+
+ foreach (ulong installedDlcId in installedDlcs)
+ {
+ DirectoryInfo dlcModDir = FindApplicationDir(contentsDir, $"{installedDlcId:x16}");
+
+ if (dlcModDir != null)
+ {
+ QueryApplicationDir(mods, dlcModDir, applicationId);
+ }
+ }
}
private static int QueryCheatsDir(ModCache mods, DirectoryInfo cheatsDir)
@@ -415,7 +427,7 @@ namespace Ryujinx.HLE.HOS
{
foreach ((ulong applicationId, ModCache cache) in modCaches)
{
- QueryContentsDir(cache, searchDir, applicationId);
+ QueryContentsDir(cache, searchDir, applicationId, Array.Empty());
}
return true;
@@ -581,6 +593,7 @@ namespace Ryujinx.HLE.HOS
public BitVector32 Stubs;
public BitVector32 Replaces;
public MetaLoader Npdm;
+ public string Hash;
public bool Modified => (Stubs.Data | Replaces.Data) != 0;
}
@@ -591,8 +604,11 @@ namespace Ryujinx.HLE.HOS
{
Stubs = new BitVector32(),
Replaces = new BitVector32(),
+ Hash = null,
};
+ string tempHash = string.Empty;
+
if (!_appMods.TryGetValue(applicationId, out ModCache mods) || mods.ExefsDirs.Count == 0)
{
return modLoadResult;
@@ -628,8 +644,16 @@ namespace Ryujinx.HLE.HOS
modLoadResult.Replaces[1 << i] = true;
- nsos[i] = new NsoExecutable(nsoFile.OpenRead().AsStorage(), nsoName);
- Logger.Info?.Print(LogClass.ModLoader, $"NSO '{nsoName}' replaced");
+ using (FileStream stream = nsoFile.OpenRead())
+ {
+ nsos[i] = new NsoExecutable(stream.AsStorage(), nsoName);
+ Logger.Info?.Print(LogClass.ModLoader, $"NSO '{nsoName}' replaced");
+ using (MD5 md5 = MD5.Create())
+ {
+ stream.Seek(0, SeekOrigin.Begin);
+ tempHash += BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
+ }
+ }
}
modLoadResult.Stubs[1 << i] |= File.Exists(Path.Combine(mod.Path.FullName, nsoName + StubExtension));
@@ -661,6 +685,14 @@ namespace Ryujinx.HLE.HOS
}
}
+ if (!string.IsNullOrEmpty(tempHash))
+ {
+ using (MD5 md5 = MD5.Create())
+ {
+ modLoadResult.Hash += BitConverter.ToString(md5.ComputeHash(tempHash.ToBytes())).Replace("-", string.Empty).ToLowerInvariant();
+ }
+ }
+
return modLoadResult;
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs
index 517359e70..712967180 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs
@@ -121,7 +121,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu
private void UpdatePassphraseIfNeeded()
{
- string passphrase = _config.MultiplayerLdnPassphrase ?? "";
+ string passphrase = _config.MultiplayerLdnPassphrase ?? string.Empty;
if (passphrase != _passphrase)
{
_passphrase = passphrase;
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs
index d2121c047..4a217b88b 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs
@@ -113,7 +113,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
public async Task NatPunch()
{
NatDiscoverer discoverer = new();
- CancellationTokenSource cts = new(1000);
+ CancellationTokenSource cts = new(5000);
NatDevice device;
diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs
index 3930b3312..d3df58215 100644
--- a/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common.Memory;
-using Ryujinx.Common.Utilities;
using System;
using System.Runtime.InteropServices;
diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs
index 36a89070d..7e3e4c0a2 100644
--- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs
@@ -7,7 +7,6 @@ using Ryujinx.HLE.HOS.Services.Mii.Types;
using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption;
using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
using System;
-using System.Collections.Generic;
using System.IO;
using System.Linq;
diff --git a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs
index 271b8fc84..6d03d8d05 100644
--- a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs
@@ -2,7 +2,6 @@ using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.HOS.Kernel.Ipc;
-using Ryujinx.HLE.HOS.Services.Apm;
using Ryujinx.Horizon.Common;
using System;
using System.Collections.Generic;
diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs
index 2ffa961cb..e23e6fa3f 100644
--- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs
+++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs
@@ -3,7 +3,6 @@ using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.Horizon.Common;
using System;
-using System.Buffers;
namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
{
diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
index 5874636e7..dec52e2e3 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
@@ -4,7 +4,6 @@ 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;
@@ -84,13 +83,6 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
// Apply Nsos patches.
device.Configuration.VirtualFileSystem.ModLoader.ApplyNsoPatches(programId, nsoExecutables);
- // Don't use PTC if ExeFS files have been replaced.
- bool enablePtc = device.System.EnablePtc && !modLoadResult.Modified;
- if (!enablePtc)
- {
- Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled.");
- }
-
string programName = string.Empty;
if (!isHomebrew && programId > 0x010000000000FFFF)
@@ -117,7 +109,8 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
device.System.KernelContext,
metaLoader,
nacpData,
- enablePtc,
+ device.System.EnablePtc,
+ modLoadResult.Hash,
true,
programName,
metaLoader.GetProgramId(),
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
index 726b017b6..4c0866531 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
@@ -235,6 +235,7 @@ namespace Ryujinx.HLE.Loaders.Processes
dummyExeFs.GetNpdm(),
nacpData,
diskCacheEnabled: false,
+ diskCacheSelector: null,
allowCodeMemoryForJit: true,
programName,
programId,
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
index b11057da2..cedd11ae9 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
@@ -21,7 +21,6 @@ using Ryujinx.HLE.Loaders.Processes.Extensions;
using Ryujinx.Horizon.Common;
using Ryujinx.Horizon.Sdk.Arp;
using System;
-using System.Linq;
using System.Runtime.InteropServices;
using ApplicationId = LibHac.Ncm.ApplicationId;
@@ -186,6 +185,7 @@ namespace Ryujinx.HLE.Loaders.Processes
string.Empty,
string.Empty,
false,
+ null,
codeAddress,
codeSize);
@@ -226,6 +226,7 @@ namespace Ryujinx.HLE.Loaders.Processes
MetaLoader metaLoader,
BlitStruct applicationControlProperties,
bool diskCacheEnabled,
+ string diskCacheSelector,
bool allowCodeMemoryForJit,
string name,
ulong programId,
@@ -379,6 +380,7 @@ namespace Ryujinx.HLE.Loaders.Processes
$"{programId:x16}",
displayVersion,
diskCacheEnabled,
+ diskCacheSelector,
codeStart,
codeSize);
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
index 3a7042670..6fd9408ed 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
@@ -88,7 +88,7 @@ namespace Ryujinx.HLE.Loaders.Processes
bool isFirmwareApplication = ProgramId <= 0x0100000000007FFF;
string name = !isFirmware
- ? (isFirmwareApplication ? "Firmware Application " : "") + (!string.IsNullOrWhiteSpace(Name) ? Name : "")
+ ? (isFirmwareApplication ? "Firmware Application " : string.Empty) + (!string.IsNullOrWhiteSpace(Name) ? Name : "")
: "Firmware";
// TODO: LibHac npdm currently doesn't support version field.
diff --git a/src/Ryujinx.Horizon.Common/IExternalEvent.cs b/src/Ryujinx.Horizon.Common/IExternalEvent.cs
index dedf4c72a..2cb96bf31 100644
--- a/src/Ryujinx.Horizon.Common/IExternalEvent.cs
+++ b/src/Ryujinx.Horizon.Common/IExternalEvent.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Ryujinx.Horizon.Common
{
public interface IExternalEvent
diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs
index 168d58619..84c88d13b 100644
--- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs
+++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs
@@ -1,7 +1,6 @@
using Ryujinx.Audio;
using Ryujinx.Audio.Integration;
using Ryujinx.Audio.Renderer.Server;
-using Ryujinx.Common.Memory;
using Ryujinx.Horizon.Common;
using Ryujinx.Horizon.Sdk.Sf;
using Ryujinx.Horizon.Sdk.Sf.Hipc;
diff --git a/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs b/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs
index acec66e82..d74e50a61 100644
--- a/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs
+++ b/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs
@@ -2,7 +2,6 @@ using Ryujinx.Common;
using Ryujinx.Horizon.Common;
using Ryujinx.Horizon.Sdk.Sf;
using Ryujinx.Horizon.Sdk.Sf.Hipc;
-using System;
namespace Ryujinx.Horizon.Sdk.Codec.Detail
{
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs
index d5f8a0313..a7ede259f 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct BlockedUserImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs
index 21e99c754..1051343d6 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct FriendCandidateImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs
index 416ba3655..06134f245 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct FriendInvitationForViewerImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs
index ba5671692..108b56008 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct FriendRequestImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs
index 66d61e4c1..7b7460481 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct NintendoNetworkIdFriendImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs
index 9f90f0c8f..37f4d7c2d 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct PlayHistoryImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs
index f779d93cf..422f814ce 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct ProfileImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs
index dc6adf03a..f3d0cdce3 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends.Detail
{
struct SnsAccountFriendImpl
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs b/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs
index 7be19d574..46e734ed2 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Friends
{
struct FriendInvitationId
diff --git a/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs b/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs
index 12c19168d..7640967c6 100644
--- a/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs
+++ b/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs
@@ -1,8 +1,5 @@
using Ryujinx.Common.Memory;
-using Ryujinx.Horizon.Sdk.Arp.Detail;
using System;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
using System.Text;
namespace Ryujinx.Horizon.Sdk.Ns
diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs
index 422f756e4..0cd147771 100644
--- a/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs
+++ b/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Threading;
namespace Ryujinx.Horizon.Sdk.OsTypes
diff --git a/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs b/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs
index daf2ba3b8..33234ed76 100644
--- a/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs
+++ b/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs
@@ -1,5 +1,3 @@
-using System.Runtime.InteropServices;
-
namespace Ryujinx.Horizon.Sdk.Settings.Factory
{
struct CountryCode
diff --git a/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs b/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs
index 1c502919b..120d7b51a 100644
--- a/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs
+++ b/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs
@@ -1,4 +1,3 @@
-using Ryujinx.Horizon.Sdk.Sf.Hipc;
using Ryujinx.Horizon.Sdk.Usb;
namespace Ryujinx.Horizon.Usb.Ipc
diff --git a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
index a473d7042..3b243eed0 100644
--- a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
+++ b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
@@ -2,8 +2,6 @@ using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
-using Ryujinx.HLE.HOS.Services.Hid;
-using SDL2;
using System;
using System.Collections.Generic;
using System.Numerics;
@@ -12,7 +10,7 @@ using static SDL2.SDL;
namespace Ryujinx.Input.SDL2
{
- class SDL2Gamepad : IGamepad
+ public class SDL2Gamepad : IGamepad
{
private bool HasConfiguration => _configuration != null;
@@ -113,7 +111,7 @@ namespace Ryujinx.Input.SDL2
byte blue = packedRgb > 0 ? (byte)(packedRgb % 256) : (byte)0;
if (SDL_GameControllerSetLED(_gamepadHandle, red, green, blue) != 0)
- Logger.Error?.Print(LogClass.Hid, "LED is not supported on this game controller.");
+ Logger.Error?.Print(LogClass.Hid, "LED setting failed; probably in the middle of disconnecting.");
}
private GamepadFeaturesFlag GetFeaturesFlag()
diff --git a/src/Ryujinx.Memory/AddressSpaceManager.cs b/src/Ryujinx.Memory/AddressSpaceManager.cs
index 150e538fe..f9d514b55 100644
--- a/src/Ryujinx.Memory/AddressSpaceManager.cs
+++ b/src/Ryujinx.Memory/AddressSpaceManager.cs
@@ -1,7 +1,6 @@
using Ryujinx.Memory.Range;
using System;
using System.Collections.Generic;
-using System.Linq;
using System.Runtime.CompilerServices;
namespace Ryujinx.Memory
diff --git a/src/Ryujinx.Memory/Tracking/RegionFlags.cs b/src/Ryujinx.Memory/Tracking/RegionFlags.cs
index ceb8e56a6..1eefdfbc0 100644
--- a/src/Ryujinx.Memory/Tracking/RegionFlags.cs
+++ b/src/Ryujinx.Memory/Tracking/RegionFlags.cs
@@ -1,8 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace Ryujinx.Memory.Tracking
{
diff --git a/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs b/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs
index 0d002dada..d146e55a4 100644
--- a/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs
+++ b/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs
@@ -1,4 +1,3 @@
-using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
diff --git a/src/Ryujinx.SDL2.Common/SDL2Driver.cs b/src/Ryujinx.SDL2.Common/SDL2Driver.cs
index 047ccbebf..851c07867 100644
--- a/src/Ryujinx.SDL2.Common/SDL2Driver.cs
+++ b/src/Ryujinx.SDL2.Common/SDL2Driver.cs
@@ -1,6 +1,5 @@
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
-using Ryujinx.Common.Utilities;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
diff --git a/src/Ryujinx.Tests/Cpu/CpuTest.cs b/src/Ryujinx.Tests/Cpu/CpuTest.cs
index da0f03e6b..6f749463e 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTest.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTest.cs
@@ -1,6 +1,5 @@
using ARMeilleure;
using ARMeilleure.State;
-using ARMeilleure.Translation;
using NUnit.Framework;
using Ryujinx.Cpu.Jit;
using Ryujinx.Memory;
diff --git a/src/Ryujinx.Tests/Cpu/CpuTest32.cs b/src/Ryujinx.Tests/Cpu/CpuTest32.cs
index 81ed9bcc9..d4c8156d7 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTest32.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTest32.cs
@@ -1,6 +1,5 @@
using ARMeilleure;
using ARMeilleure.State;
-using ARMeilleure.Translation;
using NUnit.Framework;
using Ryujinx.Cpu.Jit;
using Ryujinx.Memory;
diff --git a/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs b/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs
index b7ad8efe7..3d8847dc4 100644
--- a/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs
+++ b/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs
@@ -1,5 +1,4 @@
using NUnit.Framework;
-using System;
namespace Ryujinx.Tests.Cpu
{
diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs
index b85b17b89..d12795963 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/AppHost.cs
@@ -319,31 +319,12 @@ namespace Ryujinx.Ava
public void VSyncModeToggle()
{
VSyncMode oldVSyncMode = Device.VSyncMode;
- VSyncMode newVSyncMode = VSyncMode.Switch;
bool customVSyncIntervalEnabled = ConfigurationState.Instance.Graphics.EnableCustomVSyncInterval.Value;
- switch (oldVSyncMode)
- {
- case VSyncMode.Switch:
- newVSyncMode = VSyncMode.Unbounded;
- break;
- case VSyncMode.Unbounded:
- if (customVSyncIntervalEnabled)
- {
- newVSyncMode = VSyncMode.Custom;
- }
- else
- {
- newVSyncMode = VSyncMode.Switch;
- }
-
- break;
- case VSyncMode.Custom:
- newVSyncMode = VSyncMode.Switch;
- break;
- }
-
- UpdateVSyncMode(this, new ReactiveEventArgs(oldVSyncMode, newVSyncMode));
+ UpdateVSyncMode(this, new ReactiveEventArgs(
+ oldVSyncMode,
+ oldVSyncMode.Next(customVSyncIntervalEnabled))
+ );
}
private void UpdateCustomVSyncIntervalValue(object sender, ReactiveEventArgs e)
diff --git a/src/Ryujinx/Assets/Styles/CheckboxMenuItemStyle.axaml b/src/Ryujinx/Assets/Styles/CheckboxMenuItemStyle.axaml
deleted file mode 100644
index 13176c84f..000000000
--- a/src/Ryujinx/Assets/Styles/CheckboxMenuItemStyle.axaml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml
index 3d0c91840..5523f551a 100644
--- a/src/Ryujinx/Assets/Styles/Styles.xaml
+++ b/src/Ryujinx/Assets/Styles/Styles.xaml
@@ -218,6 +218,15 @@
+
+