mirror of
https://github.com/GreemDev/Ryujinx.git
synced 2025-08-30 07:25:05 +00:00
The Sparse Jit Function Table sizes now depend on the LowPowerPTC setting. This means lower power devices won't be impacted as hard by the higher ram speed requirement of GiantBlock. Also added functionality to the PPTC Initializer so it now supports different PPTC Profiles simultaneously, which makes switching between TinyBlock/LowPower and GiantBlock/HighPower seamless. This also opens the door for the potential of PPTC cache with exefs mods enabled in the future. Default (aka HighPower) currently has an Avalonia bug that causes a crash when starting a game, it can be bypassed be clicking the window multiple times durring loading until the window unfreezes.
69 lines
2.2 KiB
C#
69 lines
2.2 KiB
C#
using ARMeilleure.Common;
|
|
using ARMeilleure.Memory;
|
|
using ARMeilleure.Translation;
|
|
using Ryujinx.Cpu.Signal;
|
|
using Ryujinx.Memory;
|
|
|
|
namespace Ryujinx.Cpu.Jit
|
|
{
|
|
class JitCpuContext : ICpuContext
|
|
{
|
|
private readonly ITickSource _tickSource;
|
|
private readonly Translator _translator;
|
|
private readonly AddressTable<ulong> _functionTable;
|
|
|
|
public JitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit, bool lowPower)
|
|
{
|
|
_tickSource = tickSource;
|
|
_functionTable = AddressTable<ulong>.CreateForArm(for64Bit, memory.Type, lowPower);
|
|
_translator = new Translator(new JitMemoryAllocator(forJit: true), memory, _functionTable);
|
|
|
|
if (memory.Type.IsHostMappedOrTracked())
|
|
{
|
|
NativeSignalHandler.InitializeSignalHandler();
|
|
}
|
|
|
|
memory.UnmapEvent += UnmapHandler;
|
|
}
|
|
|
|
private void UnmapHandler(ulong address, ulong size)
|
|
{
|
|
_translator.InvalidateJitCacheRegion(address, size);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks)
|
|
{
|
|
return new JitExecutionContext(new JitMemoryAllocator(), _tickSource, exceptionCallbacks);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public void Execute(IExecutionContext context, ulong address)
|
|
{
|
|
_translator.Execute(((JitExecutionContext)context).Impl, address);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public void InvalidateCacheRegion(ulong address, ulong size)
|
|
{
|
|
_translator.InvalidateJitCacheRegion(address, size);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector)
|
|
{
|
|
return new JitDiskCacheLoadState(_translator.LoadDiskCache(titleIdText, displayVersion, enabled, cacheSelector));
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public void PrepareCodeRange(ulong address, ulong size)
|
|
{
|
|
_functionTable.SignalCodeRange(address, size);
|
|
_translator.PrepareCodeRange(address, size);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
}
|
|
}
|