Skip to content

Commit dc44c08

Browse files
committed
macOS: debug builds use vulkan-loader
1 parent 303f7ff commit dc44c08

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

gfx/common/vulkan_common.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,19 @@
4747
#define VENDOR_ID_NV 0x10DE
4848
#define VENDOR_ID_INTEL 0x8086
4949

50+
#ifdef __APPLE__
51+
#if VK_HEADER_VERSION < 216
52+
/* Portability enumeration extension for MoltenVK through Vulkan loader.
53+
* These may not be defined in older Vulkan headers. */
54+
#ifndef VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME
55+
#define VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME "VK_KHR_portability_enumeration"
56+
#endif
57+
#ifndef VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR
58+
#define VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 0x00000001
59+
#endif
60+
#endif
61+
#endif
62+
5063
#if defined(_WIN32) || defined(__APPLE__)
5164
#define VULKAN_EMULATE_MAILBOX
5265
#endif
@@ -561,7 +574,8 @@ static const char *vulkan_device_extensions[] = {
561574

562575
static const char *vulkan_optional_device_extensions[] = {
563576
"VK_KHR_sampler_mirror_clamp_to_edge",
564-
"VK_EXT_full_screen_exclusive"
577+
"VK_EXT_full_screen_exclusive",
578+
"VK_KHR_portability_subset"
565579
};
566580

567581
static VkDevice vulkan_context_create_device_wrapper(
@@ -894,6 +908,9 @@ static bool vulkan_context_init_device(gfx_ctx_vulkan_data_t *vk)
894908
#endif
895909

896910
static const char *vulkan_optional_instance_extensions[] = {
911+
#ifdef __APPLE__
912+
VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
913+
#endif
897914
#ifdef VULKAN_HDR_SWAPCHAIN
898915
VULKAN_COLORSPACE_EXTENSION_NAME
899916
#endif
@@ -984,6 +1001,18 @@ static VkInstance vulkan_context_create_instance_wrapper(void *opaque, const VkI
9841001
}
9851002
#endif
9861003

1004+
#ifdef __APPLE__
1005+
/* Check if portability enumeration was enabled (needed for Vulkan loader to find MoltenVK) */
1006+
for (i = 0; i < info.enabledExtensionCount; i++)
1007+
{
1008+
if (string_is_equal(instance_extensions[i], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME))
1009+
{
1010+
info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
1011+
break;
1012+
}
1013+
}
1014+
#endif
1015+
9871016
if (info.pApplicationInfo)
9881017
{
9891018
uint32_t supported_instance_version = VK_API_VERSION_1_0;
@@ -2451,7 +2480,10 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk,
24512480
int use_mab = settings->bools.video_use_metal_arg_buffers;
24522481
setenv("MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", use_mab ? "1" : "0", 1);
24532482
}
2454-
if (__builtin_available(macOS 10.15, iOS 13, tvOS 12, *))
2483+
/* Try Vulkan loader first (enables validation layers if installed).
2484+
* Falls back to MoltenVK directly if loader not available. */
2485+
vulkan_library = dylib_load("libvulkan.dylib");
2486+
if (!vulkan_library && __builtin_available(macOS 10.15, iOS 13, tvOS 12, *))
24552487
vulkan_library = dylib_load("MoltenVK");
24562488
if (!vulkan_library)
24572489
vulkan_library = dylib_load("MoltenVK-v1.2.7.framework");

pkg/apple/BaseConfig.xcconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ OTHER_CFLAGS[sdk=iphonesimulator*] = $(inherited) $(OTHER_CFLAGS_IOS)
149149
OTHER_CFLAGS[config=Debug] = $(inherited) -DDEBUG=1
150150
OTHER_CFLAGS[config=Release] = $(inherited) -DNDEBUG -DNS_BLOCK_ASSERTIONS=1
151151

152+
// Vulkan validation layer support for macOS debug builds
153+
// Requires: brew install vulkan-loader vulkan-validationlayers
154+
//OTHER_CFLAGS[sdk=macosx*][config=Debug] = $(inherited) -DVULKAN_DEBUG
155+
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*][config=Debug] = $(inherited) /opt/homebrew/opt/vulkan-loader/lib /usr/local/opt/vulkan-loader/lib
156+
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*][config=Debug] = $(inherited) /opt/homebrew/opt/vulkan-validationlayers/lib /usr/local/opt/vulkan-validationlayers/lib
157+
152158
// Keep function symbols for KSCrash symbolication in release builds
153159
// (debug symbols still go to dSYM files)
154160
STRIP_STYLE[config=Release] = debugging

pkg/apple/make-frameworks.sh

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,18 @@ if [ -n "$MOLTENVK_LEGACY_XCFRAMEWORK_PATH" -a -d "${MOLTENVK_LEGACY_XCFRAMEWORK
111111
codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${OUTDIR}/MoltenVK-${MOLTENVK_LEGACY_VERSION}.framework/MoltenVK-${MOLTENVK_LEGACY_VERSION}"
112112
codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" "${OUTDIR}/MoltenVK-${MOLTENVK_LEGACY_VERSION}.framework"
113113
fi
114+
115+
# Copy Vulkan ICD file for loader discovery (macOS only)
116+
# This allows the Vulkan loader to find MoltenVK when using validation layers
117+
# Only include current MoltenVK - legacy version is for old OS support, not validation
118+
if [ "$PLATFORM_FAMILY_NAME" = "macOS" ] ; then
119+
RESOURCES_DIR="$(dirname "$OUTDIR")/Resources"
120+
ICD_DIR="$RESOURCES_DIR/vulkan/icd.d"
121+
mkdir -p "$ICD_DIR"
122+
123+
if [ -f "${OUTDIR}/MoltenVK.framework/Versions/A/Resources/MoltenVK_icd.json" ] ; then
124+
sed 's|\.\./MoltenVK|../../../Frameworks/MoltenVK.framework/Versions/A/MoltenVK|' \
125+
"${OUTDIR}/MoltenVK.framework/Versions/A/Resources/MoltenVK_icd.json" \
126+
> "$ICD_DIR/MoltenVK_icd.json"
127+
fi
128+
fi

0 commit comments

Comments
 (0)