diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py index 18b84399f..5d9321860 100644 --- a/distribution/macos/construct_universal_dylib.py +++ b/distribution/macos/construct_universal_dylib.py @@ -47,12 +47,14 @@ def get_new_name( input_component = str(input_dylib_path).replace(str(input_directory), "")[1:] return Path(os.path.join(output_directory, input_component)) -def get_archs(dylib_path: Path) -> list[str]: - res = subprocess.check_output([LIPO, "-info", str(dylib_path)]).decode("utf-8") - if res.startswith("Non-fat file"): - return [res.split(":")[-1].strip()] - else: - return res.split("are:")[-1].strip().split() + +def is_fat_file(dylib_path: Path) -> str: + res = subprocess.check_output([LIPO, "-info", str(dylib_path.absolute())]).decode( + "utf-8" + ) + + return not res.split("\n")[0].startswith("Non-fat file") + def construct_universal_dylib( arm64_input_dylib_path: Path, x86_64_input_dylib_path: Path, output_dylib_path: Path @@ -67,12 +69,11 @@ def construct_universal_dylib( os.path.basename(arm64_input_dylib_path.resolve()), output_dylib_path ) else: - arm64_archs = get_archs(arm64_input_dylib_path) - x86_64_archs = get_archs(x86_64_input_dylib_path) if x86_64_input_dylib_path.exists() else [] - - if "arm64" in arm64_archs and "x86_64" in arm64_archs: - shutil.copy2(arm64_input_dylib_path, output_dylib_path) - elif x86_64_archs: + if is_fat_file(arm64_input_dylib_path) or not x86_64_input_dylib_path.exists(): + with open(output_dylib_path, "wb") as dst: + with open(arm64_input_dylib_path, "rb") as src: + dst.write(src.read()) + else: subprocess.check_call( [ LIPO, diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs index b285e57f5..431d48e81 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs @@ -16,15 +16,15 @@ namespace Ryujinx.Graphics.Vulkan { DescriptorSetLayout[] layouts = new DescriptorSetLayout[setDescriptors.Count]; bool[] updateAfterBindFlags = new bool[setDescriptors.Count]; - + bool isMoltenVk = gd.IsMoltenVk; - + for (int setIndex = 0; setIndex < setDescriptors.Count; setIndex++) { ResourceDescriptorCollection rdc = setDescriptors[setIndex]; ResourceStages activeStages = ResourceStages.None; - + if (isMoltenVk) { for (int descIndex = 0; descIndex < rdc.Descriptors.Count; descIndex++) @@ -48,7 +48,7 @@ namespace Ryujinx.Graphics.Vulkan // causes invalid resource errors, allow the binding on all active stages as workaround. // https://github.com/KhronosGroup/MoltenVK/issues/1870 stages = activeStages; - } + } layoutBindings[descIndex] = new DescriptorSetLayoutBinding { diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 653129ac7..d2170a682 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -439,7 +439,7 @@ namespace Ryujinx.Graphics.Vulkan features2.Features.MultiViewport && !(IsMoltenVk && Vendor == Vendor.Amd), // Workaround for AMD on MoltenVK issue featuresRobustness2.NullDescriptor || IsMoltenVk, supportsPushDescriptors, - IsMoltenVk ? 16 : propertiesPushDescriptor.MaxPushDescriptors, // In case an old version of MoltenVK is used, apply a limit to prevent vertex explosions. + IsMoltenVk ? 16 : propertiesPushDescriptor.MaxPushDescriptors, // Prevents vertex explosions on MoltenVK. featuresPrimitiveTopologyListRestart.PrimitiveTopologyListRestart, featuresPrimitiveTopologyListRestart.PrimitiveTopologyPatchListRestart, supportsTransformFeedback, diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 8a89f3a46..b2c9480d2 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -28,14 +28,14 @@ true partial - + - + true @@ -73,7 +73,7 @@ - +