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
commitcdbee27692d73046cecf56fdea1c90f72ebbc0ce (patch)
treee360cc51563b7bee53e67587a421a1d15be3221e /src/video_core/vulkan_common/vulkan_instance.cpp
parent7344a7c447af2591c393e69d39892dab217196d3 (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 ee46fc6cc..889ecda0c 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