diff --git a/.gitignore b/.gitignore
index 0c46c50c0..6f887e638 100644
--- a/.gitignore
+++ b/.gitignore
@@ -100,6 +100,7 @@ DocProject/Help/html
# Click-Once directory
publish/
+RyubingMaintainerTools/
# Publish Web Output
*.Publish.xml
diff --git a/Directory.Packages.props b/Directory.Packages.props
index fd61602a8..8c6d62093 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -40,7 +40,7 @@
-
+
@@ -59,4 +59,4 @@
-
\ No newline at end of file
+
diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py
index 5d9321860..18b84399f 100644
--- a/distribution/macos/construct_universal_dylib.py
+++ b/distribution/macos/construct_universal_dylib.py
@@ -47,14 +47,12 @@ 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 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 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 construct_universal_dylib(
arm64_input_dylib_path: Path, x86_64_input_dylib_path: Path, output_dylib_path: Path
@@ -69,11 +67,12 @@ def construct_universal_dylib(
os.path.basename(arm64_input_dylib_path.resolve()), output_dylib_path
)
else:
- 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:
+ 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:
subprocess.check_call(
[
LIPO,
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs
index 612a8b25d..d8fe67d68 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs
@@ -17,22 +17,10 @@ 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++)
- {
- activeStages |= rdc.Descriptors[descIndex].Stages;
- }
- }
-
DescriptorSetLayoutBinding[] layoutBindings = new DescriptorSetLayoutBinding[rdc.Descriptors.Count];
bool hasArray = false;
@@ -42,13 +30,6 @@ namespace Ryujinx.Graphics.Vulkan
ResourceDescriptor descriptor = rdc.Descriptors[descIndex];
ResourceStages stages = descriptor.Stages;
- if (descriptor.Type == ResourceType.StorageBuffer && isMoltenVk)
- {
- // There's a bug on MoltenVK where using the same buffer across different stages
- // causes invalid resource errors, allow the binding on all active stages as workaround.
- stages = activeStages;
- }
-
layoutBindings[descIndex] = new DescriptorSetLayoutBinding
{
Binding = (uint)descriptor.Binding,
diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
index 5f1c50b00..d748f806f 100644
--- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
+++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
@@ -435,8 +435,8 @@ namespace Ryujinx.Graphics.Vulkan
_physicalDevice.IsDeviceExtensionPresent(ExtExtendedDynamicState.ExtensionName),
features2.Features.MultiViewport && !(IsMoltenVk && Vendor == Vendor.Amd), // Workaround for AMD on MoltenVK issue
featuresRobustness2.NullDescriptor || IsMoltenVk,
- supportsPushDescriptors && !IsMoltenVk,
- propertiesPushDescriptor.MaxPushDescriptors,
+ supportsPushDescriptors,
+ IsMoltenVk ? 16 : propertiesPushDescriptor.MaxPushDescriptors, // Prevents vertex explosions on MoltenVK.
featuresPrimitiveTopologyListRestart.PrimitiveTopologyListRestart,
featuresPrimitiveTopologyListRestart.PrimitiveTopologyPatchListRestart,
supportsTransformFeedback,
@@ -775,7 +775,7 @@ namespace Ryujinx.Graphics.Vulkan
supportsShaderBallot: false,
supportsShaderBarrierDivergence: Vendor != Vendor.Intel,
supportsShaderFloat64: Capabilities.SupportsShaderFloat64,
- supportsTextureGatherOffsets: features2.Features.ShaderImageGatherExtended && !IsMoltenVk,
+ supportsTextureGatherOffsets: features2.Features.ShaderImageGatherExtended,
supportsTextureShadowLod: false,
supportsVertexStoreAndAtomics: features2.Features.VertexPipelineStoresAndAtomics,
supportsViewportIndexVertexTessellation: featuresVk12.ShaderOutputViewportIndex,
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
index 3e13b917a..c9ac86fc9 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
@@ -529,7 +529,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
// The value is decremented if the number of threads waiting is less
// or equal to the Count of threads to be signaled, or Count is zero
// or negative. It is incremented if there are no threads waiting.
- int waitingCount = _arbiterThreads[address].Count;
+ int waitingCount = 0;
+
+ if (_arbiterThreads.TryGetValue(address, out List threads))
+ {
+ waitingCount = threads.Count;
+ }
+
if (waitingCount > 0)
{
diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj
index 31dc20aac..c1aad6e51 100644
--- a/src/Ryujinx/Ryujinx.csproj
+++ b/src/Ryujinx/Ryujinx.csproj
@@ -64,7 +64,7 @@
-
+