mirror of
https://git.743378673.xyz/MeloNX/MeloNX.git
synced 2025-07-24 23:47:10 +02:00
Add SvcSetThreadActivity, tweak SignalProcessWideKey, add fmul32i shader instructions and other small fixes
This commit is contained in:
parent
33ae6e544b
commit
03002f6537
9 changed files with 139 additions and 24 deletions
|
@ -57,7 +57,7 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
|
||||
Count = Process.Memory.ReadInt32(CondVarAddress);
|
||||
|
||||
if (Count > 0)
|
||||
if (Result && Count > 0)
|
||||
{
|
||||
Process.Memory.WriteInt32(CondVarAddress, Count - 1);
|
||||
}
|
||||
|
@ -73,10 +73,10 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
{
|
||||
if (Count < 0)
|
||||
{
|
||||
Process.Memory.WriteInt32(CondVarAddress, WaitingThreads.Count);
|
||||
|
||||
foreach ((_, AutoResetEvent WaitEvent) in WaitingThreads)
|
||||
{
|
||||
IncrementCondVarValue();
|
||||
|
||||
WaitEvent.Set();
|
||||
}
|
||||
|
||||
|
@ -84,8 +84,6 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
}
|
||||
else
|
||||
{
|
||||
Process.Memory.WriteInt32(CondVarAddress, Count);
|
||||
|
||||
while (WaitingThreads.Count > 0 && Count-- > 0)
|
||||
{
|
||||
int HighestPriority = WaitingThreads[0].Thread.Priority;
|
||||
|
@ -101,6 +99,8 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
}
|
||||
}
|
||||
|
||||
IncrementCondVarValue();
|
||||
|
||||
WaitingThreads[HighestPrioIndex].WaitEvent.Set();
|
||||
|
||||
WaitingThreads.RemoveAt(HighestPrioIndex);
|
||||
|
@ -111,6 +111,17 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
Process.Scheduler.Yield(Thread);
|
||||
}
|
||||
|
||||
private void IncrementCondVarValue()
|
||||
{
|
||||
AcquireCondVarValue();
|
||||
|
||||
int Count = Process.Memory.ReadInt32(CondVarAddress);
|
||||
|
||||
Process.Memory.WriteInt32(CondVarAddress, Count + 1);
|
||||
|
||||
ReleaseCondVarValue();
|
||||
}
|
||||
|
||||
private void AcquireCondVarValue()
|
||||
{
|
||||
if (!OwnsCondVarValue)
|
||||
|
|
|
@ -63,7 +63,8 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
{ 0x25, SvcGetThreadId },
|
||||
{ 0x26, SvcBreak },
|
||||
{ 0x27, SvcOutputDebugString },
|
||||
{ 0x29, SvcGetInfo }
|
||||
{ 0x29, SvcGetInfo },
|
||||
{ 0x32, SvcSetThreadActivity }
|
||||
};
|
||||
|
||||
this.Ns = Ns;
|
||||
|
|
|
@ -147,7 +147,28 @@ namespace Ryujinx.Core.OsHle.Kernel
|
|||
}
|
||||
else
|
||||
{
|
||||
Logging.Warn(LogClass.KernelSvc, $"Tried to GetThreadId on invalid thread handle 0x{Handle:x8}!");
|
||||
Logging.Warn(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
|
||||
|
||||
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
|
||||
}
|
||||
}
|
||||
|
||||
private void SvcSetThreadActivity(AThreadState ThreadState)
|
||||
{
|
||||
int Handle = (int)ThreadState.X0;
|
||||
bool Active = (int)ThreadState.X1 != 0;
|
||||
|
||||
KThread CurrThread = Process.HandleTable.GetData<KThread>(Handle);
|
||||
|
||||
if (CurrThread != null)
|
||||
{
|
||||
Process.Scheduler.SetThreadActivity(CurrThread, Active);
|
||||
|
||||
ThreadState.X0 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Warn(LogClass.KernelSvc, $"Invalid thread handle 0x{Handle:x8}!");
|
||||
|
||||
ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue