aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/vulkan_common/vulkan_instance.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-12-30 04:58:38 -0300
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-12-31 02:07:34 -0300
commite92031e76769d385dcdefa16e8741c2fcc8f8f7a (patch)
treee360cc51563b7bee53e67587a421a1d15be3221e /src/video_core/vulkan_common/vulkan_instance.cpp
parent9c39c02012dd078f4b15b6bb8049253c8d54e57a (diff)
vulkan_instance: Allow different Vulkan versions and enforce 1.1
For listing the available physical devices we can use Vulkan 1.0. Now that MoltenVK supports 1.1 we can require it for running games. Add missing documentation.
Diffstat (limited to 'src/video_core/vulkan_common/vulkan_instance.cpp')
-rw-r--r--src/video_core/vulkan_common/vulkan_instance.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp
index ee46fc6ccd..889ecda0c6 100644
--- a/src/video_core/vulkan_common/vulkan_instance.cpp
+++ b/src/video_core/vulkan_common/vulkan_instance.cpp
@@ -111,10 +111,9 @@ void RemoveUnavailableLayers(const vk::InstanceDispatch& dld, std::vector<const
}
} // Anonymous namespace
-std::pair<vk::Instance, u32> CreateInstance(const Common::DynamicLibrary& library,
- vk::InstanceDispatch& dld,
- Core::Frontend::WindowSystemType window_type,
- bool enable_debug_utils, bool enable_layers) {
+vk::Instance CreateInstance(const Common::DynamicLibrary& library, vk::InstanceDispatch& dld,
+ u32 required_version, Core::Frontend::WindowSystemType window_type,
+ bool enable_debug_utils, bool enable_layers) {
if (!library.IsOpen()) {
LOG_ERROR(Render_Vulkan, "Vulkan library not available");
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
@@ -134,15 +133,19 @@ std::pair<vk::Instance, u32> CreateInstance(const Common::DynamicLibrary& librar
std::vector<const char*> layers = Layers(enable_layers);
RemoveUnavailableLayers(dld, layers);
- // Limit the maximum version of Vulkan to avoid using untested version.
- const u32 version = std::min(vk::AvailableVersion(dld), VK_API_VERSION_1_1);
-
- vk::Instance instance = vk::Instance::Create(version, layers, extensions, dld);
+ const u32 available_version = vk::AvailableVersion(dld);
+ if (available_version < required_version) {
+ LOG_ERROR(Render_Vulkan, "Vulkan {}.{} is not supported, {}.{} is required",
+ VK_VERSION_MAJOR(available_version), VK_VERSION_MINOR(available_version),
+ VK_VERSION_MAJOR(required_version), VK_VERSION_MINOR(required_version));
+ throw vk::Exception(VK_ERROR_INCOMPATIBLE_DRIVER);
+ }
+ vk::Instance instance = vk::Instance::Create(required_version, layers, extensions, dld);
if (!vk::Load(*instance, dld)) {
LOG_ERROR(Render_Vulkan, "Failed to load Vulkan instance function pointers");
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
}
- return std::make_pair(std::move(instance), version);
+ return instance;
}
} // namespace Vulkan