aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Nv
diff options
context:
space:
mode:
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())