diff --git a/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs b/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs index b19549abc7..b391435dce 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs @@ -5,9 +5,9 @@ using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; -using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu; +using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap; @@ -28,13 +28,16 @@ namespace Ryujinx.HLE.HOS.Services.Nv private static Dictionary _fileDeviceRegistry = new Dictionary() { - { "/dev/nvhost-as-gpu", typeof(NvHostAsGpuFileDevice) }, + { "/dev/nvmap", typeof(NvMapFileDevice) }, { "/dev/nvhost-ctrl", typeof(NvHostCtrlFileDevice) }, { "/dev/nvhost-ctrl-gpu", typeof(NvHostCtrlGpuFileDevice) }, - //{ "/dev/nvhost-gpu", typeof(NvMapFileDevice) }, - //{ "/dev/nvhost-nvdec", typeof(NvMapFileDevice) }, - //{ "/dev/nvhost-vic", typeof(NvMapFileDevice) }, - { "/dev/nvmap", typeof(NvMapFileDevice) } + { "/dev/nvhost-as-gpu", typeof(NvHostAsGpuFileDevice) }, + { "/dev/nvhost-gpu", typeof(NvHostChannelFileDevice) }, + //{ "/dev/nvhost-msenc", typeof(NvHostChannelFileDevice) }, + { "/dev/nvhost-nvdec", typeof(NvHostChannelFileDevice) }, + //{ "/dev/nvhost-nvjpg", typeof(NvHostChannelFileDevice) }, + { "/dev/nvhost-vic", typeof(NvHostChannelFileDevice) }, + //{ "/dev/nvhost-display", typeof(NvHostChannelFileDevice) }, }; private static IdDictionary _fileDeviceIdRegistry = new IdDictionary(); @@ -287,6 +290,8 @@ namespace Ryujinx.HLE.HOS.Services.Nv if (errorCode == NvResult.Success) { fileDevice.Close(); + + _fileDeviceIdRegistry.Delete(fd); } } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvFileDevice.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvFileDevice.cs index 2bb33be00d..d1300ebc81 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvFileDevice.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvFileDevice.cs @@ -6,7 +6,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices { - abstract class NvFileDevice : IDisposable + abstract class NvFileDevice { protected KProcess _owner; @@ -62,10 +62,5 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices } public abstract void Close(); - - public void Dispose() - { - Close(); - } } } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuFileDevice.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuFileDevice.cs index cb80d01474..a51005e57f 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuFileDevice.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuFileDevice.cs @@ -24,33 +24,37 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu { NvInternalResult result = NvInternalResult.NotImplemented; - switch (command.GetNumberValue()) + if (command.GetTypeValue() == NvIoctl.NvGpuAsMagic) { - case 0x1: - result = CallIoctlMethod(BindChannel, arguments); - break; - case 0x2: - result = CallIoctlMethod(AllocSpace, arguments); - break; - case 0x3: - result = CallIoctlMethod(FreeSpace, arguments); - break; - case 0x5: - result = CallIoctlMethod(UnmapBuffer, arguments); - break; - case 0x6: - result = CallIoctlMethod(MapBufferEx, arguments); - break; - case 0x8: - result = CallIoctlMethod(GetVaRegions, arguments); - break; - case 0x9: - result = CallIoctlMethod(InitializeEx, arguments); - break; - case 0x14: - result = CallIoctlMethod(Remap, arguments); - break; + switch (command.GetNumberValue()) + { + case 0x1: + result = CallIoctlMethod(BindChannel, arguments); + break; + case 0x2: + result = CallIoctlMethod(AllocSpace, arguments); + break; + case 0x3: + result = CallIoctlMethod(FreeSpace, arguments); + break; + case 0x5: + result = CallIoctlMethod(UnmapBuffer, arguments); + break; + case 0x6: + result = CallIoctlMethod(MapBufferEx, arguments); + break; + case 0x8: + result = CallIoctlMethod(GetVaRegions, arguments); + break; + case 0x9: + result = CallIoctlMethod(InitializeEx, arguments); + break; + case 0x14: + result = CallIoctlMethod(Remap, arguments); + break; + } } + return result; } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelFileDevice.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelFileDevice.cs new file mode 100644 index 0000000000..88289a171b --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelFileDevice.cs @@ -0,0 +1,40 @@ +using Ryujinx.HLE.HOS.Kernel.Process; +using System; + +namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel +{ + class NvHostChannelFileDevice : NvFileDevice + { + public NvHostChannelFileDevice(KProcess owner) : base(owner) + { + + } + + public override NvInternalResult Ioctl(NvIoctl command, Span arguments) + { + NvInternalResult result = NvInternalResult.NotImplemented; + + if (command.GetTypeValue() == NvIoctl.NvHostMagic) + { + switch (command.GetNumberValue()) + { + + } + } + else if (command.GetTypeValue() == NvIoctl.NvGpuMagic) + { + switch (command.GetNumberValue()) + { + + } + } + + return result; + } + + public override void Close() + { + throw new NotImplementedException(); + } + } +} diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlFileDevice.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlFileDevice.cs index ebedaffd64..a8c3929823 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlFileDevice.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlFileDevice.cs @@ -23,26 +23,29 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl { NvInternalResult result = NvInternalResult.NotImplemented; - switch (command.GetNumberValue()) + if (command.GetTypeValue() == NvIoctl.NvHostMagic) { - case 0x1b: - // As Marshal cannot handle unaligned arrays, we do everything by hand here. - NvHostCtrlGetConfigurationArgument configArgument = NvHostCtrlGetConfigurationArgument.FromSpan(arguments); - result = GetConfig(configArgument); + switch (command.GetNumberValue()) + { + case 0x1b: + // As Marshal cannot handle unaligned arrays, we do everything by hand here. + GetConfigurationArguments configArgument = GetConfigurationArguments.FromSpan(arguments); + result = GetConfig(configArgument); - if (result == NvInternalResult.Success) - { - configArgument.CopyTo(arguments); - } - break; - default: - break; + if (result == NvInternalResult.Success) + { + configArgument.CopyTo(arguments); + } + break; + default: + break; + } } return result; } - private NvInternalResult GetConfig(NvHostCtrlGetConfigurationArgument arguments) + private NvInternalResult GetConfig(GetConfigurationArguments arguments) { if (!_isProductionMode && NxSettings.Settings.TryGetValue($"{arguments.Domain}!{arguments.Parameter}".ToLower(), out object nvSetting)) { diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostCtrlGetConfigurationArgument.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/GetConfigurationArguments.cs similarity index 81% rename from Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostCtrlGetConfigurationArgument.cs rename to Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/GetConfigurationArguments.cs index bae194aff3..358f673c92 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostCtrlGetConfigurationArgument.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/GetConfigurationArguments.cs @@ -3,18 +3,18 @@ using System.Text; namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl.Types { - class NvHostCtrlGetConfigurationArgument + class GetConfigurationArguments { public string Domain; public string Parameter; public byte[] Configuration; - public static NvHostCtrlGetConfigurationArgument FromSpan(Span span) + public static GetConfigurationArguments FromSpan(Span span) { string domain = Encoding.ASCII.GetString(span.Slice(0, 0x41)); string parameter = Encoding.ASCII.GetString(span.Slice(0x41, 0x41)); - NvHostCtrlGetConfigurationArgument result = new NvHostCtrlGetConfigurationArgument + GetConfigurationArguments result = new GetConfigurationArguments { Domain = domain.Substring(0, domain.IndexOf('\0')), Parameter = parameter.Substring(0, parameter.IndexOf('\0')), diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuFileDevice.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuFileDevice.cs index 5f85a6384e..c5659a11ab 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuFileDevice.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuFileDevice.cs @@ -24,29 +24,32 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu { NvInternalResult result = NvInternalResult.NotImplemented; - switch (command.GetNumberValue()) + if (command.GetTypeValue() == NvIoctl.NvGpuMagic) { - case 0x1: - result = CallIoctlMethod(ZcullGetCtxSize, arguments); - break; - case 0x2: - result = CallIoctlMethod(ZcullGetInfo, arguments); - break; - case 0x3: - result = CallIoctlMethod(ZbcSetTable, arguments); - break; - case 0x5: - result = CallIoctlMethod(GetCharacteristics, arguments); - break; - case 0x6: - result = CallIoctlMethod(GetTpcMasks, arguments); - break; - case 0x14: - result = CallIoctlMethod(GetActiveSlotMask, arguments); - break; - case 0x1c: - result = CallIoctlMethod(GetGpuTime, arguments); - break; + switch (command.GetNumberValue()) + { + case 0x1: + result = CallIoctlMethod(ZcullGetCtxSize, arguments); + break; + case 0x2: + result = CallIoctlMethod(ZcullGetInfo, arguments); + break; + case 0x3: + result = CallIoctlMethod(ZbcSetTable, arguments); + break; + case 0x5: + result = CallIoctlMethod(GetCharacteristics, arguments); + break; + case 0x6: + result = CallIoctlMethod(GetTpcMasks, arguments); + break; + case 0x14: + result = CallIoctlMethod(GetActiveSlotMask, arguments); + break; + case 0x1c: + result = CallIoctlMethod(GetGpuTime, arguments); + break; + } } return result; diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapFileDevice.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapFileDevice.cs index f7d8dec981..b4ecfe1bfb 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapFileDevice.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvMap/NvMapFileDevice.cs @@ -24,38 +24,41 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap { NvInternalResult result = NvInternalResult.NotImplemented; - switch (command.GetNumberValue()) + if (command.GetTypeValue() == NvIoctl.NvMapMagic) { - case 0x1: - result = CallIoctlMethod(Create, arguments); - break; - case 0x3: - result = CallIoctlMethod(FromId, arguments); - break; - case 0x4: - result = CallIoctlMethod(Alloc, arguments); - break; - case 0x5: - result = CallIoctlMethod(Free, arguments); - break; - case 0x9: - result = CallIoctlMethod(Param, arguments); - break; - case 0xe: - result = CallIoctlMethod(GetId, arguments); - break; - case 0x2: - case 0x6: - case 0x7: - case 0x8: - case 0xa: - case 0xc: - case 0xd: - case 0xf: - case 0x10: - case 0x11: - result = NvInternalResult.NotSupported; - break; + switch (command.GetNumberValue()) + { + case 0x1: + result = CallIoctlMethod(Create, arguments); + break; + case 0x3: + result = CallIoctlMethod(FromId, arguments); + break; + case 0x4: + result = CallIoctlMethod(Alloc, arguments); + break; + case 0x5: + result = CallIoctlMethod(Free, arguments); + break; + case 0x9: + result = CallIoctlMethod(Param, arguments); + break; + case 0xe: + result = CallIoctlMethod(GetId, arguments); + break; + case 0x2: + case 0x6: + case 0x7: + case 0x8: + case 0xa: + case 0xc: + case 0xd: + case 0xf: + case 0x10: + case 0x11: + result = NvInternalResult.NotSupported; + break; + } } return result; diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvIoctl.cs b/Ryujinx.HLE/HOS/Services/Nv/NvIoctl.cs index 2a2fd15bf0..88fba9af1c 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvIoctl.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvIoctl.cs @@ -6,6 +6,11 @@ namespace Ryujinx.HLE.HOS.Services.Nv [StructLayout(LayoutKind.Sequential)] struct NvIoctl { + public const int NvHostMagic = 0x00; + public const int NvMapMagic = 0x01; + public const int NvGpuAsMagic = 0x41; + public const int NvGpuMagic = 0x47; + private const int NumberBits = 8; private const int TypeBits = 8; private const int SizeBits = 14;