aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Nv/NvMap
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2019-09-19 02:45:11 +0200
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-09-19 10:45:11 +1000
commita0720b5681852f3d786d77bd3793b0359dea321c (patch)
tree9d8f61e540d1d1d827999902dad95e5c0c1e076e /Ryujinx.HLE/HOS/Services/Nv/NvMap
parent4af3101b22e6957d6aa48a2768566d658699f4ed (diff)
Refactoring HOS folder structure (#771)
* Refactoring HOS folder structure Refactoring HOS folder structure: - Added some subfolders when needed (Following structure decided in private). - Added some `Types` folders when needed. - Little cleanup here and there. - Add services placeholders for every HOS services (close #766 and #753). * Remove Types namespaces
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Nv/NvMap')
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapAlloc.cs12
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapCreate.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFree.cs11
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFromId.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapGetId.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandle.cs38
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandleParam.cs12
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapIoctl.cs300
-rw-r--r--Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapParam.cs9
9 files changed, 0 insertions, 406 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapAlloc.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapAlloc.cs
deleted file mode 100644
index bc61baad..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapAlloc.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- struct NvMapAlloc
- {
- public int Handle;
- public int HeapMask;
- public int Flags;
- public int Align;
- public long Kind;
- public long Address;
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapCreate.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapCreate.cs
deleted file mode 100644
index dd4bff98..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapCreate.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- struct NvMapCreate
- {
- public int Size;
- public int Handle;
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFree.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFree.cs
deleted file mode 100644
index d946987e..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFree.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- struct NvMapFree
- {
- public int Handle;
- public int Padding;
- public long Address;
- public int Size;
- public int Flags;
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFromId.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFromId.cs
deleted file mode 100644
index e49257ea..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapFromId.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- struct NvMapFromId
- {
- public int Id;
- public int Handle;
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapGetId.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapGetId.cs
deleted file mode 100644
index 1f4f3290..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapGetId.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- struct NvMapGetId
- {
- public int Id;
- public int Handle;
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandle.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandle.cs
deleted file mode 100644
index 31bf8329..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandle.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System.Threading;
-
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- class NvMapHandle
- {
- public int Handle;
- public int Id;
- public int Size;
- public int Align;
- public int Kind;
- public long Address;
- public bool Allocated;
- public long DmaMapAddress;
-
- private long _dupes;
-
- public NvMapHandle()
- {
- _dupes = 1;
- }
-
- public NvMapHandle(int size) : this()
- {
- Size = size;
- }
-
- public void IncrementRefCount()
- {
- Interlocked.Increment(ref _dupes);
- }
-
- public long DecrementRefCount()
- {
- return Interlocked.Decrement(ref _dupes);
- }
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandleParam.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandleParam.cs
deleted file mode 100644
index b360343c..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapHandleParam.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- enum NvMapHandleParam
- {
- Size = 1,
- Align = 2,
- Base = 3,
- Heap = 4,
- Kind = 5,
- Compr = 6
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapIoctl.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapIoctl.cs
deleted file mode 100644
index d9c579a2..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapIoctl.cs
+++ /dev/null
@@ -1,300 +0,0 @@
-using ARMeilleure.Memory;
-using Ryujinx.Common.Logging;
-using Ryujinx.Graphics.Memory;
-using Ryujinx.HLE.HOS.Kernel.Process;
-using Ryujinx.HLE.Utilities;
-using System.Collections.Concurrent;
-
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- class NvMapIoctl
- {
- private const int FlagNotFreedYet = 1;
-
- private static ConcurrentDictionary<KProcess, IdDictionary> _maps;
-
- static NvMapIoctl()
- {
- _maps = new ConcurrentDictionary<KProcess, IdDictionary>();
- }
-
- public static int ProcessIoctl(ServiceCtx context, int cmd)
- {
- switch (cmd & 0xffff)
- {
- case 0x0101: return Create(context);
- case 0x0103: return FromId(context);
- case 0x0104: return Alloc (context);
- case 0x0105: return Free (context);
- case 0x0109: return Param (context);
- case 0x010e: return GetId (context);
- }
-
- Logger.PrintWarning(LogClass.ServiceNv, $"Unsupported Ioctl command 0x{cmd:x8}!");
-
- return NvResult.NotSupported;
- }
-
- private static int Create(ServiceCtx context)
- {
- long inputPosition = context.Request.GetBufferType0x21().Position;
- long outputPosition = context.Request.GetBufferType0x22().Position;
-
- NvMapCreate args = MemoryHelper.Read<NvMapCreate>(context.Memory, inputPosition);
-
- if (args.Size == 0)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid size 0x{args.Size:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- int size = IntUtils.AlignUp(args.Size, NvGpuVmm.PageSize);
-
- args.Handle = AddNvMap(context, new NvMapHandle(size));
-
- Logger.PrintInfo(LogClass.ServiceNv, $"Created map {args.Handle} with size 0x{size:x8}!");
-
- MemoryHelper.Write(context.Memory, outputPosition, args);
-
- return NvResult.Success;
- }
-
- private static int FromId(ServiceCtx context)
- {
- long inputPosition = context.Request.GetBufferType0x21().Position;
- long outputPosition = context.Request.GetBufferType0x22().Position;
-
- NvMapFromId args = MemoryHelper.Read<NvMapFromId>(context.Memory, inputPosition);
-
- NvMapHandle map = GetNvMap(context, args.Id);
-
- if (map == null)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- map.IncrementRefCount();
-
- args.Handle = args.Id;
-
- MemoryHelper.Write(context.Memory, outputPosition, args);
-
- return NvResult.Success;
- }
-
- private static int Alloc(ServiceCtx context)
- {
- long inputPosition = context.Request.GetBufferType0x21().Position;
- long outputPosition = context.Request.GetBufferType0x22().Position;
-
- NvMapAlloc args = MemoryHelper.Read<NvMapAlloc>(context.Memory, inputPosition);
-
- NvMapHandle map = GetNvMap(context, args.Handle);
-
- if (map == null)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- if ((args.Align & (args.Align - 1)) != 0)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid alignment 0x{args.Align:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- if ((uint)args.Align < NvGpuVmm.PageSize)
- {
- args.Align = NvGpuVmm.PageSize;
- }
-
- int result = NvResult.Success;
-
- if (!map.Allocated)
- {
- map.Allocated = true;
-
- map.Align = args.Align;
- map.Kind = (byte)args.Kind;
-
- int size = IntUtils.AlignUp(map.Size, NvGpuVmm.PageSize);
-
- long address = args.Address;
-
- if (address == 0)
- {
- // When the address is zero, we need to allocate
- // our own backing memory for the NvMap.
- // TODO: Is this allocation inside the transfer memory?
- result = NvResult.OutOfMemory;
- }
-
- if (result == NvResult.Success)
- {
- map.Size = size;
- map.Address = address;
- }
- }
-
- MemoryHelper.Write(context.Memory, outputPosition, args);
-
- return result;
- }
-
- private static int Free(ServiceCtx context)
- {
- long inputPosition = context.Request.GetBufferType0x21().Position;
- long outputPosition = context.Request.GetBufferType0x22().Position;
-
- NvMapFree args = MemoryHelper.Read<NvMapFree>(context.Memory, inputPosition);
-
- NvMapHandle map = GetNvMap(context, args.Handle);
-
- if (map == null)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- if (map.DecrementRefCount() <= 0)
- {
- DeleteNvMap(context, args.Handle);
-
- Logger.PrintInfo(LogClass.ServiceNv, $"Deleted map {args.Handle}!");
-
- args.Address = map.Address;
- args.Flags = 0;
- }
- else
- {
- args.Address = 0;
- args.Flags = FlagNotFreedYet;
- }
-
- args.Size = map.Size;
-
- MemoryHelper.Write(context.Memory, outputPosition, args);
-
- return NvResult.Success;
- }
-
- private static int Param(ServiceCtx context)
- {
- long inputPosition = context.Request.GetBufferType0x21().Position;
- long outputPosition = context.Request.GetBufferType0x22().Position;
-
- NvMapParam args = MemoryHelper.Read<NvMapParam>(context.Memory, inputPosition);
-
- NvMapHandle map = GetNvMap(context, args.Handle);
-
- if (map == null)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- switch ((NvMapHandleParam)args.Param)
- {
- case NvMapHandleParam.Size: args.Result = map.Size; break;
- case NvMapHandleParam.Align: args.Result = map.Align; break;
- case NvMapHandleParam.Heap: args.Result = 0x40000000; break;
- case NvMapHandleParam.Kind: args.Result = map.Kind; break;
- case NvMapHandleParam.Compr: args.Result = 0; break;
-
- // Note: Base is not supported and returns an error.
- // Any other value also returns an error.
- default: return NvResult.InvalidInput;
- }
-
- MemoryHelper.Write(context.Memory, outputPosition, args);
-
- return NvResult.Success;
- }
-
- private static int GetId(ServiceCtx context)
- {
- long inputPosition = context.Request.GetBufferType0x21().Position;
- long outputPosition = context.Request.GetBufferType0x22().Position;
-
- NvMapGetId args = MemoryHelper.Read<NvMapGetId>(context.Memory, inputPosition);
-
- NvMapHandle map = GetNvMap(context, args.Handle);
-
- if (map == null)
- {
- Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!");
-
- return NvResult.InvalidInput;
- }
-
- args.Id = args.Handle;
-
- MemoryHelper.Write(context.Memory, outputPosition, args);
-
- return NvResult.Success;
- }
-
- private static int AddNvMap(ServiceCtx context, NvMapHandle map)
- {
- IdDictionary dict = _maps.GetOrAdd(context.Process, (key) =>
- {
- IdDictionary newDict = new IdDictionary();
-
- newDict.Add(0, new NvMapHandle());
-
- return newDict;
- });
-
- return dict.Add(map);
- }
-
- private static bool DeleteNvMap(ServiceCtx context, int handle)
- {
- if (_maps.TryGetValue(context.Process, out IdDictionary dict))
- {
- return dict.Delete(handle) != null;
- }
-
- return false;
- }
-
- public static void InitializeNvMap(ServiceCtx context)
- {
- IdDictionary dict = _maps.GetOrAdd(context.Process, (key) =>new IdDictionary());
-
- dict.Add(0, new NvMapHandle());
- }
-
- public static NvMapHandle GetNvMapWithFb(ServiceCtx context, int handle)
- {
- if (_maps.TryGetValue(context.Process, out IdDictionary dict))
- {
- return dict.GetData<NvMapHandle>(handle);
- }
-
- return null;
- }
-
- public static NvMapHandle GetNvMap(ServiceCtx context, int handle)
- {
- if (handle != 0 && _maps.TryGetValue(context.Process, out IdDictionary dict))
- {
- return dict.GetData<NvMapHandle>(handle);
- }
-
- return null;
- }
-
- public static void UnloadProcess(KProcess process)
- {
- _maps.TryRemove(process, out _);
- }
- }
-} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapParam.cs b/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapParam.cs
deleted file mode 100644
index b5213efe..00000000
--- a/Ryujinx.HLE/HOS/Services/Nv/NvMap/NvMapParam.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Ryujinx.HLE.HOS.Services.Nv.NvMap
-{
- struct NvMapParam
- {
- public int Handle;
- public int Param;
- public int Result;
- }
-} \ No newline at end of file