Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
GreemDev committed Jan 10, 2025
2 parents cca429d + 918ec1b commit 33f42ad
Show file tree
Hide file tree
Showing 10 changed files with 35 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/Ryujinx.HLE/HOS/Horizon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ private void StartNewServices()
ProcessCreationInfo creationInfo = new("Service", 1, 0, 0x8000000, 1, Flags, 0, 0);

uint[] defaultCapabilities = {
0x030363F7,
(((uint)KScheduler.CpuCoresCount - 1) << 24) + (((uint)KScheduler.CpuCoresCount - 1) << 16) + 0x63F7u,
0x1FFFFFCF,
0x207FFFEF,
0x47E0060F,
Expand Down
1 change: 1 addition & 0 deletions src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public KernelContext(
TickSource = tickSource;
Device = device;
Memory = memory;
KScheduler.CpuCoresCount = device.CpuCoresCount;

Running = true;

Expand Down
2 changes: 1 addition & 1 deletion src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public static Result StartInitialProcess(
return result;
}

process.DefaultCpuCore = 3;
process.DefaultCpuCore = KScheduler.CpuCoresCount - 1;

context.Processes.TryAdd(process.Pid, process);

Expand Down
2 changes: 1 addition & 1 deletion src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ void CleanUpForError()
return result;
}

result = Capabilities.InitializeForUser(capabilities, MemoryManager);
result = Capabilities.InitializeForUser(capabilities, MemoryManager, IsApplication);

if (result != Result.Success)
{
Expand Down
17 changes: 11 additions & 6 deletions src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ public Result InitializeForKernel(ReadOnlySpan<uint> capabilities, KPageTableBas
DebuggingFlags &= ~3u;
KernelReleaseVersion = KProcess.KernelVersionPacked;

return Parse(capabilities, memoryManager);
return Parse(capabilities, memoryManager, false);
}

public Result InitializeForUser(ReadOnlySpan<uint> capabilities, KPageTableBase memoryManager)
public Result InitializeForUser(ReadOnlySpan<uint> capabilities, KPageTableBase memoryManager, bool isApplication)
{
return Parse(capabilities, memoryManager);
return Parse(capabilities, memoryManager, isApplication);
}

private Result Parse(ReadOnlySpan<uint> capabilities, KPageTableBase memoryManager)
private Result Parse(ReadOnlySpan<uint> capabilities, KPageTableBase memoryManager, bool isApplication)
{
int mask0 = 0;
int mask1 = 0;
Expand All @@ -54,7 +54,7 @@ private Result Parse(ReadOnlySpan<uint> capabilities, KPageTableBase memoryManag

if (cap.GetCapabilityType() != CapabilityType.MapRange)
{
Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager);
Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager, isApplication);

if (result != Result.Success)
{
Expand Down Expand Up @@ -120,7 +120,7 @@ private Result Parse(ReadOnlySpan<uint> capabilities, KPageTableBase memoryManag
return Result.Success;
}

private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTableBase memoryManager)
private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTableBase memoryManager, bool isApplication)
{
CapabilityType code = cap.GetCapabilityType();

Expand Down Expand Up @@ -176,6 +176,11 @@ private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTabl
AllowedCpuCoresMask = GetMaskFromMinMax(lowestCpuCore, highestCpuCore);
AllowedThreadPriosMask = GetMaskFromMinMax(lowestThreadPrio, highestThreadPrio);

if (isApplication && lowestCpuCore == 0 && highestCpuCore != 2)
Ryujinx.Common.Logging.Logger.Error?.Print(Ryujinx.Common.Logging.LogClass.Application, $"Application requested cores with index range {lowestCpuCore} to {highestCpuCore}! Report this to @LotP on the Ryujinx/Ryubing discord server (discord.gg/ryujinx)!");
else if (isApplication)
Ryujinx.Common.Logging.Logger.Info?.Print(Ryujinx.Common.Logging.LogClass.Application, $"Application requested cores with index range {lowestCpuCore} to {highestCpuCore}");

break;
}

Expand Down
2 changes: 1 addition & 1 deletion src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2683,7 +2683,7 @@ public Result SetThreadCoreMask(int handle, int preferredCore, ulong affinityMas
return KernelResult.InvalidCombination;
}

if ((uint)preferredCore > 3)
if ((uint)preferredCore > KScheduler.CpuCoresCount - 1)
{
if ((preferredCore | 2) != -1)
{
Expand Down
18 changes: 13 additions & 5 deletions src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
partial class KScheduler : IDisposable
{
public const int PrioritiesCount = 64;
public const int CpuCoresCount = 4;
public static int CpuCoresCount;

private const int RoundRobinTimeQuantumMs = 10;

private static readonly int[] _preemptionPriorities = { 59, 59, 59, 63 };

private static readonly int[] _srcCoresHighestPrioThreads = new int[CpuCoresCount];
private static int[] _srcCoresHighestPrioThreads;

private readonly KernelContext _context;
private readonly int _coreId;
Expand Down Expand Up @@ -47,6 +45,16 @@ public KScheduler(KernelContext context, int coreId)
_coreId = coreId;

_currentThread = null;

if (_srcCoresHighestPrioThreads == null)
{
_srcCoresHighestPrioThreads = new int[CpuCoresCount];
}
}

private static int PreemptionPriorities(int index)
{
return index == CpuCoresCount - 1 ? 63 : 59;
}

public static ulong SelectThreads(KernelContext context)
Expand Down Expand Up @@ -437,7 +445,7 @@ public static void PreemptionThreadLoop(KernelContext context)

for (int core = 0; core < CpuCoresCount; core++)
{
RotateScheduledQueue(context, core, _preemptionPriorities[core]);
RotateScheduledQueue(context, core, PreemptionPriorities(core));
}

context.CriticalSection.Leave();
Expand Down
6 changes: 3 additions & 3 deletions src/Ryujinx.HLE/HOS/Services/ServerBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ class ServerBase : IDisposable
// not large enough.
private const int PointerBufferSize = 0x8000;

private readonly static uint[] _defaultCapabilities = {
0x030363F7,
private static uint[] _defaultCapabilities => [
(((uint)KScheduler.CpuCoresCount - 1) << 24) + (((uint)KScheduler.CpuCoresCount - 1) << 16) + 0x63F7u,
0x1FFFFFCF,
0x207FFFEF,
0x47E0060F,
0x0048BFFF,
0x01007FFF,
};
];

// The amount of time Dispose() will wait to Join() the thread executing the ServerLoop()
private static readonly TimeSpan _threadJoinTimeout = TimeSpan.FromSeconds(3);
Expand Down
2 changes: 2 additions & 0 deletions src/Ryujinx.HLE/Switch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class Switch : IDisposable
public TamperMachine TamperMachine { get; }
public IHostUIHandler UIHandler { get; }

public int CpuCoresCount = 4; //Switch 1 has 4 cores

public VSyncMode VSyncMode { get; set; } = VSyncMode.Switch;
public bool CustomVSyncIntervalEnabled { get; set; } = false;
public int CustomVSyncInterval { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion src/Ryujinx/Headless/HeadlessRyujinx.Init.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using DiscordRPC;
using DiscordRPC;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.SDL2;
using Ryujinx.Ava;
Expand Down

0 comments on commit 33f42ad

Please sign in to comment.