vulkan: Use required portability instance extension on macOS.
This commit is contained in:
@ -46,6 +46,12 @@ Instance::Instance(bool validation, bool dump_command_buffers) {
|
||||
dl.getProcAddress<PFN_vkGetInstanceProcAddr>("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<u32>(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 =
|
||||
|
@ -104,6 +104,10 @@ std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window
|
||||
std::vector<const char*> 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<const char*> GetInstanceExtensions(Frontend::WindowSystemType window
|
||||
return extensions;
|
||||
}
|
||||
|
||||
vk::InstanceCreateFlags GetInstanceFlags() {
|
||||
#if defined(__APPLE__)
|
||||
return vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR;
|
||||
#else
|
||||
return static_cast<vk::InstanceCreateFlags>(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace Vulkan
|
||||
|
@ -18,6 +18,8 @@ namespace Vulkan {
|
||||
std::vector<const char*> 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
|
||||
|
Reference in New Issue
Block a user