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.
This commit is contained in:
parent
7344a7c447
commit
cdbee27692
7 changed files with 39 additions and 41 deletions
|
@ -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
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "common/dynamic_library.h"
|
||||
#include "core/frontend/emu_window.h"
|
||||
|
@ -13,8 +11,21 @@
|
|||
|
||||
namespace Vulkan {
|
||||
|
||||
[[nodiscard]] std::pair<vk::Instance, u32> CreateInstance(
|
||||
const Common::DynamicLibrary& library, vk::InstanceDispatch& dld,
|
||||
/**
|
||||
* Create a Vulkan instance
|
||||
*
|
||||
* @param library Dynamic library to load the Vulkan instance from
|
||||
* @param dld Dispatch table to load function pointers into
|
||||
* @param required_version Required Vulkan version (for example, VK_API_VERSION_1_1)
|
||||
* @param window_type Window system type's enabled extension
|
||||
* @param enable_debug_utils Whether to enable VK_EXT_debug_utils_extension_name or not
|
||||
* @param enable_layers Whether to enable Vulkan validation layers or not
|
||||
*
|
||||
* @return A new Vulkan instance
|
||||
* @throw vk::Exception on failure
|
||||
*/
|
||||
[[nodiscard]] vk::Instance CreateInstance(
|
||||
const Common::DynamicLibrary& library, vk::InstanceDispatch& dld, u32 required_version,
|
||||
Core::Frontend::WindowSystemType window_type = Core::Frontend::WindowSystemType::Headless,
|
||||
bool enable_debug_utils = false, bool enable_layers = false);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue