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");
|
dl.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
|
||||||
VULKAN_HPP_DEFAULT_DISPATCHER.init(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",
|
const vk::ApplicationInfo application_info = {.pApplicationName = "Citra",
|
||||||
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
||||||
.pEngineName = "Citra Vulkan",
|
.pEngineName = "Citra Vulkan",
|
||||||
@ -62,9 +68,13 @@ Instance::Instance(bool validation, bool dump_command_buffers) {
|
|||||||
layers[layer_count++] = "VK_LAYER_LUNARG_api_dump";
|
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,
|
.enabledLayerCount = layer_count,
|
||||||
.ppEnabledLayerNames = layers.data()};
|
.ppEnabledLayerNames = layers.data(),
|
||||||
|
.enabledExtensionCount =
|
||||||
|
static_cast<u32>(extensions.size()),
|
||||||
|
.ppEnabledExtensionNames = extensions.data()};
|
||||||
|
|
||||||
instance = vk::createInstance(instance_info);
|
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
|
// Enable the instance extensions the backend uses
|
||||||
auto extensions = GetInstanceExtensions(window_info.type, true);
|
auto extensions = GetInstanceExtensions(window_info.type, true);
|
||||||
|
|
||||||
|
// Use required platform-specific flags
|
||||||
|
auto flags = GetInstanceFlags();
|
||||||
|
|
||||||
// We require a Vulkan 1.1 driver
|
// We require a Vulkan 1.1 driver
|
||||||
const u32 available_version = vk::enumerateInstanceVersion();
|
const u32 available_version = vk::enumerateInstanceVersion();
|
||||||
if (available_version < VK_API_VERSION_1_1) {
|
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";
|
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,
|
.enabledLayerCount = layer_count,
|
||||||
.ppEnabledLayerNames = layers.data(),
|
.ppEnabledLayerNames = layers.data(),
|
||||||
.enabledExtensionCount =
|
.enabledExtensionCount =
|
||||||
|
@ -104,6 +104,10 @@ std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window
|
|||||||
std::vector<const char*> extensions;
|
std::vector<const char*> extensions;
|
||||||
extensions.reserve(6);
|
extensions.reserve(6);
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (window_type) {
|
switch (window_type) {
|
||||||
case Frontend::WindowSystemType::Headless:
|
case Frontend::WindowSystemType::Headless:
|
||||||
break;
|
break;
|
||||||
@ -154,4 +158,12 @@ std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window
|
|||||||
return extensions;
|
return extensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vk::InstanceCreateFlags GetInstanceFlags() {
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
return vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR;
|
||||||
|
#else
|
||||||
|
return static_cast<vk::InstanceCreateFlags>(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
@ -18,6 +18,8 @@ namespace Vulkan {
|
|||||||
std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window_type,
|
std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window_type,
|
||||||
bool enable_debug_utils);
|
bool enable_debug_utils);
|
||||||
|
|
||||||
|
vk::InstanceCreateFlags GetInstanceFlags();
|
||||||
|
|
||||||
vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::EmuWindow& emu_window);
|
vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::EmuWindow& emu_window);
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
Reference in New Issue
Block a user