mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-07-22 15:27:10 +02:00
misc: Dirty Hacks
Enable this settings screen via a boolean in Config.json First one is the xb2 menu softlock fix
This commit is contained in:
parent
09107b67ff
commit
8b3a945b5f
21 changed files with 222 additions and 22 deletions
|
@ -188,6 +188,11 @@ namespace Ryujinx.HLE
|
|||
/// An action called when HLE force a refresh of output after docked mode changed.
|
||||
/// </summary>
|
||||
public Action RefreshInputConfig { internal get; set; }
|
||||
|
||||
/**
|
||||
* The desired hacky workarounds.
|
||||
*/
|
||||
public DirtyHacks Hacks { internal get; set; }
|
||||
|
||||
public HLEConfiguration(VirtualFileSystem virtualFileSystem,
|
||||
LibHacHorizonManager libHacHorizonManager,
|
||||
|
@ -218,7 +223,8 @@ namespace Ryujinx.HLE
|
|||
bool multiplayerDisableP2p,
|
||||
string multiplayerLdnPassphrase,
|
||||
string multiplayerLdnServer,
|
||||
int customVSyncInterval)
|
||||
int customVSyncInterval,
|
||||
DirtyHacks dirtyHacks = DirtyHacks.None)
|
||||
{
|
||||
VirtualFileSystem = virtualFileSystem;
|
||||
LibHacHorizonManager = libHacHorizonManager;
|
||||
|
@ -250,6 +256,7 @@ namespace Ryujinx.HLE
|
|||
MultiplayerDisableP2p = multiplayerDisableP2p;
|
||||
MultiplayerLdnPassphrase = multiplayerLdnPassphrase;
|
||||
MultiplayerLdnServer = multiplayerLdnServer;
|
||||
Hacks = dirtyHacks;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
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
|
||||
{
|
||||
|
@ -13,6 +16,8 @@ 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)
|
||||
|
@ -33,6 +38,13 @@ 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.HasFlag(DirtyHacks.Xc2MenuSoftlockFix) && TitleIDs.CurrentApplication == 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;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ 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.HLE.Loaders.Executables;
|
||||
|
@ -102,7 +103,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||
}
|
||||
|
||||
// Initialize GPU.
|
||||
Graphics.Gpu.GraphicsConfig.TitleId = programId.ToString("X16");
|
||||
TitleIDs.CurrentApplication = programId.ToString("X16");
|
||||
device.Gpu.HostInitalized.Set();
|
||||
|
||||
if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible))
|
||||
|
|
|
@ -6,6 +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.HLE.Loaders.Executables;
|
||||
using Ryujinx.HLE.Loaders.Processes.Extensions;
|
||||
|
@ -204,7 +205,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||
}
|
||||
|
||||
// Explicitly null TitleId to disable the shader cache.
|
||||
Graphics.Gpu.GraphicsConfig.TitleId = null;
|
||||
TitleIDs.CurrentApplication = default;
|
||||
_device.Gpu.HostInitalized.Set();
|
||||
|
||||
ProcessResult processResult = ProcessLoaderHelper.LoadNsos(_device,
|
||||
|
|
|
@ -37,6 +37,8 @@ namespace Ryujinx.HLE
|
|||
|
||||
public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable;
|
||||
|
||||
public DirtyHacks DirtyHacks { get; }
|
||||
|
||||
public Switch(HLEConfiguration configuration)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(configuration.GpuRenderer);
|
||||
|
@ -72,6 +74,7 @@ namespace Ryujinx.HLE
|
|||
System.EnablePtc = Configuration.EnablePtc;
|
||||
System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel;
|
||||
System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode;
|
||||
DirtyHacks = Configuration.Hacks;
|
||||
UpdateVSyncInterval();
|
||||
#pragma warning restore IDE0055
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue