Thread scheduler rewrite (#393)
* Started to rewrite the thread scheduler * Add a single core-like scheduling mode, enabled by default * Clear exclusive monitor on context switch * Add SetThreadActivity, misc fixes * Implement WaitForAddress and SignalToAddress svcs, misc fixes * Misc fixes (on SetActivity and Arbiter), other tweaks * Rebased * Add missing null check * Rename multicore key on config, fix UpdatePriorityInheritance * Make scheduling data MLQs private * nit: Ordering
This commit is contained in:
parent
33e2810ef3
commit
b8133c1997
57 changed files with 3262 additions and 1540 deletions
|
@ -41,7 +41,9 @@ namespace Ryujinx.HLE.HOS.Services.Vi
|
|||
|
||||
public long GetRelayService(ServiceCtx Context)
|
||||
{
|
||||
MakeObject(Context, new IHOSBinderDriver(Context.Device.Gpu.Renderer));
|
||||
MakeObject(Context, new IHOSBinderDriver(
|
||||
Context.Device.System,
|
||||
Context.Device.Gpu.Renderer));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -62,7 +64,9 @@ namespace Ryujinx.HLE.HOS.Services.Vi
|
|||
|
||||
public long GetIndirectDisplayTransactionService(ServiceCtx Context)
|
||||
{
|
||||
MakeObject(Context, new IHOSBinderDriver(Context.Device.Gpu.Renderer));
|
||||
MakeObject(Context, new IHOSBinderDriver(
|
||||
Context.Device.System,
|
||||
Context.Device.Gpu.Renderer));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi
|
|||
|
||||
private NvFlinger Flinger;
|
||||
|
||||
public IHOSBinderDriver(IGalRenderer Renderer)
|
||||
public IHOSBinderDriver(Horizon System, IGalRenderer Renderer)
|
||||
{
|
||||
m_Commands = new Dictionary<int, ServiceProcessRequest>()
|
||||
{
|
||||
|
@ -27,9 +27,9 @@ namespace Ryujinx.HLE.HOS.Services.Vi
|
|||
{ 3, TransactParcelAuto }
|
||||
};
|
||||
|
||||
BinderEvent = new KEvent();
|
||||
BinderEvent = new KEvent(System);
|
||||
|
||||
BinderEvent.WaitEvent.Set();
|
||||
BinderEvent.Signal();
|
||||
|
||||
Flinger = new NvFlinger(Renderer, BinderEvent);
|
||||
}
|
||||
|
@ -93,8 +93,6 @@ namespace Ryujinx.HLE.HOS.Services.Vi
|
|||
{
|
||||
if (Disposing)
|
||||
{
|
||||
BinderEvent.Dispose();
|
||||
|
||||
Flinger.Dispose();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Services.Android
|
|||
|
||||
private BufferEntry[] BufferQueue;
|
||||
|
||||
private ManualResetEvent WaitBufferFree;
|
||||
private AutoResetEvent WaitBufferFree;
|
||||
|
||||
private bool Disposed;
|
||||
|
||||
|
@ -88,7 +88,7 @@ namespace Ryujinx.HLE.HOS.Services.Android
|
|||
|
||||
BufferQueue = new BufferEntry[0x40];
|
||||
|
||||
WaitBufferFree = new ManualResetEvent(false);
|
||||
WaitBufferFree = new AutoResetEvent(false);
|
||||
}
|
||||
|
||||
public long ProcessParcelRequest(ServiceCtx Context, byte[] ParcelData, int Code)
|
||||
|
@ -220,6 +220,8 @@ namespace Ryujinx.HLE.HOS.Services.Android
|
|||
|
||||
BufferQueue[Slot].State = BufferState.Free;
|
||||
|
||||
WaitBufferFree.Set();
|
||||
|
||||
return MakeReplyParcel(Context, 0);
|
||||
}
|
||||
|
||||
|
@ -336,12 +338,9 @@ namespace Ryujinx.HLE.HOS.Services.Android
|
|||
{
|
||||
BufferQueue[Slot].State = BufferState.Free;
|
||||
|
||||
BinderEvent.WaitEvent.Set();
|
||||
BinderEvent.Signal();
|
||||
|
||||
lock (WaitBufferFree)
|
||||
{
|
||||
WaitBufferFree.Set();
|
||||
}
|
||||
WaitBufferFree.Set();
|
||||
}
|
||||
|
||||
private int GetFreeSlotBlocking(int Width, int Height)
|
||||
|
@ -350,19 +349,14 @@ namespace Ryujinx.HLE.HOS.Services.Android
|
|||
|
||||
do
|
||||
{
|
||||
lock (WaitBufferFree)
|
||||
if ((Slot = GetFreeSlot(Width, Height)) != -1)
|
||||
{
|
||||
if ((Slot = GetFreeSlot(Width, Height)) != -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (Disposed)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
WaitBufferFree.Reset();
|
||||
if (Disposed)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
WaitBufferFree.WaitOne();
|
||||
|
@ -409,11 +403,7 @@ namespace Ryujinx.HLE.HOS.Services.Android
|
|||
{
|
||||
Disposed = true;
|
||||
|
||||
lock (WaitBufferFree)
|
||||
{
|
||||
WaitBufferFree.Set();
|
||||
}
|
||||
|
||||
WaitBufferFree.Set();
|
||||
WaitBufferFree.Dispose();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue