diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 484069d83..2b736896d 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -46,6 +46,12 @@ Instance::Instance(bool validation, bool dump_command_buffers) { dl.getProcAddress("vkGetInstanceProcAddr"); VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr); + // Enable the instance extensions the platform requires + auto extensions = GetInstanceExtensions(Frontend::WindowSystemType::Headless, false); + + // Use required platform-specific flags + auto flags = GetInstanceFlags(); + const vk::ApplicationInfo application_info = {.pApplicationName = "Citra", .applicationVersion = VK_MAKE_VERSION(1, 0, 0), .pEngineName = "Citra Vulkan", @@ -62,9 +68,13 @@ Instance::Instance(bool validation, bool dump_command_buffers) { layers[layer_count++] = "VK_LAYER_LUNARG_api_dump"; } - const vk::InstanceCreateInfo instance_info = {.pApplicationInfo = &application_info, + const vk::InstanceCreateInfo instance_info = {.flags = flags, + .pApplicationInfo = &application_info, .enabledLayerCount = layer_count, - .ppEnabledLayerNames = layers.data()}; + .ppEnabledLayerNames = layers.data(), + .enabledExtensionCount = + static_cast(extensions.size()), + .ppEnabledExtensionNames = extensions.data()}; instance = vk::createInstance(instance_info); @@ -90,6 +100,9 @@ Instance::Instance(Frontend::EmuWindow& window, u32 physical_device_index) { // Enable the instance extensions the backend uses auto extensions = GetInstanceExtensions(window_info.type, true); + // Use required platform-specific flags + auto flags = GetInstanceFlags(); + // We require a Vulkan 1.1 driver const u32 available_version = vk::enumerateInstanceVersion(); if (available_version < VK_API_VERSION_1_1) { @@ -113,7 +126,8 @@ Instance::Instance(Frontend::EmuWindow& window, u32 physical_device_index) { layers[layer_count++] = "VK_LAYER_LUNARG_api_dump"; } - const vk::InstanceCreateInfo instance_info = {.pApplicationInfo = &application_info, + const vk::InstanceCreateInfo instance_info = {.flags = flags, + .pApplicationInfo = &application_info, .enabledLayerCount = layer_count, .ppEnabledLayerNames = layers.data(), .enabledExtensionCount = diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index 8130fa42f..5ad74345b 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -104,6 +104,10 @@ std::vector GetInstanceExtensions(Frontend::WindowSystemType window std::vector extensions; extensions.reserve(6); +#if defined(__APPLE__) + extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); +#endif + switch (window_type) { case Frontend::WindowSystemType::Headless: break; @@ -154,4 +158,12 @@ std::vector GetInstanceExtensions(Frontend::WindowSystemType window return extensions; } +vk::InstanceCreateFlags GetInstanceFlags() { +#if defined(__APPLE__) + return vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR; +#else + return static_cast(0); +#endif +} + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index 078ed8df9..a8ca9ee8f 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -18,6 +18,8 @@ namespace Vulkan { std::vector GetInstanceExtensions(Frontend::WindowSystemType window_type, bool enable_debug_utils); +vk::InstanceCreateFlags GetInstanceFlags(); + vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::EmuWindow& emu_window); } // namespace Vulkan