|
47 | 47 | #define VENDOR_ID_NV 0x10DE |
48 | 48 | #define VENDOR_ID_INTEL 0x8086 |
49 | 49 |
|
| 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 | + |
50 | 63 | #if defined(_WIN32) || defined(__APPLE__) |
51 | 64 | #define VULKAN_EMULATE_MAILBOX |
52 | 65 | #endif |
@@ -561,7 +574,8 @@ static const char *vulkan_device_extensions[] = { |
561 | 574 |
|
562 | 575 | static const char *vulkan_optional_device_extensions[] = { |
563 | 576 | "VK_KHR_sampler_mirror_clamp_to_edge", |
564 | | - "VK_EXT_full_screen_exclusive" |
| 577 | + "VK_EXT_full_screen_exclusive", |
| 578 | + "VK_KHR_portability_subset" |
565 | 579 | }; |
566 | 580 |
|
567 | 581 | static VkDevice vulkan_context_create_device_wrapper( |
@@ -894,6 +908,9 @@ static bool vulkan_context_init_device(gfx_ctx_vulkan_data_t *vk) |
894 | 908 | #endif |
895 | 909 |
|
896 | 910 | static const char *vulkan_optional_instance_extensions[] = { |
| 911 | +#ifdef __APPLE__ |
| 912 | + VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, |
| 913 | +#endif |
897 | 914 | #ifdef VULKAN_HDR_SWAPCHAIN |
898 | 915 | VULKAN_COLORSPACE_EXTENSION_NAME |
899 | 916 | #endif |
@@ -984,6 +1001,18 @@ static VkInstance vulkan_context_create_instance_wrapper(void *opaque, const VkI |
984 | 1001 | } |
985 | 1002 | #endif |
986 | 1003 |
|
| 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 | + |
987 | 1016 | if (info.pApplicationInfo) |
988 | 1017 | { |
989 | 1018 | uint32_t supported_instance_version = VK_API_VERSION_1_0; |
@@ -2451,7 +2480,10 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, |
2451 | 2480 | int use_mab = settings->bools.video_use_metal_arg_buffers; |
2452 | 2481 | setenv("MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS", use_mab ? "1" : "0", 1); |
2453 | 2482 | } |
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, *)) |
2455 | 2487 | vulkan_library = dylib_load("MoltenVK"); |
2456 | 2488 | if (!vulkan_library) |
2457 | 2489 | vulkan_library = dylib_load("MoltenVK-v1.2.7.framework"); |
|
0 commit comments