aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Vi
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-09-18 20:36:43 -0300
committerGitHub <noreply@github.com>2018-09-18 20:36:43 -0300
commitb8133c19971c7a2026af803003fafedbdb70488e (patch)
tree84f4630e897ccd3f77b86051241a22a6cf45193d /Ryujinx.HLE/HOS/Services/Vi
parent33e2810ef36fe0cf613aecd4c609f425aed02539 (diff)
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
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Vi')
-rw-r--r--Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs36
3 files changed, 22 insertions, 30 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs b/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs
index 3006b73a..54238279 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs
@@ -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;
}
diff --git a/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs b/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs
index 19e0d949..d47fc30a 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/IHOSBinderDriver.cs
@@ -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();
}
}
diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
index a8493758..dcdf5d17 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
@@ -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;
- }
-
- if (Disposed)
- {
- break;
- }
+ 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();
}
}