diff --git a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj index 4bec9c929..e4e5a333e 100644 --- a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj +++ b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj @@ -633,6 +633,7 @@ "$(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 = fast; GENERATE_INFOPLIST_FILE = YES; @@ -801,6 +802,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", ); MARKETING_VERSION = 0.0.8; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; @@ -839,6 +844,7 @@ "$(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 = fast; GENERATE_INFOPLIST_FILE = YES; @@ -1007,6 +1013,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", ); MARKETING_VERSION = 0.0.8; 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 6b053020b..16f134cc7 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.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 819c90e35..bf8cccbc8 100644 --- a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "MeloNX/Views/GamesList/GameListView.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "271" - endingLineNumber = "271" + startingLineNumber = "309" + endingLineNumber = "309" landmarkName = "loadGames()" landmarkType = "7"> diff --git a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist index 8ff6cf524..62375ba69 100644 --- a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,12 +12,12 @@ Ryujinx.xcscheme_^#shared#^_ orderHint - 2 + 1 com.Stossy11.MeloNX.RyujinxAg.xcscheme_^#shared#^_ orderHint - 1 + 2 SuppressBuildableAutocreation diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/libMoltenVK.dylib b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/libMoltenVK.dylib index 7e3092cd5..912e12d22 100755 Binary files a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/libMoltenVK.dylib and b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/libMoltenVK.dylib differ diff --git a/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/Info.plist b/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/Info.plist index 2e0914e03..19c99be01 100644 Binary files a/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/Info.plist and b/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/Info.plist differ diff --git a/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/MoltenVK b/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/MoltenVK index 7e3092cd5..912e12d22 100755 Binary files a/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/MoltenVK and b/src/MeloNX/MeloNX/Dependencies/XCFrameworks/MoltenVK.xcframework/ios-arm64/MoltenVK.framework/MoltenVK differ diff --git a/src/MeloNX/MeloNX/Views/ContentView.swift b/src/MeloNX/MeloNX/Views/ContentView.swift index 4b0b12f44..f91f38dd5 100644 --- a/src/MeloNX/MeloNX/Views/ContentView.swift +++ b/src/MeloNX/MeloNX/Views/ContentView.swift @@ -23,17 +23,17 @@ struct ContentView: View { // MARK: - Properties @State private var theWindow: UIWindow? @State private var virtualController: GCVirtualController? - @State private var game: URL? + @State private var game: Game? @State private var controllersList: [Controller] = [] @State private var currentControllers: [Controller] = [] @State private var config: Ryujinx.Configuration - @State private var settings: [MoltenVKSettings] + @State var settings: [MoltenVKSettings] @AppStorage("useTrollStore") var useTrollStore: Bool = false @State private var isVirtualControllerActive: Bool = false @AppStorage("isVirtualController") var isVCA: Bool = true @State var onscreencontroller: Controller = Controller(id: "", name: "") @AppStorage("JIT") var isJITEnabled: Bool = false - + @State var isMK8: Bool = false @AppStorage("quit") var quit: Bool = false @State var quits: Bool = false @@ -180,8 +180,18 @@ struct ContentView: View { private func start(displayid: UInt32) { guard let game else { return } - config.gamepath = game.path + config.gamepath = game.fileURL.path config.inputids = Array(Set(currentControllers.map(\.id))) + var setting: MoltenVKSettings + + if game.titleName.lowercased() != "super mario odyssey" { + setting = (MoltenVKSettings(string: "MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS", value: "0")) + } else { + setting = (MoltenVKSettings(string: "MVK_CONFIG_SYNCHRONOUS_QUEUE_SUBMITS", value: "2")) + } + setenv(setting.string, setting.value, 1) + + if config.inputids.isEmpty { config.inputids.append("0") diff --git a/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift b/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift index 9f888cd4c..917a7ee9e 100644 --- a/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift +++ b/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift @@ -10,7 +10,7 @@ import UniformTypeIdentifiers struct GameLibraryView: View { - @Binding var startemu: URL? + @Binding var startemu: Game? @State private var games: [Game] = [] @State private var searchText = "" @State private var isSearching = false @@ -72,7 +72,7 @@ struct GameLibraryView: View { RecentGameCard(game: game, startemu: $startemu) .onTapGesture { addToRecentGames(game) - startemu = game.fileURL + startemu = game } } } @@ -140,7 +140,9 @@ struct GameLibraryView: View { Button { - self.startemu = URL(string: "MiiMaker") + var game = Game(containerFolder: URL(string: "none")!, fileType: .item, fileURL: URL(string: "MiiMaker")!, titleName: "Mii Maker", titleId: "0", developer: "Nintendo", version: firmwareversion) + + self.startemu = game } label: { Text("Mii Maker") } @@ -206,8 +208,44 @@ struct GameLibraryView: View { } defer { url.stopAccessingSecurityScopedResource() } + do { + let handle = try FileHandle(forReadingFrom: url) + let fileExtension = (url.pathExtension as NSString).utf8String + let extensionPtr = UnsafeMutablePointer(mutating: fileExtension) + + var gameInfo = get_game_info(handle.fileDescriptor, extensionPtr) + + var game = Game(containerFolder: url.deletingLastPathComponent(), fileType: .item, fileURL: url, titleName: "", titleId: "", developer: "", version: "") + + game.titleName = withUnsafePointer(to: &gameInfo.TitleName) { + $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: $0)) { + String(cString: $0) + } + } + + game.developer = withUnsafePointer(to: &gameInfo.Developer) { + $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: $0)) { + String(cString: $0) + } + } + + game.titleId = String(gameInfo.TitleId) + + print(String(gameInfo.TitleId)) + + + game.version = String(gameInfo.Version) + + game.icon = game.createImage(from: gameInfo) + + + DispatchQueue.main.async { + startemu = game + } + } catch { + print(error) + } - startemu = url case .failure(let err): print("File import failed: \(err.localizedDescription)") @@ -342,12 +380,12 @@ extension Game: Codable { struct RecentGameCard: View { let game: Game - @Binding var startemu: URL? + @Binding var startemu: Game? @Environment(\.colorScheme) var colorScheme var body: some View { Button(action: { - startemu = game.fileURL + startemu = game }) { VStack(alignment: .leading, spacing: 8) { if let icon = game.icon { @@ -388,12 +426,12 @@ struct RecentGameCard: View { struct GameListRow: View { let game: Game - @Binding var startemu: URL? + @Binding var startemu: Game? @Environment(\.colorScheme) var colorScheme var body: some View { Button(action: { - startemu = game.fileURL + startemu = game }) { HStack(spacing: 16) { // Game Icon @@ -439,7 +477,7 @@ struct GameListRow: View { .background(Color(.systemBackground)) .contextMenu { Button { - startemu = game.fileURL + startemu = game } label: { Label("Play Now", systemImage: "play.fill") } diff --git a/src/MeloNX/MeloNX/Views/TabView/TabView.swift b/src/MeloNX/MeloNX/Views/TabView/TabView.swift index 21b52e907..ccf7796bc 100644 --- a/src/MeloNX/MeloNX/Views/TabView/TabView.swift +++ b/src/MeloNX/MeloNX/Views/TabView/TabView.swift @@ -10,7 +10,7 @@ import UniformTypeIdentifiers struct MainTabView: View { - @Binding var startemu: URL? + @Binding var startemu: Game? @Binding var config: Ryujinx.Configuration @Binding var MVKconfig: [MoltenVKSettings] @Binding var controllersList: [Controller] diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx.Headless.SDL2/Program.cs index a42b5bc0f..f6f9de017 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx.Headless.SDL2/Program.cs @@ -477,7 +477,8 @@ namespace Ryujinx.Headless.SDL2 ReadControlData(controlFs, controlHolder.ByteSpan); - GetGameInformation(ref controlHolder.Value, out gameInfo.TitleName, out _, out gameInfo.Developer, out gameInfo.Version); + + GetGameInformation(ref controlHolder.Value, out gameInfo.TitleName, out gameInfo.TitleId, out gameInfo.Developer, out gameInfo.Version); // Read the icon from the ControlFS and store it as a byte array try @@ -552,7 +553,7 @@ namespace Ryujinx.Headless.SDL2 // Read the NACP data Read(assetOffset + (int)nacpOffset, (int)nacpSize).AsSpan().CopyTo(controlHolder.ByteSpan); - GetGameInformation(ref controlHolder.Value, out gameInfo.TitleName, out _, out gameInfo.Developer, out gameInfo.Version); + GetGameInformation(ref controlHolder.Value, out gameInfo.TitleName, out gameInfo.TitleId, out gameInfo.Developer, out gameInfo.Version); } } }