Skip to content

Commit b76ca88

Browse files
authored
(macOS) Support loading VK ICDs (in preparation for KosmicKrisp)
1 parent 54206c6 commit b76ca88

File tree

11 files changed

+66
-16
lines changed

11 files changed

+66
-16
lines changed

.ci/build-mac-arm64.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
66
export HOMEBREW_NO_ENV_HINTS=1
77
export HOMEBREW_NO_INSTALL_CLEANUP=1
88

9-
brew install -f --overwrite --quiet pipenv googletest opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" glew sdl3 vulkan-headers
9+
brew install -f --overwrite --quiet pipenv googletest opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" glew sdl3 vulkan-headers vulkan-loader
1010
brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative
11+
1112
brew link -f --quiet "llvm@$LLVM_COMPILER_VER" ffmpeg@5
1213

1314
# moltenvk based on commit for 1.4.0 release
@@ -57,15 +58,14 @@ export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3"
5758

5859
export PATH="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/bin:$WORKDIR/qt-downloader/$QT_VER/clang_64/bin:$BREW_BIN:$BREW_SBIN:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin:$PATH"
5960
export LDFLAGS="-L$BREW_PATH/lib $BREW_PATH/opt/ffmpeg@5/lib/libavcodec.dylib $BREW_PATH/opt/ffmpeg@5/lib/libavformat.dylib $BREW_PATH/opt/ffmpeg@5/lib/libavutil.dylib $BREW_PATH/opt/ffmpeg@5/lib/libswscale.dylib $BREW_PATH/opt/ffmpeg@5/lib/libswresample.dylib $BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++.1.dylib $BREW_PATH/lib/libSDL3.dylib $BREW_PATH/lib/libGLEW.dylib $BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind/libunwind.1.dylib -Wl,-rpath,$BREW_PATH/lib"
60-
export CPPFLAGS="-I$BREW_PATH/include -I$BREW_PATH/include -no-pie -D__MAC_OS_X_VERSION_MIN_REQUIRED=140000"
61+
export CPPFLAGS="-I$BREW_PATH/include -no-pie -D__MAC_OS_X_VERSION_MIN_REQUIRED=140000"
6162
export CFLAGS="-D__MAC_OS_X_VERSION_MIN_REQUIRED=140000"
6263
export LIBRARY_PATH="$BREW_PATH/lib"
6364
export LD_LIBRARY_PATH="$BREW_PATH/lib"
6465

6566
export VULKAN_SDK
6667
VULKAN_SDK="$BREW_PATH/opt/molten-vk"
67-
ln -s "$VULKAN_SDK/lib/libMoltenVK.dylib" "$VULKAN_SDK/lib/libvulkan.dylib" || true
68-
export VK_ICD_FILENAMES="$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json"
68+
ln -s "$BREW_PATH/opt/vulkan-loader/lib/libvulkan.dylib" "$VULKAN_SDK/lib/libvulkan.dylib" || true
6969

7070
export LLVM_DIR
7171
LLVM_DIR="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER"

.ci/build-mac.sh

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER"
1212
rm /usr/local/bin/{idle3.14,pip3.14,pydoc3.14,python3.14,python3.14-config} && \
1313
rm /usr/local/bin/{idle3,pip3,pydoc3,python3,python3-config}
1414
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
15-
arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" glew sdl3 vulkan-headers
15+
arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet opencv@4 ffmpeg@5 "llvm@$LLVM_COMPILER_VER" glew sdl3 vulkan-headers vulkan-loader
1616
arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative
1717
arch -x86_64 /usr/local/bin/brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" ffmpeg@5
1818

@@ -64,8 +64,7 @@ export LD_LIBRARY_PATH="$BREW_X64_PATH/opt/llvm@$LLVM_COMPILER_VER/lib:$BREW_X64
6464

6565
export VULKAN_SDK
6666
VULKAN_SDK="$BREW_X64_PATH/opt/molten-vk"
67-
ln -s "$VULKAN_SDK/lib/libMoltenVK.dylib" "$VULKAN_SDK/lib/libvulkan.dylib"
68-
export VK_ICD_FILENAMES="$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json"
67+
ln -s "$BREW_X64_PATH/opt/vulkan-loader/lib/libvulkan.dylib" "$VULKAN_SDK/lib/libvulkan.dylib"
6968

7069
export LLVM_DIR
7170
LLVM_DIR="$BREW_X64_PATH/opt/llvm@$LLVM_COMPILER_VER"

.ci/deploy-mac-arm64.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ echo "AVVER=$AVVER" >> ../.ci/ci-vars.env
1515

1616
cd bin
1717
mkdir "rpcs3.app/Contents/lib/" || true
18+
mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true
19+
cp "$(realpath /opt/homebrew/lib/libMoltenVK.dylib)" "rpcs3.app/Contents/Frameworks/libMoltenVK.dylib"
20+
cp "$(realpath /opt/homebrew/etc/vulkan/icd.d/MoltenVK_icd.json)" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
21+
sed -i '' "s/lib\//Frameworks\//g" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
1822

1923
cp "$(realpath /opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++abi.1.0.dylib)" "rpcs3.app/Contents/Frameworks/libc++abi.1.dylib"
2024
cp "$(realpath /opt/homebrew/opt/gcc/lib/gcc/current/libgcc_s.1.1.dylib)" "rpcs3.app/Contents/Frameworks/libgcc_s.1.1.dylib"

.ci/deploy-mac.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ AVVER="${COMM_TAG}-${COMM_COUNT}"
1414
echo "AVVER=$AVVER" >> ../.ci/ci-vars.env
1515

1616
cd bin
17-
mkdir "rpcs3.app/Contents/lib/"
17+
mkdir "rpcs3.app/Contents/lib/" || true
18+
mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true
19+
cp "$(realpath /usr/local/lib/libMoltenVK.dylib)" "rpcs3.app/Contents/Frameworks/libMoltenVK.dylib"
20+
cp "$(realpath /usr/local/etc/vulkan/icd.d/MoltenVK_icd.json)" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
21+
sed -i '' "s/lib\//Frameworks\//g" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
1822

1923
cp "$(realpath /usr/local/opt/llvm@$LLVM_COMPILER_VER/lib/c++/libc++abi.1.0.dylib)" "rpcs3.app/Contents/Frameworks/libc++abi.1.dylib"
2024
cp "$(realpath /usr/local/opt/llvm@$LLVM_COMPILER_VER/lib/unwind/libunwind.1.dylib)" "rpcs3.app/Contents/Frameworks/libunwind.1.dylib"

rpcs3/Emu/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,11 @@ if(TARGET 3rdparty_vulkan)
623623
RSX/VK/VKTextureCache.cpp
624624
RSX/VK/VulkanAPI.cpp
625625
)
626+
if(APPLE)
627+
target_sources(rpcs3_emu PRIVATE
628+
RSX/VK/vkutils/metal_layer.mm
629+
)
630+
endif()
626631
endif()
627632

628633
find_package(Threads REQUIRED)

rpcs3/Emu/RSX/VK/VulkanAPI.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#ifdef _WIN32
55
#define VK_USE_PLATFORM_WIN32_KHR
66
#elif defined(__APPLE__)
7-
#define VK_USE_PLATFORM_MACOS_MVK
7+
#define VK_USE_PLATFORM_METAL_EXT
88
#elif defined(ANDROID)
99
#define VK_USE_PLATFORM_ANDROID_KHR
1010
#else
@@ -29,7 +29,7 @@
2929

3030
// Undefine header configuration variables
3131
#undef VK_USE_PLATFORM_WIN32_KHR
32-
#undef VK_USE_PLATFORM_MACOS_MVK
32+
#undef VK_USE_PLATFORM_METAL_EXT
3333
#undef VK_USE_PLATFORM_ANDROID_KHR
3434
#undef VK_USE_PLATFORM_XLIB_KHR
3535
#undef VK_USE_PLATFORM_WAYLAND_KHR

rpcs3/Emu/RSX/VK/vkutils/device.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
#include "util/logs.hpp"
44
#include "Emu/system_config.h"
55
#include <vulkan/vulkan_core.h>
6+
#ifdef __APPLE__
7+
#include <vulkan/vulkan_beta.h>
8+
#endif
69

710
namespace vk
811
{
@@ -555,6 +558,10 @@ namespace vk
555558
{
556559
requested_extensions.push_back(VK_EXT_DEVICE_FAULT_EXTENSION_NAME);
557560
}
561+
562+
#ifdef __APPLE__
563+
requested_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
564+
#endif
558565

559566
enabled_features.robustBufferAccess = VK_TRUE;
560567
enabled_features.fullDrawIndexUint32 = VK_TRUE;

rpcs3/Emu/RSX/VK/vkutils/instance.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,11 @@ namespace vk
124124
}
125125

126126
#ifdef __APPLE__
127+
extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
128+
extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
127129
if (support.is_supported(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME))
128130
{
129131
extensions.push_back(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME);
130-
layers.push_back(kMVKMoltenVKDriverLayerName);
131132

132133
mvk_settings.push_back(VkLayerSettingEXT{ kMVKMoltenVKDriverLayerName, "MVK_CONFIG_RESUME_LOST_DEVICE", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &setting_true });
133134
mvk_settings.push_back(VkLayerSettingEXT{ kMVKMoltenVKDriverLayerName, "MVK_CONFIG_FAST_MATH_ENABLED", VK_LAYER_SETTING_TYPE_INT32_EXT, 1, &setting_fast_math });
@@ -154,7 +155,7 @@ namespace vk
154155
#ifdef _WIN32
155156
extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
156157
#elif defined(__APPLE__)
157-
extensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME);
158+
extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME);
158159
#else
159160
bool found_surface_ext = false;
160161
#ifdef HAVE_X11
@@ -187,15 +188,32 @@ namespace vk
187188
if (g_cfg.video.debug_output)
188189
layers.push_back("VK_LAYER_KHRONOS_validation");
189190
}
191+
#ifdef __APPLE__
192+
// MoltenVK's ICD will not be detected without these extensions enabled.
193+
else
194+
{
195+
extensions_loaded = true;
196+
extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
197+
extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
198+
}
199+
#endif
190200

191201
VkInstanceCreateInfo instance_info = {};
192202
instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
193203
instance_info.pApplicationInfo = &app;
194204
instance_info.enabledLayerCount = static_cast<u32>(layers.size());
195205
instance_info.ppEnabledLayerNames = layers.data();
206+
#ifdef __APPLE__
207+
instance_info.enabledExtensionCount = static_cast<u32>(extensions.size());
208+
instance_info.ppEnabledExtensionNames = extensions.data();
209+
#else
196210
instance_info.enabledExtensionCount = fast ? 0 : static_cast<u32>(extensions.size());
197211
instance_info.ppEnabledExtensionNames = fast ? nullptr : extensions.data();
212+
#endif
198213
instance_info.pNext = next_info;
214+
#ifdef __APPLE__
215+
instance_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
216+
#endif
199217

200218
if (VkResult result = vkCreateInstance(&instance_info, nullptr, &m_instance); result != VK_SUCCESS)
201219
{
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#pragma once
2+
void* GetCAMetalLayerFromMetalView(void* view);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#pragma GCC diagnostic push
2+
#pragma GCC diagnostic ignored "-Wold-style-cast"
3+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
4+
#pragma GCC diagnostic ignored "-Wmissing-declarations"
5+
#import <Foundation/Foundation.h>
6+
#import <AppKit/AppKit.h>
7+
#import <QuartzCore/QuartzCore.h>
8+
9+
void* GetCAMetalLayerFromMetalView(void* view) { return ((NSView*)view).layer; }
10+
#pragma GCC diagnostic pop

0 commit comments

Comments
 (0)