aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-03-04 20:32:18 -0300
committergdkchan <gab.dark.100@gmail.com>2018-03-04 20:32:18 -0300
commit344fc8a55de471121d3f600cca9e95315d0e502f (patch)
tree60f13e524c071d4c7592022674868aa7b216b9bd
parent3edb66f389ac279bdcde26c5682aa39b9bf5f853 (diff)
Try fixing NvFlinger rotation with scaling, return correct error code on WaitSignal timeout, always display window at the center of the screen
-rw-r--r--ChocolArm64/ATranslator.cs1
-rw-r--r--Ryujinx.Core/OsHle/CondVar.cs8
-rw-r--r--Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs12
-rw-r--r--Ryujinx.Core/OsHle/Services/Vi/NvFlinger.cs38
-rw-r--r--Ryujinx.Core/OsHle/Svc/SvcThreadSync.cs7
-rw-r--r--Ryujinx/Ui/GLScreen.cs4
6 files changed, 46 insertions, 24 deletions
diff --git a/ChocolArm64/ATranslator.cs b/ChocolArm64/ATranslator.cs
index ab434e22..1f4a922a 100644
--- a/ChocolArm64/ATranslator.cs
+++ b/ChocolArm64/ATranslator.cs
@@ -7,7 +7,6 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Reflection.Emit;
-using System.Threading;
namespace ChocolArm64
{
diff --git a/Ryujinx.Core/OsHle/CondVar.cs b/Ryujinx.Core/OsHle/CondVar.cs
index 7b3e1852..ac3ba574 100644
--- a/Ryujinx.Core/OsHle/CondVar.cs
+++ b/Ryujinx.Core/OsHle/CondVar.cs
@@ -24,7 +24,7 @@ namespace Ryujinx.Core.OsHle
WaitingThreads = new List<HThread>();
}
- public void WaitForSignal(HThread Thread)
+ public bool WaitForSignal(HThread Thread)
{
int Count = Process.Memory.ReadInt32(CondVarAddress);
@@ -41,12 +41,14 @@ namespace Ryujinx.Core.OsHle
}
else
{
- Process.Scheduler.WaitForSignal(Thread, (int)(Timeout / 1000000));
+ bool Result = Process.Scheduler.WaitForSignal(Thread, (int)(Timeout / 1000000));
lock (WaitingThreads)
{
WaitingThreads.Remove(Thread);
}
+
+ return Result;
}
}
@@ -60,6 +62,8 @@ namespace Ryujinx.Core.OsHle
}
ReleaseCondVarValue();
+
+ return true;
}
public void SetSignal(HThread Thread, int Count)
diff --git a/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs b/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs
index 2045f8a1..b1116078 100644
--- a/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs
+++ b/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs
@@ -183,7 +183,7 @@ namespace Ryujinx.Core.OsHle.Handles
TryResumingExecution(SchedThread);
}
- public void WaitForSignal(HThread Thread, int Timeout = -1)
+ public bool WaitForSignal(HThread Thread, int Timeout = -1)
{
SchedulerThread SchedThread;
@@ -206,22 +206,26 @@ namespace Ryujinx.Core.OsHle.Handles
{
Logging.Error($"{GetDbgThreadInfo(Thread)} was not found on the scheduler queue!");
- return;
+ return false;
}
}
+ bool Result;
+
if (Timeout >= 0)
{
Logging.Debug($"{GetDbgThreadInfo(Thread)} has wait timeout of {Timeout}ms.");
- SchedThread.WaitEvent.WaitOne(Timeout);
+ Result = SchedThread.WaitEvent.WaitOne(Timeout);
}
else
{
- SchedThread.WaitEvent.WaitOne();
+ Result = SchedThread.WaitEvent.WaitOne();
}
TryResumingExecution(SchedThread);
+
+ return Result;
}
private void TryResumingExecution(SchedulerThread SchedThread)
diff --git a/Ryujinx.Core/OsHle/Services/Vi/NvFlinger.cs b/Ryujinx.Core/OsHle/Services/Vi/NvFlinger.cs
index b745867e..4b5f9819 100644
--- a/Ryujinx.Core/OsHle/Services/Vi/NvFlinger.cs
+++ b/Ryujinx.Core/OsHle/Services/Vi/NvFlinger.cs
@@ -278,38 +278,44 @@ namespace Ryujinx.Core.OsHle.IpcServices.Android
int RealWidth = FbWidth;
int RealHeight = FbHeight;
+ float XSign = BufferQueue[Slot].Transform.HasFlag(HalTransform.FlipX) ? -1 : 1;
+ float YSign = BufferQueue[Slot].Transform.HasFlag(HalTransform.FlipY) ? -1 : 1;
+
float ScaleX = 1;
float ScaleY = 1;
+
float OffsX = 0;
float OffsY = 0;
if (Crop.Right != 0 &&
Crop.Bottom != 0)
{
+ //Who knows if this is right, I was never good with math...
RealWidth = Crop.Right - Crop.Left;
RealHeight = Crop.Bottom - Crop.Top;
- ScaleX = (float)FbWidth / RealWidth;
- ScaleY = (float)FbHeight / RealHeight;
+ if (BufferQueue[Slot].Transform.HasFlag(HalTransform.Rotate90))
+ {
+ ScaleY = (float)FbHeight / RealHeight;
+ ScaleX = (float)FbWidth / RealWidth;
- OffsX = -(float)Crop.Left / Crop.Right;
- OffsY = -(float)Crop.Top / Crop.Bottom;
+ OffsY = ((-(float)Crop.Left / Crop.Right) + ScaleX - 1) * -XSign;
+ OffsX = ((-(float)Crop.Top / Crop.Bottom) + ScaleY - 1) * -YSign;
+ }
+ else
+ {
+ ScaleX = (float)FbWidth / RealWidth;
+ ScaleY = (float)FbHeight / RealHeight;
- OffsX += ScaleX - 1;
- OffsY += ScaleY - 1;
+ OffsX = ((-(float)Crop.Left / Crop.Right) + ScaleX - 1) * XSign;
+ OffsY = ((-(float)Crop.Top / Crop.Bottom) + ScaleY - 1) * -YSign;
+ }
}
- float Rotate = 0;
-
- if (BufferQueue[Slot].Transform.HasFlag(HalTransform.FlipX))
- {
- ScaleX = -ScaleX;
- }
+ ScaleX *= XSign;
+ ScaleY *= YSign;
- if (BufferQueue[Slot].Transform.HasFlag(HalTransform.FlipY))
- {
- ScaleY = -ScaleY;
- }
+ float Rotate = 0;
if (BufferQueue[Slot].Transform.HasFlag(HalTransform.Rotate90))
{
diff --git a/Ryujinx.Core/OsHle/Svc/SvcThreadSync.cs b/Ryujinx.Core/OsHle/Svc/SvcThreadSync.cs
index dec13f75..2705272a 100644
--- a/Ryujinx.Core/OsHle/Svc/SvcThreadSync.cs
+++ b/Ryujinx.Core/OsHle/Svc/SvcThreadSync.cs
@@ -53,7 +53,12 @@ namespace Ryujinx.Core.OsHle.Svc
Cv = Ns.Os.CondVars.GetOrAdd(CondVarAddress, Cv);
- Cv.WaitForSignal(Thread);
+ if (!Cv.WaitForSignal(Thread))
+ {
+ ThreadState.X0 = (int)SvcResult.ErrTimeout;
+
+ return;
+ }
M.WaitForLock(Thread, ThreadHandle);
diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs
index 1e48b280..4c7cee46 100644
--- a/Ryujinx/Ui/GLScreen.cs
+++ b/Ryujinx/Ui/GLScreen.cs
@@ -29,6 +29,10 @@ namespace Ryujinx
{
this.Ns = Ns;
this.Renderer = Renderer;
+
+ Location = new Point(
+ (DisplayDevice.Default.Width / 2) - (Width / 2),
+ (DisplayDevice.Default.Height / 2) - (Height / 2));
}
protected override void OnLoad(EventArgs e)