diff --git a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj index 721a265a4..184998d30 100644 --- a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj +++ b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj @@ -723,6 +723,10 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); GCC_OPTIMIZATION_LEVEL = z; GENERATE_INFOPLIST_FILE = YES; @@ -877,6 +881,14 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); MARKETING_VERSION = "$(VERSION)"; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; @@ -975,6 +987,10 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); GCC_OPTIMIZATION_LEVEL = z; GENERATE_INFOPLIST_FILE = YES; @@ -1129,6 +1145,14 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); MARKETING_VERSION = "$(VERSION)"; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; diff --git a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate index 0f339968e..dd00f3279 100644 Binary files a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate and b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/src/MeloNX/MeloNX/App/Core/JIT/StikJIT/StikEnableJIT.swift b/src/MeloNX/MeloNX/App/Core/JIT/StikJIT/StikEnableJIT.swift new file mode 100644 index 000000000..25a6806fb --- /dev/null +++ b/src/MeloNX/MeloNX/App/Core/JIT/StikJIT/StikEnableJIT.swift @@ -0,0 +1,36 @@ +// +// EnableJIT.swift +// MeloNX +// +// Created by Stossy11 on 10/02/2025. +// + +import Foundation +import Network +import UIKit + +func enableJITStik() { + let bundleid = Bundle.main.bundleIdentifier ?? "Unknown" + + let address = URL(string: "stikjit://enable-jit?bundle-id=\(bundleid)")! + var request = URLRequest(url: address) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + let task = URLSession.shared.dataTask(with: request) { data, response, error in + if let error = error { + presentAlert(title: "Request Error", message: error.localizedDescription) + return + } + + DispatchQueue.main.async { + if let data = data, let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene { + // JIT, wow + } else { + fatalError("Unable to get Window") + } + } + } + + task.resume() +} diff --git a/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift b/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift index 0ba09df79..6e5555a69 100644 --- a/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift +++ b/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift @@ -184,7 +184,7 @@ class Ryujinx : ObservableObject { } } - thread.qualityOfService = .background + thread.qualityOfService = .userInteractive thread.name = "MeloNX" thread.start() } @@ -274,6 +274,24 @@ class Ryujinx : ObservableObject { // We don't need this. Ryujinx should handle it fine :3 // this also causes crashes in some games :3 + var model = "" + + var systemInfo = utsname() + uname(&systemInfo) + let machineMirror = Mirror(reflecting: systemInfo.machine) + model = machineMirror.children.reduce("") { identifier, element in + guard let value = element.value as? Int8, value != 0 else { return identifier } + return identifier + String(UnicodeScalar(UInt8(value))) + } + + args.append(contentsOf: ["--device-model", model]) + + args.append(contentsOf: ["--device-display-name", UIDevice.modelName]) + + if checkAppEntitlement("com.apple.developer.kernel.increased-memory-limit") { + args.append("--has-memory-entitlement") + } + args.append(contentsOf: ["--system-language", config.language.rawValue]) args.append(contentsOf: ["--system-region", config.regioncode.rawValue]) @@ -525,3 +543,126 @@ class Ryujinx : ObservableObject { } +public extension UIDevice { + static let modelName: String = { + var systemInfo = utsname() + uname(&systemInfo) + let machineMirror = Mirror(reflecting: systemInfo.machine) + let identifier = machineMirror.children.reduce("") { identifier, element in + guard let value = element.value as? Int8, value != 0 else { return identifier } + return identifier + String(UnicodeScalar(UInt8(value))) + } + + func mapToDevice(identifier: String) -> String { // swiftlint:disable:this cyclomatic_complexity + #if os(iOS) + switch identifier { + case "iPod5,1": return "iPod touch (5th generation)" + case "iPod7,1": return "iPod touch (6th generation)" + case "iPod9,1": return "iPod touch (7th generation)" + case "iPhone3,1", "iPhone3,2", "iPhone3,3": return "iPhone 4" + case "iPhone4,1": return "iPhone 4s" + case "iPhone5,1", "iPhone5,2": return "iPhone 5" + case "iPhone5,3", "iPhone5,4": return "iPhone 5c" + case "iPhone6,1", "iPhone6,2": return "iPhone 5s" + case "iPhone7,2": return "iPhone 6" + case "iPhone7,1": return "iPhone 6 Plus" + case "iPhone8,1": return "iPhone 6s" + case "iPhone8,2": return "iPhone 6s Plus" + case "iPhone9,1", "iPhone9,3": return "iPhone 7" + case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" + case "iPhone10,1", "iPhone10,4": return "iPhone 8" + case "iPhone10,2", "iPhone10,5": return "iPhone 8 Plus" + case "iPhone10,3", "iPhone10,6": return "iPhone X" + case "iPhone11,2": return "iPhone XS" + case "iPhone11,4", "iPhone11,6": return "iPhone XS Max" + case "iPhone11,8": return "iPhone XR" + case "iPhone12,1": return "iPhone 11" + case "iPhone12,3": return "iPhone 11 Pro" + case "iPhone12,5": return "iPhone 11 Pro Max" + case "iPhone13,1": return "iPhone 12 mini" + case "iPhone13,2": return "iPhone 12" + case "iPhone13,3": return "iPhone 12 Pro" + case "iPhone13,4": return "iPhone 12 Pro Max" + case "iPhone14,4": return "iPhone 13 mini" + case "iPhone14,5": return "iPhone 13" + case "iPhone14,2": return "iPhone 13 Pro" + case "iPhone14,3": return "iPhone 13 Pro Max" + case "iPhone14,7": return "iPhone 14" + case "iPhone14,8": return "iPhone 14 Plus" + case "iPhone15,2": return "iPhone 14 Pro" + case "iPhone15,3": return "iPhone 14 Pro Max" + case "iPhone15,4": return "iPhone 15" + case "iPhone15,5": return "iPhone 15 Plus" + case "iPhone16,1": return "iPhone 15 Pro" + case "iPhone16,2": return "iPhone 15 Pro Max" + case "iPhone17,3": return "iPhone 16" + case "iPhone17,4": return "iPhone 16 Plus" + case "iPhone17,1": return "iPhone 16 Pro" + case "iPhone17,2": return "iPhone 16 Pro Max" + case "iPhone17,5": return "iPhone 16e" + case "iPhone8,4": return "iPhone SE" + case "iPhone12,8": return "iPhone SE (2nd generation)" + case "iPhone14,6": return "iPhone SE (3rd generation)" + case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4": return "iPad 2" + case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad (3rd generation)" + case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad (4th generation)" + case "iPad6,11", "iPad6,12": return "iPad (5th generation)" + case "iPad7,5", "iPad7,6": return "iPad (6th generation)" + case "iPad7,11", "iPad7,12": return "iPad (7th generation)" + case "iPad11,6", "iPad11,7": return "iPad (8th generation)" + case "iPad12,1", "iPad12,2": return "iPad (9th generation)" + case "iPad13,18", "iPad13,19": return "iPad (10th generation)" + case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" + case "iPad5,3", "iPad5,4": return "iPad Air 2" + case "iPad11,3", "iPad11,4": return "iPad Air (3rd generation)" + case "iPad13,1", "iPad13,2": return "iPad Air (4th generation)" + case "iPad13,16", "iPad13,17": return "iPad Air (5th generation)" + case "iPad14,8", "iPad14,9": return "iPad Air (11-inch) (M2)" + case "iPad14,10", "iPad14,11": return "iPad Air (13-inch) (M2)" + case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad mini" + case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad mini 2" + case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad mini 3" + case "iPad5,1", "iPad5,2": return "iPad mini 4" + case "iPad11,1", "iPad11,2": return "iPad mini (5th generation)" + case "iPad14,1", "iPad14,2": return "iPad mini (6th generation)" + case "iPad16,1", "iPad16,2": return "iPad mini (A17 Pro)" + case "iPad6,3", "iPad6,4": return "iPad Pro (9.7-inch)" + case "iPad7,3", "iPad7,4": return "iPad Pro (10.5-inch)" + case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4": return "iPad Pro (11-inch) (1st generation)" + case "iPad8,9", "iPad8,10": return "iPad Pro (11-inch) (2nd generation)" + case "iPad13,4", "iPad13,5", "iPad13,6", "iPad13,7": return "iPad Pro (11-inch) (3rd generation)" + case "iPad14,3", "iPad14,4": return "iPad Pro (11-inch) (4th generation)" + case "iPad16,3", "iPad16,4": return "iPad Pro (11-inch) (M4)" + case "iPad6,7", "iPad6,8": return "iPad Pro (12.9-inch) (1st generation)" + case "iPad7,1", "iPad7,2": return "iPad Pro (12.9-inch) (2nd generation)" + case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8": return "iPad Pro (12.9-inch) (3rd generation)" + case "iPad8,11", "iPad8,12": return "iPad Pro (12.9-inch) (4th generation)" + case "iPad13,8", "iPad13,9", "iPad13,10", "iPad13,11":return "iPad Pro (12.9-inch) (5th generation)" + case "iPad14,5", "iPad14,6": return "iPad Pro (12.9-inch) (6th generation)" + case "iPad16,5", "iPad16,6": return "iPad Pro (13-inch) (M4)" + case "AppleTV5,3": return "Apple TV" + case "AppleTV6,2": return "Apple TV 4K" + case "AudioAccessory1,1": return "HomePod" + case "AudioAccessory5,1": return "HomePod mini" + case "i386", "x86_64", "arm64": return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"))" + default: return identifier + } + #elseif os(tvOS) + switch identifier { + case "AppleTV5,3": return "Apple TV 4" + case "AppleTV6,2", "AppleTV11,1", "AppleTV14,1": return "Apple TV 4K" + case "i386", "x86_64": return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "tvOS"))" + default: return identifier + } + #elseif os(visionOS) + switch identifier { + case "RealityDevice14,1": return "Apple Vision Pro" + default: return identifier + } + #endif + } + + return mapToDevice(identifier: identifier) + }() + +} diff --git a/src/MeloNX/MeloNX/App/Views/Main/ContentView.swift b/src/MeloNX/MeloNX/App/Views/Main/ContentView.swift index 34fcb32c1..af7cfc31e 100644 --- a/src/MeloNX/MeloNX/App/Views/Main/ContentView.swift +++ b/src/MeloNX/MeloNX/App/Views/Main/ContentView.swift @@ -37,6 +37,7 @@ struct ContentView: View { // JIT @AppStorage("jitStreamerEB") var jitStreamerEB: Bool = false + @AppStorage("stikJIT") var stikJIT: Bool = false // Other Configuration @State var isMK8: Bool = false @@ -377,9 +378,14 @@ struct ContentView: View { private func checkJitStatus() { ryujinx.ryuIsJITEnabled() + if jitStreamerEB { + jitStreamerEB = false // byee jitstreamer eb + } if !ryujinx.jitenabled { if useTrollStore { askForJIT() + } else if stikJIT { + enableJITStik() } else if jitStreamerEB { enableJITEB() } else { diff --git a/src/MeloNX/MeloNX/App/Views/Main/ControllerView/Joystick/Joystick.swift b/src/MeloNX/MeloNX/App/Views/Main/ControllerView/Joystick/Joystick.swift index f7604f8d6..be8b267fa 100644 --- a/src/MeloNX/MeloNX/App/Views/Main/ControllerView/Joystick/Joystick.swift +++ b/src/MeloNX/MeloNX/App/Views/Main/ControllerView/Joystick/Joystick.swift @@ -16,6 +16,8 @@ struct Joystick: View { @State private var offset: CGSize = .zero @Binding var showBackground: Bool + let sensitivity: CGFloat = 1.5 + var dragGesture: some Gesture { DragGesture() .onChanged { value in @@ -34,12 +36,16 @@ struct Joystick: View { let angle = atan2(translation.height, translation.width) offset = CGSize(width: cos(angle) * extendedRadius, height: sin(angle) * extendedRadius) } - position = CGPoint(x: offset.width / extendedRadius, y: offset.height / extendedRadius) + + position = CGPoint( + x: max(-1, min(1, (offset.width / extendedRadius) * sensitivity)), + y: max(-1, min(1, (offset.height / extendedRadius) * sensitivity)) + ) } .onEnded { _ in - offset = .zero // Reset to center + offset = .zero position = .zero - withAnimation(.easeOut) { // Smooth animation when hiding the background + withAnimation(.easeOut) { showBackground = false } } @@ -51,7 +57,6 @@ struct Joystick: View { .fill(Color.clear.opacity(0)) .frame(width: boundarySize, height: boundarySize) - if showBackground { Circle() .fill(Color.gray.opacity(0.4)) diff --git a/src/MeloNX/MeloNX/App/Views/Main/SettingsView/SettingsView.swift b/src/MeloNX/MeloNX/App/Views/Main/SettingsView/SettingsView.swift index 5d288fe07..775358643 100644 --- a/src/MeloNX/MeloNX/App/Views/Main/SettingsView/SettingsView.swift +++ b/src/MeloNX/MeloNX/App/Views/Main/SettingsView/SettingsView.swift @@ -19,6 +19,7 @@ struct SettingsView: View { @AppStorage("useTrollStore") var useTrollStore: Bool = false @AppStorage("jitStreamerEB") var jitStreamerEB: Bool = false + @AppStorage("stikJIT") var stikJIT: Bool = false @AppStorage("ignoreJIT") var ignoreJIT: Bool = false @@ -457,6 +458,8 @@ struct SettingsView: View { .tint(.blue) if #available(iOS 17.0.1, *) { + // You will stay in our hearts, JitStreamer EB. one of the first public JIT enablers, that didn't need a computer after initial install + /* Toggle(isOn: $jitStreamerEB) { labelWithIcon("JitStreamer EB", iconName: "bolt.heart") } @@ -493,6 +496,32 @@ struct SettingsView: View { Text("About") } } + */ + + Toggle(isOn: $stikJIT) { + labelWithIcon("StikJIT", iconName: "bolt.heart") + } + .tint(.blue) + .contextMenu { + Button { + if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let mainWindow = windowScene.windows.last { + let alertController = UIAlertController(title: "About StikJIT", message: "StikJIT is a really amazing iOS Application to Enable JIT on the go on-device, made by the best, most kind, helpful and nice developers of all time jkcoxson and Blu <3", preferredStyle: .alert) + + let learnMoreButton = UIAlertAction(title: "Learn More", style: .default) {_ in + UIApplication.shared.open(URL(string: "https://github.com/0-Blu/StikJIT")!) + } + alertController.addAction(learnMoreButton) + + let doneButton = UIAlertAction(title: "Done", style: .cancel, handler: nil) + alertController.addAction(doneButton) + + mainWindow.rootViewController?.present(alertController, animated: true) + } + } label: { + Text("About") + } + } } else { Toggle(isOn: $useTrollStore) { labelWithIcon("TrollStore JIT", iconName: "troll.svg") @@ -554,9 +583,6 @@ struct SettingsView: View { Section { let totalMemory = ProcessInfo.processInfo.physicalMemory let model = getDeviceModel() - let deviceType = model.hasPrefix("iPad") ? "iPadOS" : - model.hasPrefix("iPhone") ? "iOS" : - "macOS" let iconName = model.hasPrefix("iPad") ? "ipad.landscape" : model.hasPrefix("iPhone") ? "iphone" : @@ -570,7 +596,7 @@ struct SettingsView: View { labelWithIcon("Increased Memory Limit Entitlement: \(checkAppEntitlement("com.apple.developer.kernel.increased-memory-limit") ? "Enabled" : "Disabled")", iconName: "memorychip") - labelWithIcon("Device: \(getDeviceModel())", iconName: iconName) + labelWithIcon("Device: \(UIDevice.modelName)", iconName: iconName) if ProcessInfo.processInfo.isiOSAppOnMac { labelWithIcon("Memory: \(String(format: "%.0f GB", Double(totalMemory) / (1024 * 1024 * 1024)))", iconName: "memorychip.fill") @@ -578,7 +604,8 @@ struct SettingsView: View { labelWithIcon("Device Memory: \(String(format: "%.0f GB", Double(totalMemory) / 1_000_000_000))", iconName: "memorychip.fill") } - labelWithIcon("\(deviceType) \(UIDevice.current.systemVersion)", iconName: "applelogo") + + labelWithIcon("\(UIDevice.current.systemName) \(UIDevice.current.systemVersion)", iconName: "applelogo") } header: { Text("Information") diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs b/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs index 5a76bb291..63dce4c3d 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache class NoWxCache : IDisposable { private const int CodeAlignment = 4; // Bytes. - private const int SharedCacheSize = 2047 * 1024 * 1024; + private const int SharedCacheSize = 512 * 1024 * 1024; private const int LocalCacheSize = 128 * 1024 * 1024; // How many calls to the same function we allow until we pad the shared cache to force the function to become available there diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx.Headless.SDL2/Options.cs index 8dfe33a63..2707328b4 100644 --- a/src/Ryujinx.Headless.SDL2/Options.cs +++ b/src/Ryujinx.Headless.SDL2/Options.cs @@ -29,6 +29,17 @@ namespace Ryujinx.Headless.SDL2 [Option("exclusive-fullscreen-height", Required = false, Default = 1080, HelpText = "Set vertical resolution for exclusive fullscreen mode.")] public int ExclusiveFullscreenHeight { get; set; } + // Host Information + + [Option("device-model", Required = false, HelpText = "Set the current iDevice Model")] + public string DeviceModel { get; set; } + + [Option("has-memory-entitlement", Required = false, HelpText = "If the increased memory entitlement exists.")] + public bool MemoryEnt { get; set; } + + [Option("device-display-name", Required = false, HelpText = "Set the current iDevice display name.")] + public string DisplayName { get; set; } + // Input [Option("correct-controller", Required = false, Default = false, HelpText = "Makes the on-screen controller (iOS) buttons correspond to what they show.")] diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx.Headless.SDL2/Program.cs index f99547296..0387d40f0 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx.Headless.SDL2/Program.cs @@ -266,7 +266,6 @@ namespace Ryujinx.Headless.SDL2 [UnmanagedCallersOnly(EntryPoint = "initialize")] public static unsafe void Initialize() { - AppDataManager.Initialize(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); if (_virtualFileSystem == null) @@ -1154,6 +1153,11 @@ namespace Ryujinx.Headless.SDL2 _inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver()); } + if (OperatingSystem.IsIOS()) { + Logger.Info?.Print(LogClass.Application, $"Current Device: {option.DisplayName} ({option.DeviceModel}) {Environment.OSVersion.Version}"); + Logger.Info?.Print(LogClass.Application, $"Increased Memory Limit: {option.MemoryEnt}"); + } + GraphicsConfig.EnableShaderCache = true; if (OperatingSystem.IsMacOS() || OperatingSystem.IsIOS())