aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Nv
diff options
context:
space:
mode:
authorThog <me@thog.eu>2020-04-22 06:10:27 +0200
committerGitHub <noreply@github.com>2020-04-22 14:10:27 +1000
commit36749c358d85dd0bc7f1e4a36a0b607fc0f724d5 (patch)
tree0c24eb54082b80e8f15aa8138a3e85c5c4e89675 /Ryujinx.HLE/HOS/Services/Nv
parent03711dd7b5d44e20fb45c728803ea6b9599dec87 (diff)
SurfaceFlinger v2 (#981)
* Rewrite SurfaceFlinger Reimplement accurately SurfaceFlinger (based on my 8.1.0 reversing of it) TODO: support swap interval properly and reintroduce disabled "game vsync" support. * Some fixes for SetBufferCount * uncomment a test from last commit * SurfaceFlinger: don't free the graphic buffer in SetBufferCount * SurfaceFlinger: Implement swap interval correctly * SurfaceFlinger: Reintegrate Game VSync toggle * SurfaceFlinger: do not push a fence on buffer release on the consumer side * Revert "SurfaceFlinger: do not push a fence on buffer release on the consumer side" This reverts commit 586b52b0bfab2d11f361f4b59ab7b7141020bbad. * Make the game vsync toggle work dynamically again * Unregister producer's Binder object when closing layer * Address ripinperi's comments * Add a timeout on syncpoint wait operation Syncpoint aren't supposed to be waited on for more than a second. This effectively workaround issues caused by not having a channel scheduling in place yet. PS: Also introduce Android WaitForever warning about fence being not signaled for 3s * Fix a print of previous commit * Address Ac_K's comments * Address gdkchan's comments * Address final comments
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Nv')
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs7
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapDeviceFile.cs38
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/Types/NvFence.cs5
3 files changed, 43 insertions, 7 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
index f5c44e1f..ff56fbf5 100644
--- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
+++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
@@ -8,6 +8,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl
{
class NvHostSyncpt
{
+ public const int VBlank0SyncpointId = 26;
+ public const int VBlank1SyncpointId = 27;
+
private int[] _counterMin;
private int[] _counterMax;
private bool[] _clientManaged;
@@ -24,6 +27,10 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl
_counterMax = new int[SynchronizationManager.MaxHardwareSyncpoints];
_clientManaged = new bool[SynchronizationManager.MaxHardwareSyncpoints];
_assigned = new bool[SynchronizationManager.MaxHardwareSyncpoints];
+
+ // Reserve VBLANK syncpoints
+ ReserveSyncpointLocked(VBlank0SyncpointId, true);
+ ReserveSyncpointLocked(VBlank1SyncpointId, true);
}
private void ReserveSyncpointLocked(uint id, bool isClientManaged)
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapDeviceFile.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapDeviceFile.cs
index d03ede94..bbc30779 100644
--- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapDeviceFile.cs
+++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapDeviceFile.cs
@@ -165,12 +165,8 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap
return NvInternalResult.InvalidInput;
}
- if (map.DecrementRefCount() <= 0)
+ if (DecrementMapRefCount(Owner, arguments.Handle))
{
- DeleteMapWithHandle(arguments.Handle);
-
- Logger.PrintInfo(LogClass.ServiceNv, $"Deleted map {arguments.Handle}!");
-
arguments.Address = map.Address;
arguments.Flags = 0;
}
@@ -248,9 +244,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap
return dict.Add(map);
}
- private bool DeleteMapWithHandle(int handle)
+ private static bool DeleteMapWithHandle(KProcess process, int handle)
{
- if (_maps.TryGetValue(Owner, out IdDictionary dict))
+ if (_maps.TryGetValue(process, out IdDictionary dict))
{
return dict.Delete(handle) != null;
}
@@ -258,6 +254,34 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap
return false;
}
+ public static void IncrementMapRefCount(KProcess process, int handle, bool allowHandleZero = false)
+ {
+ GetMapFromHandle(process, handle, allowHandleZero)?.IncrementRefCount();
+ }
+
+ public static bool DecrementMapRefCount(KProcess process, int handle)
+ {
+ NvMapHandle map = GetMapFromHandle(process, handle, false);
+
+ if (map == null)
+ {
+ return false;
+ }
+
+ if (map.DecrementRefCount() <= 0)
+ {
+ DeleteMapWithHandle(process, handle);
+
+ Logger.PrintInfo(LogClass.ServiceNv, $"Deleted map {handle}!");
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
public static NvMapHandle GetMapFromHandle(KProcess process, int handle, bool allowHandleZero = false)
{
if ((allowHandleZero || handle != 0) && _maps.TryGetValue(process, out IdDictionary dict))
diff --git a/Ryujinx.HLE/HOS/Services/Nv/Types/NvFence.cs b/Ryujinx.HLE/HOS/Services/Nv/Types/NvFence.cs
index 98f1ea72..664610a4 100644
--- a/Ryujinx.HLE/HOS/Services/Nv/Types/NvFence.cs
+++ b/Ryujinx.HLE/HOS/Services/Nv/Types/NvFence.cs
@@ -23,6 +23,11 @@ namespace Ryujinx.HLE.HOS.Services.Nv.Types
Value = hostSyncpt.ReadSyncpointValue(Id);
}
+ public void Increment(GpuContext gpuContext)
+ {
+ Value = gpuContext.Synchronization.IncrementSyncpoint(Id);
+ }
+
public bool Wait(GpuContext gpuContext, TimeSpan timeout)
{
if (IsValid())