Skip to content

VK_EXT_metal_surface extension missing despite being enabled on macOS M1 and M2  #414

Open
@ZzzhHe

Description

@ZzzhHe

Environment

  • macOS on M1
  • Vulkan SDK 1.3.280
  • GLFW
  • MoltenVK
  • Xcode project

Issue

Getting error: Cocoa: Vulkan instance missing VK_EXT_metal_surface extension during window surface creation, despite the extension being properly enabled.

bool EditorWindow::CreateSurface(void* instance, void** out_window_surface)
{
if (!instance || !out_window_surface)
{
return false;
}
VkInstance vkInstance = reinterpret_cast<VkInstance>(instance);
VkSurfaceKHR* pSurface = reinterpret_cast<VkSurfaceKHR*>(out_window_surface);
VkResult result = glfwCreateWindowSurface(vkInstance, m_native_window, nullptr, pSurface);
return (result == VK_SUCCESS);
}

What I've Tried

  1. Enabled VK_EXT_metal_surface extension - confirmed present in extension list
  2. Added required macOS-specific extensions:
    • VK_KHR_portability_enumeration
    • VK_KHR_get_physical_device_properties2
  3. Set proper instance creation flags for macOS
  4. Verified library linking and loading order
  5. Removed potential conflict with VK_MVK_macos_surface

Output (with extension list printed)

❯ ./Result.Darwin.x64.Debug/Tetragrama/Debug/zEngineEditor --projectConfigFile "/Users/Programming/GitRepo/RendererEngine/test/projectConfig.json"
Thread 0, Frame 0:
vkCreateInstance(pCreateInfo, pAllocator, pInstance) returns VkResult VK_SUCCESS (0):
    pCreateInfo:                    const VkInstanceCreateInfo* = 0x16d161c40:
        sType:                          VkStructureType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO (1)
        pNext:                          const void* = NULL
        flags:                          VkInstanceCreateFlags = 1 (VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR)
        pApplicationInfo:               const VkApplicationInfo* = 0x16d165ed0:
            sType:                          VkStructureType = VK_STRUCTURE_TYPE_APPLICATION_INFO (0)
            pNext:                          const void* = NULL
            pApplicationName:               const char* = "Tetragrama"
            applicationVersion:             uint32_t = 1
            pEngineName:                    const char* = "ZEngine"
            engineVersion:                  uint32_t = 1
            apiVersion:                     uint32_t = 4206592
        enabledLayerCount:              uint32_t = 4
        ppEnabledLayerNames:            const char* const* = 0x6000031b92a0
            ppEnabledLayerNames[0]:         const char* const = "VK_LAYER_LUNARG_screenshot"
            ppEnabledLayerNames[1]:         const char* const = "VK_LAYER_KHRONOS_validation"
            ppEnabledLayerNames[2]:         const char* const = "VK_LAYER_LUNARG_api_dump"
            ppEnabledLayerNames[3]:         const char* const = "VK_LAYER_KHRONOS_synchronization2"
        enabledExtensionCount:          uint32_t = 6
        ppEnabledExtensionNames:        const char* const* = 0x6000024b0800
            ppEnabledExtensionNames[0]:     const char* const = "VK_EXT_debug_report"
            ppEnabledExtensionNames[1]:     const char* const = "VK_EXT_debug_utils"
            ppEnabledExtensionNames[2]:     const char* const = "VK_KHR_surface"
            ppEnabledExtensionNames[3]:     const char* const = "VK_EXT_metal_surface"
            ppEnabledExtensionNames[4]:     const char* const = "VK_KHR_portability_enumeration"
            ppEnabledExtensionNames[5]:     const char* const = "VK_KHR_get_physical_device_properties2"
        pNext:                          const void* = NULL
    pAllocator:                     const VkAllocationCallbacks* = NULL
    pInstance:                      VkInstance* = 0x131813200

Thread 0, Frame 0:
vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices) returns VkResult VK_SUCCESS (0):
    instance:                       VkInstance = 0x131813200
    pPhysicalDeviceCount:           uint32_t* = 1
    pPhysicalDevices:               VkPhysicalDevice* = NULL

Thread 0, Frame 0:
vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices) returns VkResult VK_SUCCESS (0):
    instance:                       VkInstance = 0x131813200
    pPhysicalDeviceCount:           uint32_t* = 1
    pPhysicalDevices:               VkPhysicalDevice* = 0x6000033bc560
        pPhysicalDevices[0]:            VkPhysicalDevice = 0x6000031e0000

Thread 0, Frame 0:
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties) returns void:
    physicalDevice:                 VkPhysicalDevice = 0x6000031e0000
    pQueueFamilyPropertyCount:      uint32_t* = 4
    pQueueFamilyProperties:         VkQueueFamilyProperties* = NULL

Thread 0, Frame 0:
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties) returns void:
    physicalDevice:                 VkPhysicalDevice = 0x6000031e0000
    pQueueFamilyPropertyCount:      uint32_t* = 4
    pQueueFamilyProperties:         VkQueueFamilyProperties* = 0x6000015aaa00
        pQueueFamilyProperties[0]:      VkQueueFamilyProperties = 0x6000015aaa00:
            queueFlags:                     VkQueueFlags = 7 (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT)
            queueCount:                     uint32_t = 1
            timestampValidBits:             uint32_t = 64
            minImageTransferGranularity:    VkExtent3D = 0x6000015aaa0c:
                width:                          uint32_t = 1
                height:                         uint32_t = 1
                depth:                          uint32_t = 1
        pQueueFamilyProperties[1]:      VkQueueFamilyProperties = 0x6000015aaa18:
            queueFlags:                     VkQueueFlags = 7 (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT)
            queueCount:                     uint32_t = 1
            timestampValidBits:             uint32_t = 64
            minImageTransferGranularity:    VkExtent3D = 0x6000015aaa24:
                width:                          uint32_t = 1
                height:                         uint32_t = 1
                depth:                          uint32_t = 1
        pQueueFamilyProperties[2]:      VkQueueFamilyProperties = 0x6000015aaa30:
            queueFlags:                     VkQueueFlags = 7 (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT)
            queueCount:                     uint32_t = 1
            timestampValidBits:             uint32_t = 64
            minImageTransferGranularity:    VkExtent3D = 0x6000015aaa3c:
                width:                          uint32_t = 1
                height:                         uint32_t = 1
                depth:                          uint32_t = 1
        pQueueFamilyProperties[3]:      VkQueueFamilyProperties = 0x6000015aaa48:
            queueFlags:                     VkQueueFlags = 7 (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT)
            queueCount:                     uint32_t = 1
            timestampValidBits:             uint32_t = 64
            minImageTransferGranularity:    VkExtent3D = 0x6000015aaa54:
                width:                          uint32_t = 1
                height:                         uint32_t = 1
                depth:                          uint32_t = 1

Active instance extensions:
VK_KHR_device_group_creation
VK_KHR_external_fence_capabilities
VK_KHR_external_memory_capabilities
VK_KHR_external_semaphore_capabilities
VK_KHR_get_physical_device_properties2
VK_KHR_get_surface_capabilities2
VK_KHR_surface
VK_EXT_debug_report
VK_EXT_debug_utils
VK_EXT_headless_surface
VK_EXT_layer_settings
VK_EXT_metal_surface
VK_EXT_surface_maintenance1
VK_EXT_swapchain_colorspace
VK_MVK_macos_surface
VK_KHR_portability_enumeration
VK_LUNARG_direct_driver_loading
Thread 0, Frame 0:
vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pMessenger) returns VkResult VK_SUCCESS (0):
    instance:                       VkInstance = 0x131813200
    pCreateInfo:                    const VkDebugUtilsMessengerCreateInfoEXT* = 0x16d165b68:
        sType:                          VkStructureType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT (1000128004)
        pNext:                          const void* = NULL
        flags:                          VkDebugUtilsMessengerCreateFlagsEXT = 0
        messageSeverity:                VkDebugUtilsMessageSeverityFlagsEXT = 4369 (VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
        messageType:                    VkDebugUtilsMessageTypeFlagsEXT = 7 (VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT)
        pfnUserCallback:                PFN_vkDebugUtilsMessengerCallbackEXT = 1
        pUserData:                      void* = NULL
    pAllocator:                     const VkAllocationCallbacks* = NULL
    pMessenger:                     VkDebugUtilsMessengerEXT* = 0x6000033bc650

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status

    In Progress

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions