From 0fbcd630bc57885d6b94fd3c4b3546493e09059e Mon Sep 17 00:00:00 2001 From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> Date: Thu, 15 Dec 2022 12:07:31 -0500 Subject: Replace `DllImport` usage with `LibraryImport` (#4084) * Replace usage of `DllImport` with `LibraryImport` * Mark methods as `partial` * Marshalling * More `partial` & marshalling * More `partial` and marshalling * More partial and marshalling * Update GdiPlusHelper to LibraryImport * Unicorn * More Partial * Marshal * Specify EntryPoint * Specify EntryPoint * Change GlobalMemoryStatusEx to LibraryImport * Change RegisterClassEx to LibraryImport * Define EntryPoints * Update Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Move return mashal * Remove calling convention specification * Remove calling conventions * Update Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan * Update Ryujinx.Ava/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Co-authored-by: Mary-nyan --- .../Signal/UnixSignalHandlerRegistration.cs | 10 +- .../Signal/WindowsSignalHandlerRegistration.cs | 18 ++-- ARMeilleure/Translation/Cache/JitUnwindWindows.cs | 9 +- Ryujinx.Ava/AppHost.cs | 2 +- Ryujinx.Ava/Helper/MetalHelper.cs | 34 +++--- Ryujinx.Ava/Program.cs | 8 +- Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs | 8 +- Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs | 52 +++++----- .../GraphicsDriver/NVThreadedOptimization.cs | 6 +- .../Memory/PartialUnmaps/PartialUnmapState.cs | 21 ++-- Ryujinx.Common/System/DisplaySleep.cs | 35 ------- Ryujinx.Common/System/ForceDpiAware.cs | 95 ----------------- Ryujinx.Common/System/GdiPlusHelper.cs | 76 -------------- .../System/WindowsMultimediaTimerResolution.cs | 114 --------------------- Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs | 18 ++-- Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs | 12 +-- Ryujinx.Common/SystemInterop/DisplaySleep.cs | 35 +++++++ Ryujinx.Common/SystemInterop/ForceDpiAware.cs | 96 +++++++++++++++++ Ryujinx.Common/SystemInterop/GdiPlusHelper.cs | 76 ++++++++++++++ .../WindowsMultimediaTimerResolution.cs | 114 +++++++++++++++++++++ Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs | 66 ++++++------ Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs | 6 +- Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs | 6 +- Ryujinx.Headless.SDL2/Program.cs | 2 +- Ryujinx.Memory/MemoryManagerUnixHelper.cs | 46 ++++----- Ryujinx.Memory/WindowsShared/WindowsApi.cs | 55 +++++----- Ryujinx.Tests.Unicorn/Native/Interface.cs | 55 +++++----- Ryujinx.Ui.Common/Helper/ConsoleHelper.cs | 11 +- Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj | 1 + Ryujinx/Program.cs | 20 ++-- Ryujinx/Ui/GLRenderer.cs | 14 +-- Ryujinx/Ui/Helper/MetalHelper.cs | 38 +++---- Ryujinx/Ui/MainWindow.cs | 2 +- Ryujinx/Ui/VKRenderer.cs | 14 +-- 34 files changed, 592 insertions(+), 583 deletions(-) delete mode 100644 Ryujinx.Common/System/DisplaySleep.cs delete mode 100644 Ryujinx.Common/System/ForceDpiAware.cs delete mode 100644 Ryujinx.Common/System/GdiPlusHelper.cs delete mode 100644 Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs create mode 100644 Ryujinx.Common/SystemInterop/DisplaySleep.cs create mode 100644 Ryujinx.Common/SystemInterop/ForceDpiAware.cs create mode 100644 Ryujinx.Common/SystemInterop/GdiPlusHelper.cs create mode 100644 Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs diff --git a/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs b/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs index 12bda3de..945a01da 100644 --- a/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs +++ b/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs @@ -18,17 +18,17 @@ namespace ARMeilleure.Signal public IntPtr sa_restorer; } - static class UnixSignalHandlerRegistration + static partial class UnixSignalHandlerRegistration { private const int SIGSEGV = 11; private const int SIGBUS = 10; private const int SA_SIGINFO = 0x00000004; - [DllImport("libc", SetLastError = true)] - private static extern int sigaction(int signum, ref SigAction sigAction, out SigAction oldAction); + [LibraryImport("libc", SetLastError = true)] + private static partial int sigaction(int signum, ref SigAction sigAction, out SigAction oldAction); - [DllImport("libc", SetLastError = true)] - private static extern int sigemptyset(ref SigSet set); + [LibraryImport("libc", SetLastError = true)] + private static partial int sigemptyset(ref SigSet set); public static SigAction RegisterExceptionHandler(IntPtr action) { diff --git a/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs b/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs index b74f1098..3219e015 100644 --- a/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs +++ b/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs @@ -3,19 +3,19 @@ using System.Runtime.InteropServices; namespace ARMeilleure.Signal { - unsafe class WindowsSignalHandlerRegistration + unsafe partial class WindowsSignalHandlerRegistration { - [DllImport("kernel32.dll")] - private static extern IntPtr AddVectoredExceptionHandler(uint first, IntPtr handler); + [LibraryImport("kernel32.dll")] + private static partial IntPtr AddVectoredExceptionHandler(uint first, IntPtr handler); - [DllImport("kernel32.dll")] - private static extern ulong RemoveVectoredExceptionHandler(IntPtr handle); + [LibraryImport("kernel32.dll")] + private static partial ulong RemoveVectoredExceptionHandler(IntPtr handle); - [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)] - static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName); + [LibraryImport("kernel32.dll", SetLastError = true, EntryPoint = "LoadLibraryA")] + private static partial IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName); - [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] - private static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + [LibraryImport("kernel32.dll", SetLastError = true)] + private static partial IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)] string procName); private static IntPtr _getCurrentThreadIdPtr; diff --git a/ARMeilleure/Translation/Cache/JitUnwindWindows.cs b/ARMeilleure/Translation/Cache/JitUnwindWindows.cs index 072c0f51..77727bf1 100644 --- a/ARMeilleure/Translation/Cache/JitUnwindWindows.cs +++ b/ARMeilleure/Translation/Cache/JitUnwindWindows.cs @@ -7,7 +7,7 @@ using System.Runtime.InteropServices; namespace ARMeilleure.Translation.Cache { - static class JitUnwindWindows + static partial class JitUnwindWindows { private const int MaxUnwindCodesArraySize = 32; // Must be an even value. @@ -42,14 +42,15 @@ namespace ARMeilleure.Translation.Cache private unsafe delegate RuntimeFunction* GetRuntimeFunctionCallback(ulong controlPc, IntPtr context); - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - private static unsafe extern bool RtlInstallFunctionTableCallback( + [LibraryImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static unsafe partial bool RtlInstallFunctionTableCallback( ulong tableIdentifier, ulong baseAddress, uint length, GetRuntimeFunctionCallback callback, IntPtr context, - string outOfProcessCallbackDll); + [MarshalAs(UnmanagedType.LPWStr)] string outOfProcessCallbackDll); private static GetRuntimeFunctionCallback _getRuntimeFunctionCallback; diff --git a/Ryujinx.Ava/AppHost.cs b/Ryujinx.Ava/AppHost.cs index 0cb3bd13..c1b3355a 100644 --- a/Ryujinx.Ava/AppHost.cs +++ b/Ryujinx.Ava/AppHost.cs @@ -17,7 +17,7 @@ using Ryujinx.Ava.Ui.Windows; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; -using Ryujinx.Common.System; +using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; diff --git a/Ryujinx.Ava/Helper/MetalHelper.cs b/Ryujinx.Ava/Helper/MetalHelper.cs index ae07ce69..2d4d828b 100644 --- a/Ryujinx.Ava/Helper/MetalHelper.cs +++ b/Ryujinx.Ava/Helper/MetalHelper.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Ava.Ui.Helper public delegate void UpdateBoundsCallbackDelegate(Rect rect); [SupportedOSPlatform("macos")] - static class MetalHelper + static partial class MetalHelper { private const string LibObjCImport = "/usr/lib/libobjc.A.dylib"; @@ -100,28 +100,28 @@ namespace Ryujinx.Ava.Ui.Helper // TODO } - [DllImport(LibObjCImport)] - private static unsafe extern IntPtr sel_registerName(byte* data); + [LibraryImport(LibObjCImport)] + private static unsafe partial IntPtr sel_registerName(byte* data); - [DllImport(LibObjCImport)] - private static unsafe extern IntPtr objc_getClass(byte* data); + [LibraryImport(LibObjCImport)] + private static unsafe partial IntPtr objc_getClass(byte* data); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, byte value); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, byte value); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, NSRect point); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, NSRect point); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, double value); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, double value); - [DllImport(LibObjCImport, EntryPoint = "objc_msgSend")] - private static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector); + [LibraryImport(LibObjCImport, EntryPoint = "objc_msgSend")] + private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector); } } \ No newline at end of file diff --git a/Ryujinx.Ava/Program.cs b/Ryujinx.Ava/Program.cs index ba10a459..023e31df 100644 --- a/Ryujinx.Ava/Program.cs +++ b/Ryujinx.Ava/Program.cs @@ -6,7 +6,7 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; -using Ryujinx.Common.System; +using Ryujinx.Common.SystemInterop; using Ryujinx.Common.SystemInfo; using Ryujinx.Modules; using Ryujinx.SDL2.Common; @@ -20,7 +20,7 @@ using System.Threading.Tasks; namespace Ryujinx.Ava { - internal class Program + internal partial class Program { public static double WindowScaleFactor { get; set; } public static double DesktopScaleFactor { get; set; } = 1.0; @@ -28,8 +28,8 @@ namespace Ryujinx.Ava public static string ConfigurationPath { get; private set; } public static bool PreviewerDetached { get; private set; } - [DllImport("user32.dll", SetLastError = true)] - public static extern int MessageBoxA(IntPtr hWnd, string text, string caption, uint type); + [LibraryImport("user32.dll", SetLastError = true)] + public static partial int MessageBoxA(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string text, [MarshalAs(UnmanagedType.LPStr)] string caption, uint type); private const uint MB_ICONWARNING = 0x30; diff --git a/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs b/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs index 26007591..05b2cc5b 100644 --- a/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs +++ b/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs @@ -125,9 +125,9 @@ namespace Ryujinx.Ava.Ui.Controls { cbSize = Marshal.SizeOf(), hInstance = GetModuleHandle(null), - lpfnWndProc = _wndProcDelegate, + lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate), style = ClassStyles.CS_OWNDC, - lpszClassName = _className, + lpszClassName = Marshal.StringToHGlobalUni(_className), hCursor = LoadCursor(IntPtr.Zero, (IntPtr)Cursors.IDC_ARROW) }; @@ -148,7 +148,9 @@ namespace Ryujinx.Ava.Ui.Controls IntPtr.Zero); WindowHandle = handle; - + + Marshal.FreeHGlobal(wndClassEx.lpszClassName); + return new PlatformHandle(WindowHandle, "HWND"); } diff --git a/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs b/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs index 124536d9..81e2fee9 100644 --- a/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs +++ b/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs @@ -5,7 +5,7 @@ using System.Runtime.Versioning; namespace Ryujinx.Ava.Ui.Controls { [SupportedOSPlatform("windows")] - internal class Win32NativeInterop + internal partial class Win32NativeInterop { [Flags] public enum ClassStyles : uint @@ -48,58 +48,52 @@ namespace Ryujinx.Ava.Ui.Controls [UnmanagedFunctionPointer(CallingConvention.Winapi)] internal delegate IntPtr WindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam); - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + [StructLayout(LayoutKind.Sequential)] public struct WNDCLASSEX { public int cbSize; public ClassStyles style; - [MarshalAs(UnmanagedType.FunctionPtr)] - public WindowProc lpfnWndProc; // not WndProc + public IntPtr lpfnWndProc; // not WndProc public int cbClsExtra; public int cbWndExtra; public IntPtr hInstance; public IntPtr hIcon; public IntPtr hCursor; public IntPtr hbrBackground; - [MarshalAs(UnmanagedType.LPWStr)] - public string lpszMenuName; - [MarshalAs(UnmanagedType.LPWStr)] - public string lpszClassName; + public IntPtr lpszMenuName; + public IntPtr lpszClassName; public IntPtr hIconSm; - public static WNDCLASSEX Create() + public WNDCLASSEX() { - return new WNDCLASSEX - { - cbSize = Marshal.SizeOf() - }; + cbSize = Marshal.SizeOf(); } } - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern ushort RegisterClassEx(ref WNDCLASSEX param); + [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClassExW")] + public static partial ushort RegisterClassEx(ref WNDCLASSEX param); - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern short UnregisterClass([MarshalAs(UnmanagedType.LPWStr)] string lpClassName, IntPtr instance); + [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "UnregisterClassW")] + public static partial short UnregisterClass([MarshalAs(UnmanagedType.LPWStr)] string lpClassName, IntPtr instance); - [DllImport("user32.dll", CharSet = CharSet.Unicode)] - public static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam); + [LibraryImport("user32.dll", EntryPoint = "DefWindowProcW")] + public static partial IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam); - [DllImport("kernel32.dll")] - public static extern IntPtr GetModuleHandle(string lpModuleName); + [LibraryImport("kernel32.dll", EntryPoint = "GetModuleHandleA")] + public static partial IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPStr)] string lpModuleName); - [DllImport("user32.dll", SetLastError = true)] + [LibraryImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool DestroyWindow(IntPtr hwnd); + public static partial bool DestroyWindow(IntPtr hwnd); - [DllImport("user32.dll", SetLastError = true)] - public static extern IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName); + [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "LoadCursorA")] + public static partial IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName); - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern IntPtr CreateWindowEx( + [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "CreateWindowExW")] + public static partial IntPtr CreateWindowEx( uint dwExStyle, - string lpClassName, - string lpWindowName, + [MarshalAs(UnmanagedType.LPWStr)] string lpClassName, + [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName, WindowStyles dwStyle, int x, int y, diff --git a/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs b/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs index d21d3555..c5be6e37 100644 --- a/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs +++ b/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.Common.GraphicsDriver { - static class NVThreadedOptimization + static partial class NVThreadedOptimization { private const string ProfileName = "Ryujinx Nvidia Profile"; @@ -19,8 +19,8 @@ namespace Ryujinx.Common.GraphicsDriver private const uint NvAPI_DRS_SaveSettings_ID = 0xFCBC7E14; private const uint NvAPI_DRS_DestroySession_ID = 0x0DAD9CFF8; - [DllImport("nvapi64")] - private static extern IntPtr nvapi_QueryInterface(uint id); + [LibraryImport("nvapi64")] + private static partial IntPtr nvapi_QueryInterface(uint id); private delegate int NvAPI_InitializeDelegate(); private static NvAPI_InitializeDelegate NvAPI_Initialize; diff --git a/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs b/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs index 7a14e616..3463d06c 100644 --- a/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs +++ b/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs @@ -1,6 +1,7 @@ using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; using System.Runtime.Versioning; using System.Threading; @@ -12,7 +13,7 @@ namespace Ryujinx.Common.Memory.PartialUnmaps /// State for partial unmaps. Intended to be used on Windows. /// [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct PartialUnmapState + public partial struct PartialUnmapState { public NativeReaderWriterLock PartialUnmapLock; public int PartialUnmapsCount; @@ -25,20 +26,22 @@ namespace Ryujinx.Common.Memory.PartialUnmaps public readonly static IntPtr GlobalState; [SupportedOSPlatform("windows")] - [DllImport("kernel32.dll")] - public static extern int GetCurrentThreadId(); + [LibraryImport("kernel32.dll")] + public static partial int GetCurrentThreadId(); [SupportedOSPlatform("windows")] - [DllImport("kernel32.dll", SetLastError = true)] - static extern IntPtr OpenThread(int dwDesiredAccess, bool bInheritHandle, uint dwThreadId); + [LibraryImport("kernel32.dll", SetLastError = true)] + private static partial IntPtr OpenThread(int dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwThreadId); [SupportedOSPlatform("windows")] - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool CloseHandle(IntPtr hObject); + [LibraryImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs (UnmanagedType.Bool)] + public static partial bool CloseHandle(IntPtr hObject); [SupportedOSPlatform("windows")] - [DllImport("kernel32.dll", SetLastError = true)] - static extern bool GetExitCodeThread(IntPtr hThread, out uint lpExitCode); + [LibraryImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static partial bool GetExitCodeThread(IntPtr hThread, out uint lpExitCode); /// /// Creates a global static PartialUnmapState and populates the field offsets. diff --git a/Ryujinx.Common/System/DisplaySleep.cs b/Ryujinx.Common/System/DisplaySleep.cs deleted file mode 100644 index bad964b9..00000000 --- a/Ryujinx.Common/System/DisplaySleep.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace Ryujinx.Common.System -{ - public class DisplaySleep - { - [Flags] - enum EXECUTION_STATE : uint - { - ES_CONTINUOUS = 0x80000000, - ES_DISPLAY_REQUIRED = 0x00000002, - ES_SYSTEM_REQUIRED = 0x00000001 - } - - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags); - - static public void Prevent() - { - if (OperatingSystem.IsWindows()) - { - SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED); - } - } - - static public void Restore() - { - if (OperatingSystem.IsWindows()) - { - SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); - } - } - } -} diff --git a/Ryujinx.Common/System/ForceDpiAware.cs b/Ryujinx.Common/System/ForceDpiAware.cs deleted file mode 100644 index 8d19876e..00000000 --- a/Ryujinx.Common/System/ForceDpiAware.cs +++ /dev/null @@ -1,95 +0,0 @@ -using Ryujinx.Common.Logging; -using System; -using System.Globalization; -using System.Runtime.InteropServices; - -namespace Ryujinx.Common.System -{ - public static class ForceDpiAware - { - [DllImport("user32.dll")] - private static extern bool SetProcessDPIAware(); - - private const string X11LibraryName = "libX11.so.6"; - - [DllImport(X11LibraryName)] - private static extern IntPtr XOpenDisplay(string display); - - [DllImport(X11LibraryName)] - private static extern IntPtr XGetDefault(IntPtr display, string program, string option); - - [DllImport(X11LibraryName)] - private static extern int XDisplayWidth(IntPtr display, int screenNumber); - - [DllImport(X11LibraryName)] - private static extern int XDisplayWidthMM(IntPtr display, int screenNumber); - - [DllImport(X11LibraryName)] - private static extern int XCloseDisplay(IntPtr display); - - private static readonly double _standardDpiScale = 96.0; - private static readonly double _maxScaleFactor = 1.25; - - /// - /// Marks the application as DPI-Aware when running on the Windows operating system. - /// - public static void Windows() - { - // Make process DPI aware for proper window sizing on high-res screens. - if (OperatingSystem.IsWindowsVersionAtLeast(6)) - { - SetProcessDPIAware(); - } - } - - public static double GetActualScaleFactor() - { - double userDpiScale = 96.0; - - try - { - if (OperatingSystem.IsWindows()) - { - userDpiScale = GdiPlusHelper.GetDpiX(IntPtr.Zero); - } - else if (OperatingSystem.IsLinux()) - { - string xdgSessionType = Environment.GetEnvironmentVariable("XDG_SESSION_TYPE")?.ToLower(); - - if (xdgSessionType == null || xdgSessionType == "x11") - { - IntPtr display = XOpenDisplay(null); - string dpiString = Marshal.PtrToStringAnsi(XGetDefault(display, "Xft", "dpi")); - if (dpiString == null || !double.TryParse(dpiString, NumberStyles.Any, CultureInfo.InvariantCulture, out userDpiScale)) - { - userDpiScale = (double)XDisplayWidth(display, 0) * 25.4 / (double)XDisplayWidthMM(display, 0); - } - XCloseDisplay(display); - } - else if (xdgSessionType == "wayland") - { - // TODO - Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: Wayland not yet supported"); - } - else - { - Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: Unrecognised XDG_SESSION_TYPE: {xdgSessionType}"); - } - } - } - catch (Exception e) - { - Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: {e.Message}"); - } - - return userDpiScale; - } - - public static double GetWindowScaleFactor() - { - double userDpiScale = GetActualScaleFactor(); - - return Math.Min(userDpiScale / _standardDpiScale, _maxScaleFactor); - } - } -} diff --git a/Ryujinx.Common/System/GdiPlusHelper.cs b/Ryujinx.Common/System/GdiPlusHelper.cs deleted file mode 100644 index c084c651..00000000 --- a/Ryujinx.Common/System/GdiPlusHelper.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; - -namespace Ryujinx.Common.System -{ - [SupportedOSPlatform("windows")] - public static class GdiPlusHelper - { - private const string LibraryName = "gdiplus.dll"; - - private static readonly IntPtr _initToken; - - static GdiPlusHelper() - { - CheckStatus(GdiplusStartup(out _initToken, StartupInputEx.Default, out _)); - } - - private static void CheckStatus(int gdiStatus) - { - if (gdiStatus != 0) - { - throw new Exception($"GDI Status Error: {gdiStatus}"); - } - } - - private struct StartupInputEx - { - public int GdiplusVersion; - -#pragma warning disable CS0649 - public IntPtr DebugEventCallback; - public int SuppressBackgroundThread; - public int SuppressExternalCodecs; - public int StartupParameters; -#pragma warning restore CS0649 - - public static StartupInputEx Default => new StartupInputEx - { - // We assume Windows 8 and upper - GdiplusVersion = 2, - DebugEventCallback = IntPtr.Zero, - SuppressBackgroundThread = 0, - SuppressExternalCodecs = 0, - StartupParameters = 0, - }; - } - - private struct StartupOutput - { - public IntPtr NotificationHook; - public IntPtr NotificationUnhook; - } - - [DllImport(LibraryName)] - private static extern int GdiplusStartup(out IntPtr token, in StartupInputEx input, out StartupOutput output); - - [DllImport(LibraryName)] - private static extern int GdipCreateFromHWND(IntPtr hwnd, out IntPtr graphics); - - [DllImport(LibraryName)] - private static extern int GdipDeleteGraphics(IntPtr graphics); - - [DllImport(LibraryName)] - private static extern int GdipGetDpiX(IntPtr graphics, out float dpi); - - public static float GetDpiX(IntPtr hwnd) - { - CheckStatus(GdipCreateFromHWND(hwnd, out IntPtr graphicsHandle)); - CheckStatus(GdipGetDpiX(graphicsHandle, out float result)); - CheckStatus(GdipDeleteGraphics(graphicsHandle)); - - return result; - } - } -} diff --git a/Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs b/Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs deleted file mode 100644 index d19fbe73..00000000 --- a/Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs +++ /dev/null @@ -1,114 +0,0 @@ -using Ryujinx.Common.Logging; -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; - -namespace Ryujinx.Common.System -{ - /// - /// Handle Windows Multimedia timer resolution. - /// - [SupportedOSPlatform("windows")] - public class WindowsMultimediaTimerResolution : IDisposable - { - [StructLayout(LayoutKind.Sequential)] - public struct TimeCaps - { - public uint wPeriodMin; - public uint wPeriodMax; - }; - - [DllImport("winmm.dll", EntryPoint = "timeGetDevCaps", SetLastError = true)] - private static extern uint TimeGetDevCaps(ref TimeCaps timeCaps, uint sizeTimeCaps); - - [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")] - private static extern uint TimeBeginPeriod(uint uMilliseconds); - - [DllImport("winmm.dll", EntryPoint = "timeEndPeriod")] - private static extern uint TimeEndPeriod(uint uMilliseconds); - - private uint _targetResolutionInMilliseconds; - private bool _isActive; - - /// - /// Create a new and activate the given resolution. - /// - /// - public WindowsMultimediaTimerResolution(uint targetResolutionInMilliseconds) - { - _targetResolutionInMilliseconds = targetResolutionInMilliseconds; - - EnsureResolutionSupport(); - Activate(); - } - - private void EnsureResolutionSupport() - { - TimeCaps timeCaps = default; - - uint result = TimeGetDevCaps(ref timeCaps, (uint)Unsafe.SizeOf()); - - if (result != 0) - { - Logger.Notice.Print(LogClass.Application, $"timeGetDevCaps failed with result: {result}"); - } - else - { - uint supportedTargetResolutionInMilliseconds = Math.Min(Math.Max(timeCaps.wPeriodMin, _targetResolutionInMilliseconds), timeCaps.wPeriodMax); - - if (supportedTargetResolutionInMilliseconds != _targetResolutionInMilliseconds) - { - Logger.Notice.Print(LogClass.Application, $"Target resolution isn't supported by OS, using closest resolution: {supportedTargetResolutionInMilliseconds}ms"); - - _targetResolutionInMilliseconds = supportedTargetResolutionInMilliseconds; - } - } - } - - private void Activate() - { - uint result = TimeBeginPeriod(_targetResolutionInMilliseconds); - - if (result != 0) - { - Logger.Notice.Print(LogClass.Application, $"timeBeginPeriod failed with result: {result}"); - } - else - { - _isActive = true; - } - } - - private void Disable() - { - if (_isActive) - { - uint result = TimeEndPeriod(_targetResolutionInMilliseconds); - - if (result != 0) - { - Logger.Notice.Print(LogClass.Application, $"timeEndPeriod failed with result: {result}"); - } - else - { - _isActive = false; - } - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - Disable(); - } - } - } -} \ No newline at end of file diff --git a/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs b/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs index 3fcb1a25..ad022bdf 100644 --- a/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs +++ b/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs @@ -8,7 +8,7 @@ using Ryujinx.Common.Logging; namespace Ryujinx.Common.SystemInfo { [SupportedOSPlatform("macos")] - class MacOSSystemInfo : SystemInfo + partial class MacOSSystemInfo : SystemInfo { internal MacOSSystemInfo() { @@ -60,8 +60,8 @@ namespace Ryujinx.Common.SystemInfo private const string SystemLibraryName = "libSystem.dylib"; - [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)] - private static extern int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize); + [LibraryImport(SystemLibraryName, SetLastError = true)] + private static partial int sysctlbyname([MarshalAs(UnmanagedType.LPStr)] string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize); private static int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize) { @@ -116,11 +116,11 @@ namespace Ryujinx.Common.SystemInfo return res; } - [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)] - private static extern uint mach_host_self(); + [LibraryImport(SystemLibraryName, SetLastError = true)] + private static partial uint mach_host_self(); - [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)] - private static extern int host_page_size(uint host, ref uint out_page_size); + [LibraryImport(SystemLibraryName, SetLastError = true)] + private static partial int host_page_size(uint host, ref uint out_page_size); [StructLayout(LayoutKind.Sequential, Pack = 8)] struct VMStatistics64 @@ -151,7 +151,7 @@ namespace Ryujinx.Common.SystemInfo public ulong TotalUncompressedPagesInCompressor; } - [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)] - private static extern int host_statistics64(uint host_priv, int host_flavor, ref VMStatistics64 host_info64_out, ref uint host_info64_outCnt); + [LibraryImport(SystemLibraryName, SetLastError = true)] + private static partial int host_statistics64(uint host_priv, int host_flavor, ref VMStatistics64 host_info64_out, ref uint host_info64_outCnt); } } \ No newline at end of file diff --git a/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs b/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs index ffce665e..11f0785e 100644 --- a/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs +++ b/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs @@ -7,7 +7,7 @@ using Ryujinx.Common.Logging; namespace Ryujinx.Common.SystemInfo { [SupportedOSPlatform("windows")] - class WindowsSystemInfo : SystemInfo + partial class WindowsSystemInfo : SystemInfo { internal WindowsSystemInfo() { @@ -18,7 +18,7 @@ namespace Ryujinx.Common.SystemInfo private static (ulong Total, ulong Available) GetMemoryStats() { MemoryStatusEx memStatus = new MemoryStatusEx(); - if (GlobalMemoryStatusEx(memStatus)) + if (GlobalMemoryStatusEx(ref memStatus)) { return (memStatus.TotalPhys, memStatus.AvailPhys); // Bytes } @@ -45,8 +45,8 @@ namespace Ryujinx.Common.SystemInfo return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").Trim(); } - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - private class MemoryStatusEx + [StructLayout(LayoutKind.Sequential)] + private struct MemoryStatusEx { public uint Length; public uint MemoryLoad; @@ -64,9 +64,9 @@ namespace Ryujinx.Common.SystemInfo } } + [LibraryImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - private static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatusEx lpBuffer); + private static partial bool GlobalMemoryStatusEx(ref MemoryStatusEx lpBuffer); private static ManagementObjectCollection GetWMIObjects(string scope, string query) { diff --git a/Ryujinx.Common/SystemInterop/DisplaySleep.cs b/Ryujinx.Common/SystemInterop/DisplaySleep.cs new file mode 100644 index 00000000..5a1f66f5 --- /dev/null +++ b/Ryujinx.Common/SystemInterop/DisplaySleep.cs @@ -0,0 +1,35 @@ +using System; +using System.Runtime.InteropServices; + +namespace Ryujinx.Common.SystemInterop +{ + public partial class DisplaySleep + { + [Flags] + enum EXECUTION_STATE : uint + { + ES_CONTINUOUS = 0x80000000, + ES_DISPLAY_REQUIRED = 0x00000002, + ES_SYSTEM_REQUIRED = 0x00000001 + } + + [LibraryImport("kernel32.dll", SetLastError = true)] + private static partial EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags); + + static public void Prevent() + { + if (OperatingSystem.IsWindows()) + { + SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED); + } + } + + static public void Restore() + { + if (OperatingSystem.IsWindows()) + { + SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); + } + } + } +} diff --git a/Ryujinx.Common/SystemInterop/ForceDpiAware.cs b/Ryujinx.Common/SystemInterop/ForceDpiAware.cs new file mode 100644 index 00000000..f17612a6 --- /dev/null +++ b/Ryujinx.Common/SystemInterop/ForceDpiAware.cs @@ -0,0 +1,96 @@ +using Ryujinx.Common.Logging; +using System; +using System.Globalization; +using System.Runtime.InteropServices; + +namespace Ryujinx.Common.SystemInterop +{ + public static partial class ForceDpiAware + { + [LibraryImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static partial bool SetProcessDPIAware(); + + private const string X11LibraryName = "libX11.so.6"; + + [LibraryImport(X11LibraryName)] + private static partial IntPtr XOpenDisplay([MarshalAs(UnmanagedType.LPStr)] string display); + + [LibraryImport(X11LibraryName)] + private static partial IntPtr XGetDefault(IntPtr display, [MarshalAs(UnmanagedType.LPStr)] string program, [MarshalAs(UnmanagedType.LPStr)] string option); + + [LibraryImport(X11LibraryName)] + private static partial int XDisplayWidth(IntPtr display, int screenNumber); + + [LibraryImport(X11LibraryName)] + private static partial int XDisplayWidthMM(IntPtr display, int screenNumber); + + [LibraryImport(X11LibraryName)] + private static partial int XCloseDisplay(IntPtr display); + + private static readonly double _standardDpiScale = 96.0; + private static readonly double _maxScaleFactor = 1.25; + + /// + /// Marks the application as DPI-Aware when running on the Windows operating system. + /// + public static void Windows() + { + // Make process DPI aware for proper window sizing on high-res screens. + if (OperatingSystem.IsWindowsVersionAtLeast(6)) + { + SetProcessDPIAware(); + } + } + + public static double GetActualScaleFactor() + { + double userDpiScale = 96.0; + + try + { + if (OperatingSystem.IsWindows()) + { + userDpiScale = GdiPlusHelper.GetDpiX(IntPtr.Zero); + } + else if (OperatingSystem.IsLinux()) + { + string xdgSessionType = Environment.GetEnvironmentVariable("XDG_SESSION_TYPE")?.ToLower(); + + if (xdgSessionType == null || xdgSessionType == "x11") + { + IntPtr display = XOpenDisplay(null); + string dpiString = Marshal.PtrToStringAnsi(XGetDefault(display, "Xft", "dpi")); + if (dpiString == null || !double.TryParse(dpiString, NumberStyles.Any, CultureInfo.InvariantCulture, out userDpiScale)) + { + userDpiScale = (double)XDisplayWidth(display, 0) * 25.4 / (double)XDisplayWidthMM(display, 0); + } + XCloseDisplay(display); + } + else if (xdgSessionType == "wayland") + { + // TODO + Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: Wayland not yet supported"); + } + else + { + Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: Unrecognised XDG_SESSION_TYPE: {xdgSessionType}"); + } + } + } + catch (Exception e) + { + Logger.Warning?.Print(LogClass.Application, $"Couldn't determine monitor DPI: {e.Message}"); + } + + return userDpiScale; + } + + public static double GetWindowScaleFactor() + { + double userDpiScale = GetActualScaleFactor(); + + return Math.Min(userDpiScale / _standardDpiScale, _maxScaleFactor); + } + } +} diff --git a/Ryujinx.Common/SystemInterop/GdiPlusHelper.cs b/Ryujinx.Common/SystemInterop/GdiPlusHelper.cs new file mode 100644 index 00000000..1001424d --- /dev/null +++ b/Ryujinx.Common/SystemInterop/GdiPlusHelper.cs @@ -0,0 +1,76 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +namespace Ryujinx.Common.SystemInterop +{ + [SupportedOSPlatform("windows")] + public static partial class GdiPlusHelper + { + private const string LibraryName = "gdiplus.dll"; + + private static readonly IntPtr _initToken; + + static GdiPlusHelper() + { + CheckStatus(GdiplusStartup(out _initToken, StartupInputEx.Default, out _)); + } + + private static void CheckStatus(int gdiStatus) + { + if (gdiStatus != 0) + { + throw new Exception($"GDI Status Error: {gdiStatus}"); + } + } + + private struct StartupInputEx + { + public int GdiplusVersion; + +#pragma warning disable CS0649 + public IntPtr DebugEventCallback; + public int SuppressBackgroundThread; + public int SuppressExternalCodecs; + public int StartupParameters; +#pragma warning restore CS0649 + + public static StartupInputEx Default => new StartupInputEx + { + // We assume Windows 8 and upper + GdiplusVersion = 2, + DebugEventCallback = IntPtr.Zero, + SuppressBackgroundThread = 0, + SuppressExternalCodecs = 0, + StartupParameters = 0, + }; + } + + private struct StartupOutput + { + public IntPtr NotificationHook; + public IntPtr NotificationUnhook; + } + + [LibraryImport(LibraryName)] + private static partial int GdiplusStartup(out IntPtr token, in StartupInputEx input, out StartupOutput output); + + [LibraryImport(LibraryName)] + private static partial int GdipCreateFromHWND(IntPtr hwnd, out IntPtr graphics); + + [LibraryImport(LibraryName)] + private static partial int GdipDeleteGraphics(IntPtr graphics); + + [LibraryImport(LibraryName)] + private static partial int GdipGetDpiX(IntPtr graphics, out float dpi); + + public static float GetDpiX(IntPtr hwnd) + { + CheckStatus(GdipCreateFromHWND(hwnd, out IntPtr graphicsHandle)); + CheckStatus(GdipGetDpiX(graphicsHandle, out float result)); + CheckStatus(GdipDeleteGraphics(graphicsHandle)); + + return result; + } + } +} diff --git a/Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs b/Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs new file mode 100644 index 00000000..a4fbf0bd --- /dev/null +++ b/Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs @@ -0,0 +1,114 @@ +using Ryujinx.Common.Logging; +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +namespace Ryujinx.Common.SystemInterop +{ + /// + /// Handle Windows Multimedia timer resolution. + /// + [SupportedOSPlatform("windows")] + public partial class WindowsMultimediaTimerResolution : IDisposable + { + [StructLayout(LayoutKind.Sequential)] + public struct TimeCaps + { + public uint wPeriodMin; + public uint wPeriodMax; + }; + + [LibraryImport("winmm.dll", EntryPoint = "timeGetDevCaps", SetLastError = true)] + private static partial uint TimeGetDevCaps(ref TimeCaps timeCaps, uint sizeTimeCaps); + + [LibraryImport("winmm.dll", EntryPoint = "timeBeginPeriod")] + private static partial uint TimeBeginPeriod(uint uMilliseconds); + + [LibraryImport("winmm.dll", EntryPoint = "timeEndPeriod")] + private static partial uint TimeEndPeriod(uint uMilliseconds); + + private uint _targetResolutionInMilliseconds; + private bool _isActive; + + /// + /// Create a new and activate the given resolution. + /// + /// + public WindowsMultimediaTimerResolution(uint targetResolutionInMilliseconds) + { + _targetResolutionInMilliseconds = targetResolutionInMilliseconds; + + EnsureResolutionSupport(); + Activate(); + } + + private void EnsureResolutionSupport() + { + TimeCaps timeCaps = default; + + uint result = TimeGetDevCaps(ref timeCaps, (uint)Unsafe.SizeOf()); + + if (result != 0) + { + Logger.Notice.Print(LogClass.Application, $"timeGetDevCaps failed with result: {result}"); + } + else + { + uint supportedTargetResolutionInMilliseconds = Math.Min(Math.Max(timeCaps.wPeriodMin, _targetResolutionInMilliseconds), timeCaps.wPeriodMax); + + if (supportedTargetResolutionInMilliseconds != _targetResolutionInMilliseconds) + { + Logger.Notice.Print(LogClass.Application, $"Target resolution isn't supported by OS, using closest resolution: {supportedTargetResolutionInMilliseconds}ms"); + + _targetResolutionInMilliseconds = supportedTargetResolutionInMilliseconds; + } + } + } + + private void Activate() + { + uint result = TimeBeginPeriod(_targetResolutionInMilliseconds); + + if (result != 0) + { + Logger.Notice.Print(LogClass.Application, $"timeBeginPeriod failed with result: {result}"); + } + else + { + _isActive = true; + } + } + + private void Disable() + { + if (_isActive) + { + uint result = TimeEndPeriod(_targetResolutionInMilliseconds); + + if (result != 0) + { + Logger.Notice.Print(LogClass.Application, $"timeEndPeriod failed with result: {result}"); + } + else + { + _isActive = false; + } + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + Disable(); + } + } + } +} \ No newline at end of file diff --git a/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs b/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs index 9bf71778..d173a412 100644 --- a/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs +++ b/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { - static class FFmpegApi + static partial class FFmpegApi { public const string AvCodecLibraryName = "avcodec"; public const string AvUtilLibraryName = "avutil"; @@ -78,52 +78,52 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native public unsafe delegate void av_log_set_callback_callback(void* a0, AVLog level, [MarshalAs(UnmanagedType.LPUTF8Str)] string a2, byte* a3); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern AVFrame* av_frame_alloc(); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial AVFrame* av_frame_alloc(); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_frame_unref(AVFrame* frame); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial void av_frame_unref(AVFrame* frame); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_free(AVFrame* frame); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial void av_free(AVFrame* frame); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_log_set_level(AVLog level); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial void av_log_set_level(AVLog level); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_log_set_callback(av_log_set_callback_callback callback); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial void av_log_set_callback(av_log_set_callback_callback callback); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern AVLog av_log_get_level(); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial AVLog av_log_get_level(); - [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_log_format_line(void* ptr, AVLog level, [MarshalAs(UnmanagedType.LPUTF8Str)] string fmt, byte* vl, byte* line, int lineSize, int* printPrefix); + [LibraryImport(AvUtilLibraryName)] + internal static unsafe partial void av_log_format_line(void* ptr, AVLog level, [MarshalAs(UnmanagedType.LPUTF8Str)] string fmt, byte* vl, byte* line, int lineSize, int* printPrefix); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern AVCodec* avcodec_find_decoder(AVCodecID id); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial AVCodec* avcodec_find_decoder(AVCodecID id); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern AVCodecContext* avcodec_alloc_context3(AVCodec* codec); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial AVCodecContext* avcodec_alloc_context3(AVCodec* codec); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern int avcodec_open2(AVCodecContext* avctx, AVCodec* codec, void **options); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial int avcodec_open2(AVCodecContext* avctx, AVCodec* codec, void **options); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern int avcodec_close(AVCodecContext* avctx); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial int avcodec_close(AVCodecContext* avctx); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void avcodec_free_context(AVCodecContext** avctx); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial void avcodec_free_context(AVCodecContext** avctx); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern AVPacket* av_packet_alloc(); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial AVPacket* av_packet_alloc(); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_packet_unref(AVPacket* pkt); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial void av_packet_unref(AVPacket* pkt); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern void av_packet_free(AVPacket** pkt); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial void av_packet_free(AVPacket** pkt); - [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)] - internal static unsafe extern int avcodec_version(); + [LibraryImport(AvCodecLibraryName)] + internal static unsafe partial int avcodec_version(); } } diff --git a/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs b/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs index 7cc39708..96354946 100644 --- a/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs +++ b/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs @@ -5,7 +5,7 @@ using System.Runtime.Versioning; namespace Ryujinx.Graphics.OpenGL.Helper { [SupportedOSPlatform("linux")] - internal static class GLXHelper + internal static partial class GLXHelper { private const string LibraryName = "glx.dll"; @@ -30,7 +30,7 @@ namespace Ryujinx.Graphics.OpenGL.Helper }); } - [DllImport(LibraryName, EntryPoint = "glXGetCurrentContext")] - public static extern IntPtr GetCurrentContext(); + [LibraryImport(LibraryName, EntryPoint = "glXGetCurrentContext")] + public static partial IntPtr GetCurrentContext(); } } diff --git a/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs b/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs index b37134eb..df497ae2 100644 --- a/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs +++ b/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs @@ -5,11 +5,11 @@ using System.Runtime.Versioning; namespace Ryujinx.Graphics.OpenGL.Helper { [SupportedOSPlatform("windows")] - internal static class WGLHelper + internal static partial class WGLHelper { private const string LibraryName = "OPENGL32.DLL"; - [DllImport(LibraryName, EntryPoint = "wglGetCurrentContext")] - public extern static IntPtr GetCurrentContext(); + [LibraryImport(LibraryName, EntryPoint = "wglGetCurrentContext")] + public static partial IntPtr GetCurrentContext(); } } diff --git a/Ryujinx.Headless.SDL2/Program.cs b/Ryujinx.Headless.SDL2/Program.cs index 50a90763..9a082b6d 100644 --- a/Ryujinx.Headless.SDL2/Program.cs +++ b/Ryujinx.Headless.SDL2/Program.cs @@ -10,7 +10,7 @@ using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Controller.Motion; using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; -using Ryujinx.Common.System; +using Ryujinx.Common.SystemInterop; using Ryujinx.Common.Utilities; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; diff --git a/Ryujinx.Memory/MemoryManagerUnixHelper.cs b/Ryujinx.Memory/MemoryManagerUnixHelper.cs index dd31c328..87a81a79 100644 --- a/Ryujinx.Memory/MemoryManagerUnixHelper.cs +++ b/Ryujinx.Memory/MemoryManagerUnixHelper.cs @@ -3,7 +3,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.Memory { - public static class MemoryManagerUnixHelper + public static partial class MemoryManagerUnixHelper { [Flags] public enum MmapProts : uint @@ -51,38 +51,38 @@ namespace Ryujinx.Memory public const int MADV_DONTNEED = 4; public const int MADV_REMOVE = 9; - [DllImport("libc", EntryPoint = "mmap", SetLastError = true)] - private static extern IntPtr Internal_mmap(IntPtr address, ulong length, MmapProts prot, int flags, int fd, long offset); + [LibraryImport("libc", EntryPoint = "mmap", SetLastError = true)] + private static partial IntPtr Internal_mmap(IntPtr address, ulong length, MmapProts prot, int flags, int fd, long offset); - [DllImport("libc", SetLastError = true)] - public static extern int mprotect(IntPtr address, ulong length, MmapProts prot); + [LibraryImport("libc", SetLastError = true)] + public static partial int mprotect(IntPtr address, ulong length, MmapProts prot); - [DllImport("libc", SetLastError = true)] - public static extern int munmap(IntPtr address, ulong length); + [LibraryImport("libc", SetLastError = true)] + public static partial int munmap(IntPtr address, ulong length); - [DllImport("libc", SetLastError = true)] - public static extern IntPtr mremap(IntPtr old_address, ulong old_size, ulong new_size, int flags, IntPtr new_address); + [LibraryImport("libc", SetLastError = true)] + public static partial IntPtr mremap(IntPtr old_address, ulong old_size, ulong new_size, int flags, IntPtr new_address); - [DllImport("libc", SetLastError = true)] - public static extern int madvise(IntPtr address, ulong size, int advice); + [LibraryImport("libc", SetLastError = true)] + public static partial int madvise(IntPtr address, ulong size, int advice); - [DllImport("libc", SetLastError = true)] - public static extern int mkstemp(IntPtr template); + [LibraryImport("libc", SetLastError = true)] + public static partial int mkstemp(IntPtr template); - [DllImport("libc", SetLastError = true)] - public static extern int unlink(IntPtr pathname); + [LibraryImport("libc", SetLastError = true)] + public static partial int unlink(IntPtr pathname); - [DllImport("libc", SetLastError = true)] - public static extern int ftruncate(int fildes, IntPtr length); + [LibraryImport("libc", SetLastError = true)] + public static partial int ftruncate(int fildes, IntPtr length); - [DllImport("libc", SetLastError = true)] - public static extern int close(int fd); + [LibraryImport("libc", SetLastError = true)] + public static partial int close(int fd); - [DllImport("libc", SetLastError = true)] - public static extern int shm_open(IntPtr name, int oflag, uint mode); + [LibraryImport("libc", SetLastError = true)] + public static partial int shm_open(IntPtr name, int oflag, uint mode); - [DllImport("libc", SetLastError = true)] - public static extern int shm_unlink(IntPtr name); + [LibraryImport("libc", SetLastError = true)] + public static partial int shm_unlink(IntPtr name); private static int MmapFlagsToSystemFlags(MmapFlags flags) { diff --git a/Ryujinx.Memory/WindowsShared/WindowsApi.cs b/Ryujinx.Memory/WindowsShared/WindowsApi.cs index cbb7d99e..67e704ea 100644 --- a/Ryujinx.Memory/WindowsShared/WindowsApi.cs +++ b/Ryujinx.Memory/WindowsShared/WindowsApi.cs @@ -3,20 +3,20 @@ using System.Runtime.InteropServices; namespace Ryujinx.Memory.WindowsShared { - static class WindowsApi + static partial class WindowsApi { public static readonly IntPtr InvalidHandleValue = new IntPtr(-1); public static readonly IntPtr CurrentProcessHandle = new IntPtr(-1); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr VirtualAlloc( + [LibraryImport("kernel32.dll", SetLastError = true)] + public static partial IntPtr VirtualAlloc( IntPtr lpAddress, IntPtr dwSize, AllocationType flAllocationType, MemoryProtection flProtect); - [DllImport("KernelBase.dll", SetLastError = true)] - public static extern IntPtr VirtualAlloc2( + [LibraryImport("KernelBase.dll", SetLastError = true)] + public static partial IntPtr VirtualAlloc2( IntPtr process, IntPtr lpAddress, IntPtr dwSize, @@ -25,18 +25,20 @@ namespace Ryujinx.Memory.WindowsShared IntPtr extendedParameters, ulong parameterCount); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool VirtualProtect( + [LibraryImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static partial bool VirtualProtect( IntPtr lpAddress, IntPtr dwSize, MemoryProtection flNewProtect, out MemoryProtection lpflOldProtect); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool VirtualFree(IntPtr lpAddress, IntPtr dwSize, AllocationType dwFreeType); + [LibraryImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static partial bool VirtualFree(IntPtr lpAddress, IntPtr dwSize, AllocationType dwFreeType); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr CreateFileMapping( + [LibraryImport("kernel32.dll", SetLastError = true, EntryPoint = "CreateFileMappingW")] + public static partial IntPtr CreateFileMapping( IntPtr hFile, IntPtr lpFileMappingAttributes, FileMapProtection flProtect, @@ -44,19 +46,20 @@ namespace Ryujinx.Memory.WindowsShared uint dwMaximumSizeLow, [MarshalAs(UnmanagedType.LPWStr)] string lpName); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool CloseHandle(IntPtr hObject); + [LibraryImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static partial bool CloseHandle(IntPtr hObject); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr MapViewOfFile( + [LibraryImport("kernel32.dll", SetLastError = true)] + public static partial IntPtr MapViewOfFile( IntPtr hFileMappingObject, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, IntPtr dwNumberOfBytesToMap); - [DllImport("KernelBase.dll", SetLastError = true)] - public static extern IntPtr MapViewOfFile3( + [LibraryImport("KernelBase.dll", SetLastError = true)] + public static partial IntPtr MapViewOfFile3( IntPtr hFileMappingObject, IntPtr process, IntPtr baseAddress, @@ -67,17 +70,19 @@ namespace Ryujinx.Memory.WindowsShared IntPtr extendedParameters, ulong parameterCount); - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress); + [LibraryImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static partial bool UnmapViewOfFile(IntPtr lpBaseAddress); - [DllImport("KernelBase.dll", SetLastError = true)] - public static extern bool UnmapViewOfFile2(IntPtr process, IntPtr lpBaseAddress, ulong unmapFlags); + [LibraryImport("KernelBase.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static partial bool UnmapViewOfFile2(IntPtr process, IntPtr lpBaseAddress, ulong unmapFlags); - [DllImport("kernel32.dll")] - public static extern uint GetLastError(); + [LibraryImport("kernel32.dll")] + public static partial uint GetLastError(); - [DllImport("kernel32.dll")] - public static extern int GetCurrentThreadId(); + [LibraryImport("kernel32.dll")] + public static partial int GetCurrentThreadId(); public static MemoryProtection GetProtection(MemoryPermission permission) { diff --git a/Ryujinx.Tests.Unicorn/Native/Interface.cs b/Ryujinx.Tests.Unicorn/Native/Interface.cs index 889441ab..4e34ee8b 100644 --- a/Ryujinx.Tests.Unicorn/Native/Interface.cs +++ b/Ryujinx.Tests.Unicorn/Native/Interface.cs @@ -3,11 +3,12 @@ using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Ryujinx.Tests.Unicorn.Native { - public static class Interface + public static partial class Interface { public static bool IsUnicornAvailable { get; private set; } = true; @@ -58,43 +59,43 @@ namespace Ryujinx.Tests.Unicorn.Native } } - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern uint uc_version(out uint major, out uint minor); + [LibraryImport("unicorn")] + public static partial uint uc_version(out uint major, out uint minor); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_open(Arch arch, Mode mode, out IntPtr uc); + [LibraryImport("unicorn")] + public static partial Error uc_open(Arch arch, Mode mode, out IntPtr uc); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_close(IntPtr uc); + [LibraryImport("unicorn")] + public static partial Error uc_close(IntPtr uc); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr uc_strerror(Error err); + [LibraryImport("unicorn")] + public static partial IntPtr uc_strerror(Error err); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_reg_write(IntPtr uc, int regid, byte[] value); + [LibraryImport("unicorn")] + public static partial Error uc_reg_write(IntPtr uc, int regid, byte[] value); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_reg_read(IntPtr uc, int regid, byte[] value); + [LibraryImport("unicorn")] + public static partial Error uc_reg_read(IntPtr uc, int regid, byte[] value); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_mem_write(IntPtr uc, ulong address, byte[] bytes, ulong size); + [LibraryImport("unicorn")] + public static partial Error uc_mem_write(IntPtr uc, ulong address, byte[] bytes, ulong size); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_mem_read(IntPtr uc, ulong address, byte[] bytes, ulong size); + [LibraryImport("unicorn")] + public static partial Error uc_mem_read(IntPtr uc, ulong address, byte[] bytes, ulong size); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_emu_start(IntPtr uc, ulong begin, ulong until, ulong timeout, ulong count); + [LibraryImport("unicorn")] + public static partial Error uc_emu_start(IntPtr uc, ulong begin, ulong until, ulong timeout, ulong count); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_mem_map(IntPtr uc, ulong address, ulong size, uint perms); + [LibraryImport("unicorn")] + public static partial Error uc_mem_map(IntPtr uc, ulong address, ulong size, uint perms); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_mem_unmap(IntPtr uc, ulong address, ulong size); + [LibraryImport("unicorn")] + public static partial Error uc_mem_unmap(IntPtr uc, ulong address, ulong size); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_mem_protect(IntPtr uc, ulong address, ulong size, uint perms); + [LibraryImport("unicorn")] + public static partial Error uc_mem_protect(IntPtr uc, ulong address, ulong size, uint perms); - [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)] - public static extern Error uc_mem_regions(IntPtr uc, out IntPtr regions, out uint count); + [LibraryImport("unicorn")] + public static partial Error uc_mem_regions(IntPtr uc, out IntPtr regions, out uint count); } } \ No newline at end of file diff --git a/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs b/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs index d85a8121..4eb3b79c 100644 --- a/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs +++ b/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs @@ -5,7 +5,7 @@ using System.Runtime.Versioning; namespace Ryujinx.Ui.Common.Helper { - public static class ConsoleHelper + public static partial class ConsoleHelper { public static bool SetConsoleWindowStateSupported => OperatingSystem.IsWindows(); @@ -39,11 +39,12 @@ namespace Ryujinx.Ui.Common.Helper } [SupportedOSPlatform("windows")] - [DllImport("kernel32")] - static extern IntPtr GetConsoleWindow(); + [LibraryImport("kernel32")] + private static partial IntPtr GetConsoleWindow(); [SupportedOSPlatform("windows")] - [DllImport("user32")] - static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + [LibraryImport("user32")] + [return: MarshalAs(UnmanagedType.Bool)] + private static partial bool ShowWindow(IntPtr hWnd, int nCmdShow); } } \ No newline at end of file diff --git a/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj b/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj index d8696a9c..3a1cd125 100644 --- a/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj +++ b/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj @@ -2,6 +2,7 @@ net7.0 + true diff --git a/Ryujinx/Program.cs b/Ryujinx/Program.cs index 403dde30..e27c4ae9 100644 --- a/Ryujinx/Program.cs +++ b/Ryujinx/Program.cs @@ -4,7 +4,7 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; -using Ryujinx.Common.System; +using Ryujinx.Common.SystemInterop; using Ryujinx.Common.SystemInfo; using Ryujinx.Modules; using Ryujinx.SDL2.Common; @@ -23,7 +23,7 @@ using System.Threading.Tasks; namespace Ryujinx { - class Program + partial class Program { public static double WindowScaleFactor { get; private set; } @@ -35,17 +35,17 @@ namespace Ryujinx private const string X11LibraryName = "libX11"; - [DllImport(X11LibraryName)] - private extern static int XInitThreads(); + [LibraryImport(X11LibraryName)] + private static partial int XInitThreads(); - [DllImport("user32.dll", SetLastError = true)] - public static extern int MessageBoxA(IntPtr hWnd, string text, string caption, uint type); + [LibraryImport("user32.dll", SetLastError = true)] + public static partial int MessageBoxA(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string text, [MarshalAs(UnmanagedType.LPStr)] string caption, uint type); - [DllImport("libc", SetLastError = true)] - static extern int setenv(string name, string value, int overwrite); + [LibraryImport("libc", SetLastError = true)] + private static partial int setenv([MarshalAs(UnmanagedType.LPStr)] string name, [MarshalAs(UnmanagedType.LPStr)] string value, int overwrite); - [DllImport("libc")] - static extern IntPtr getenv(string name); + [LibraryImport("libc")] + private static partial IntPtr getenv([MarshalAs(UnmanagedType.LPStr)] string name); private const uint MB_ICONWARNING = 0x30; diff --git a/Ryujinx/Ui/GLRenderer.cs b/Ryujinx/Ui/GLRenderer.cs index 06d414ed..5804ed18 100644 --- a/Ryujinx/Ui/GLRenderer.cs +++ b/Ryujinx/Ui/GLRenderer.cs @@ -13,7 +13,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.Ui { - public class GlRenderer : RendererWidgetBase + public partial class GlRenderer : RendererWidgetBase { private GraphicsDebugLevel _glLogLevel; @@ -74,14 +74,14 @@ namespace Ryujinx.Ui throw new NotImplementedException(); } - [DllImport("libgdk-3-0.dll")] - private static extern IntPtr gdk_win32_window_get_handle(IntPtr d); + [LibraryImport("libgdk-3-0.dll")] + private static partial IntPtr gdk_win32_window_get_handle(IntPtr d); - [DllImport("libgdk-3.so.0")] - private static extern IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay); + [LibraryImport("libgdk-3.so.0")] + private static partial IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay); - [DllImport("libgdk-3.so.0")] - private static extern IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow); + [LibraryImport("libgdk-3.so.0")] + private static partial IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow); private static FramebufferFormat GetGraphicsMode() { diff --git a/Ryujinx/Ui/Helper/MetalHelper.cs b/Ryujinx/Ui/Helper/MetalHelper.cs index 62ca2930..1e10eb05 100644 --- a/Ryujinx/Ui/Helper/MetalHelper.cs +++ b/Ryujinx/Ui/Helper/MetalHelper.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Ui.Helper public delegate void UpdateBoundsCallbackDelegate(Window window); [SupportedOSPlatform("macos")] - static class MetalHelper + static partial class MetalHelper { private const string LibObjCImport = "/usr/lib/libobjc.A.dylib"; @@ -104,31 +104,31 @@ namespace Ryujinx.Ui.Helper return metalLayer; } - [DllImport(LibObjCImport)] - private static unsafe extern IntPtr sel_registerName(byte* data); + [LibraryImport(LibObjCImport)] + private static unsafe partial IntPtr sel_registerName(byte* data); - [DllImport(LibObjCImport)] - private static unsafe extern IntPtr objc_getClass(byte* data); + [LibraryImport(LibObjCImport)] + private static unsafe partial IntPtr objc_getClass(byte* data); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, byte value); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, byte value); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, NSRect point); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, NSRect point); - [DllImport(LibObjCImport)] - private static extern void objc_msgSend(IntPtr receiver, Selector selector, double value); + [LibraryImport(LibObjCImport)] + private static partial void objc_msgSend(IntPtr receiver, Selector selector, double value); - [DllImport(LibObjCImport, EntryPoint = "objc_msgSend")] - private static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector); + [LibraryImport(LibObjCImport, EntryPoint = "objc_msgSend")] + private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector); - [DllImport("libgdk-3.0.dylib")] - private static extern IntPtr gdk_quartz_window_get_nsview(IntPtr gdkWindow); + [LibraryImport("libgdk-3.0.dylib")] + private static partial IntPtr gdk_quartz_window_get_nsview(IntPtr gdkWindow); } } \ No newline at end of file diff --git a/Ryujinx/Ui/MainWindow.cs b/Ryujinx/Ui/MainWindow.cs index 3a5b7723..0e7e4d62 100644 --- a/Ryujinx/Ui/MainWindow.cs +++ b/Ryujinx/Ui/MainWindow.cs @@ -15,7 +15,7 @@ using Ryujinx.Audio.Integration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; -using Ryujinx.Common.System; +using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.OpenGL; diff --git a/Ryujinx/Ui/VKRenderer.cs b/Ryujinx/Ui/VKRenderer.cs index 63d0d0a6..e49b30c3 100644 --- a/Ryujinx/Ui/VKRenderer.cs +++ b/Ryujinx/Ui/VKRenderer.cs @@ -12,7 +12,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.Ui { - public class VKRenderer : RendererWidgetBase + public partial class VKRenderer : RendererWidgetBase { public NativeWindowBase NativeWindow { get; private set; } private UpdateBoundsCallbackDelegate _updateBoundsCallback; @@ -44,14 +44,14 @@ namespace Ryujinx.Ui throw new NotImplementedException(); } - [DllImport("libgdk-3-0.dll")] - private static extern IntPtr gdk_win32_window_get_handle(IntPtr d); + [LibraryImport("libgdk-3-0.dll")] + private static partial IntPtr gdk_win32_window_get_handle(IntPtr d); - [DllImport("libgdk-3.so.0")] - private static extern IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay); + [LibraryImport("libgdk-3.so.0")] + private static partial IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay); - [DllImport("libgdk-3.so.0")] - private static extern IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow); + [LibraryImport("libgdk-3.so.0")] + private static partial IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow); protected override bool OnConfigureEvent(EventConfigure evnt) { -- cgit v1.2.3