diff --git a/Directory.Packages.props b/Directory.Packages.props index 44f9b5d40..40275763b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,15 +33,15 @@ - + - - - + + + diff --git a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj index f5830e149..649ef8227 100644 --- a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj +++ b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj @@ -8,7 +8,7 @@ /* Begin PBXBuildFile section */ 4E80AA212CD705DD00029585 /* SDL in Frameworks */ = {isa = PBXBuildFile; productRef = 4E80AA202CD705DD00029585 /* SDL */; }; - 4E80AA632CD7122800029585 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E80AA622CD7122800029585 /* GameController.framework */; }; + CA5941A82CE3142E00C2BC10 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E80AA622CD7122800029585 /* GameController.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -104,7 +104,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4E80AA632CD7122800029585 /* GameController.framework in Frameworks */, + CA5941A82CE3142E00C2BC10 /* GameController.framework in Frameworks */, 4E80AA212CD705DD00029585 /* SDL in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -485,6 +485,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 = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; @@ -525,6 +529,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 = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; diff --git a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/brandon.xcuserdatad/UserInterfaceState.xcuserstate b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/brandon.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 000000000..93454cd76 Binary files /dev/null and b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/brandon.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/src/MeloNX/MeloNX/Views/ContentView.swift b/src/MeloNX/MeloNX/Views/ContentView.swift index 0c09b0f00..60f0525f4 100644 --- a/src/MeloNX/MeloNX/Views/ContentView.swift +++ b/src/MeloNX/MeloNX/Views/ContentView.swift @@ -54,12 +54,9 @@ struct ContentView: View { } func start(displayid: UInt32) { - setupVirtualController() - if theWindow == nil { - // Ensure theWindow is set - theWindow = UIApplication.shared.windows.first - } + + let config = Ryujinx.Configuration( gamepath: game!.path, @@ -72,9 +69,19 @@ struct ContentView: View { inputids: ["1-47150005-05ac-0000-0100-00004f066d01"], ryufullscreen: true ) + + // Start the emulation do { + if theWindow == nil { + // Ensure theWindow is set + theWindow = UIApplication.shared.windows.first + } + setupVirtualController() + try Ryujinx().start(with: config) + + } catch { print("Error \(error.localizedDescription)") } diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs index 846dd5c7d..dddd16e13 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs @@ -48,32 +48,58 @@ namespace Ryujinx.Graphics.Vulkan } public unsafe void UpdateBuffers(int setIndex, int baseBinding, ReadOnlySpan bufferInfo, DescriptorType type) +{ + + // DEBUG: Validate inputs + if (bufferInfo.Length == 0) + { + Console.WriteLine("bufferInfo is empty."); + return; + } + + // DEBUG: Check if _descriptorSets and _holder.Device are properly initialized + if (_descriptorSets == null || _descriptorSets.Length <= setIndex) + { + throw new Exception("Descriptor set at the specified index is null or out of range."); + } + + if (_holder?.Device == null) + { + throw new Exception("_holder.Device is null or uninitialized."); + } + + // DEBUG: Check each DescriptorBufferInfo in the span + foreach (var info in bufferInfo) + { + if (info.Buffer.Handle == 0) { - if (bufferInfo.Length == 0) - { - return; - } - - fixed (DescriptorBufferInfo* pBufferInfo = bufferInfo) - { - var writeDescriptorSet = new WriteDescriptorSet - { - SType = StructureType.WriteDescriptorSet, - DstSet = _descriptorSets[setIndex], - DstBinding = (uint)baseBinding, - DescriptorType = type, - DescriptorCount = (uint)bufferInfo.Length, - PBufferInfo = pBufferInfo, - }; - - _holder.Api.UpdateDescriptorSets(_holder.Device, 1, writeDescriptorSet, 0, null); - } + throw new Exception("One of the buffers in bufferInfo is null or uninitialized."); } + } + + // Proceed if all checks pass + fixed (DescriptorBufferInfo* pBufferInfo = bufferInfo) + { + var writeDescriptorSet = new WriteDescriptorSet + { + SType = StructureType.WriteDescriptorSet, + DstSet = _descriptorSets[setIndex], + DstBinding = (uint)baseBinding, + DescriptorType = type, + DescriptorCount = (uint)bufferInfo.Length, + PBufferInfo = pBufferInfo + }; + + // Update descriptor sets + _holder.Api.UpdateDescriptorSets(_holder.Device, 1, writeDescriptorSet, 0, null); + } +} public unsafe void UpdateImage(int setIndex, int bindingIndex, DescriptorImageInfo imageInfo, DescriptorType type) { if (imageInfo.ImageView.Handle != 0UL) { + var writeDescriptorSet = new WriteDescriptorSet { SType = StructureType.WriteDescriptorSet, @@ -90,11 +116,22 @@ namespace Ryujinx.Graphics.Vulkan public unsafe void UpdateImages(int setIndex, int baseBinding, ReadOnlySpan imageInfo, DescriptorType type) { + + // DEBUG: Check if imageInfo is Empty if (imageInfo.Length == 0) { + + Console.WriteLine("Error: imageInfo is empty."); return; } + // DEBUG: Check the values inside imageInfo + foreach (var info in imageInfo) + { + Console.WriteLine($"Buffer Handle: {info.ImageView.Handle}"); + } + + fixed (DescriptorImageInfo* pImageInfo = imageInfo) { var writeDescriptorSet = new WriteDescriptorSet @@ -107,6 +144,8 @@ namespace Ryujinx.Graphics.Vulkan PImageInfo = pImageInfo, }; + + _holder.Api.UpdateDescriptorSets(_holder.Device, 1, writeDescriptorSet, 0, null); } } diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs index e0fe5d89a..0c52fa36b 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs @@ -110,7 +110,7 @@ namespace Ryujinx.Graphics.Vulkan _textures.AsSpan().Fill(initialImageInfo); _images.AsSpan().Fill(initialImageInfo); - if (gd.Capabilities.SupportsNullDescriptors) + if (gd.Capabilities.SupportsNullDescriptors && !OperatingSystem.IsIOS()) { // If null descriptors are supported, we can pass null as the handle. _dummyBuffer = null;