vulkan: Use required portability instance extension on macOS.

This commit is contained in:
Steveice10
2022-11-03 17:07:21 -07:00
committed by GPUCode
parent 3b9ed5234d
commit 6426f7a319
3 changed files with 31 additions and 3 deletions

View File

@ -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 =

View File

@ -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

View File

@ -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