Add set_minimum_instance_version

Also deprecates InstanceBuilder::desire_api_version
and PhysicalDeviceSelector::set_desired_version
This commit is contained in:
Danderaion 2022-02-27 14:27:10 +02:00 committed by Charles Giessen
parent b7c2ddd8e5
commit f6c262c3ab
3 changed files with 37 additions and 17 deletions

View File

@ -576,10 +576,9 @@ detail::Result<Instance> InstanceBuilder::build() const {
if (!sys_info_ret) return sys_info_ret.error(); if (!sys_info_ret) return sys_info_ret.error();
auto system = sys_info_ret.value(); auto system = sys_info_ret.value();
uint32_t api_version = VKB_VK_API_VERSION_1_0;
uint32_t instance_version = VKB_VK_API_VERSION_1_0; uint32_t instance_version = VKB_VK_API_VERSION_1_0;
if (info.required_api_version > VKB_VK_API_VERSION_1_0 || if (info.minimum_instance_version > VKB_VK_API_VERSION_1_0 || info.required_api_version > VKB_VK_API_VERSION_1_0 ||
info.desired_api_version > VKB_VK_API_VERSION_1_0) { info.desired_api_version > VKB_VK_API_VERSION_1_0) {
PFN_vkEnumerateInstanceVersion pfn_vkEnumerateInstanceVersion = PFN_vkEnumerateInstanceVersion pfn_vkEnumerateInstanceVersion =
detail::vulkan_functions().fp_vkEnumerateInstanceVersion; detail::vulkan_functions().fp_vkEnumerateInstanceVersion;
@ -590,7 +589,8 @@ detail::Result<Instance> InstanceBuilder::build() const {
if (res != VK_SUCCESS && info.required_api_version > 0) if (res != VK_SUCCESS && info.required_api_version > 0)
return make_error_code(InstanceError::vulkan_version_unavailable); return make_error_code(InstanceError::vulkan_version_unavailable);
} }
if (pfn_vkEnumerateInstanceVersion == nullptr || instance_version < info.required_api_version) { if (pfn_vkEnumerateInstanceVersion == nullptr || instance_version < info.minimum_instance_version ||
(info.minimum_instance_version == 0 && instance_version < info.required_api_version)) {
if (VK_VERSION_MINOR(info.required_api_version) == 2) if (VK_VERSION_MINOR(info.required_api_version) == 2)
return make_error_code(InstanceError::vulkan_version_1_2_unavailable); return make_error_code(InstanceError::vulkan_version_1_2_unavailable);
else if (VK_VERSION_MINOR(info.required_api_version)) else if (VK_VERSION_MINOR(info.required_api_version))
@ -598,13 +598,15 @@ detail::Result<Instance> InstanceBuilder::build() const {
else else
return make_error_code(InstanceError::vulkan_version_unavailable); return make_error_code(InstanceError::vulkan_version_unavailable);
} }
if (info.required_api_version > VKB_VK_API_VERSION_1_0) {
api_version = info.required_api_version;
} }
uint32_t api_version = instance_version < VKB_VK_API_VERSION_1_1 ? instance_version : info.required_api_version;
if (info.desired_api_version > VKB_VK_API_VERSION_1_0) {
if (instance_version > info.desired_api_version) { if (instance_version > info.desired_api_version) {
instance_version = info.desired_api_version; instance_version = info.desired_api_version;
} }
if (info.desired_api_version > api_version && instance_version >= VKB_VK_API_VERSION_1_1){ if (api_version > info.desired_api_version) {
api_version = info.desired_api_version; api_version = info.desired_api_version;
} }
} }
@ -748,8 +750,7 @@ detail::Result<Instance> InstanceBuilder::build() const {
instance.supports_properties2_ext = supports_properties2_ext; instance.supports_properties2_ext = supports_properties2_ext;
instance.allocation_callbacks = info.allocation_callbacks; instance.allocation_callbacks = info.allocation_callbacks;
instance.instance_version = instance_version; instance.instance_version = instance_version;
instance.required_version = info.required_api_version; instance.api_version = api_version;
instance.max_api_version = api_version;
instance.fp_vkGetInstanceProcAddr = detail::vulkan_functions().ptr_vkGetInstanceProcAddr; instance.fp_vkGetInstanceProcAddr = detail::vulkan_functions().ptr_vkGetInstanceProcAddr;
instance.fp_vkGetDeviceProcAddr = detail::vulkan_functions().fp_vkGetDeviceProcAddr; instance.fp_vkGetDeviceProcAddr = detail::vulkan_functions().fp_vkGetDeviceProcAddr;
return instance; return instance;
@ -789,6 +790,14 @@ InstanceBuilder& InstanceBuilder::require_api_version(uint32_t major, uint32_t m
info.required_api_version = VKB_MAKE_VK_VERSION(0, major, minor, patch); info.required_api_version = VKB_MAKE_VK_VERSION(0, major, minor, patch);
return *this; return *this;
} }
InstanceBuilder& InstanceBuilder::set_minimum_instance_version(uint32_t minimum_instance_version) {
info.minimum_instance_version = minimum_instance_version;
return *this;
}
InstanceBuilder& InstanceBuilder::set_minimum_instance_version(uint32_t major, uint32_t minor, uint32_t patch) {
info.minimum_instance_version = VKB_MAKE_VK_VERSION(0, major, minor, patch);
return *this;
}
InstanceBuilder& InstanceBuilder::desire_api_version(uint32_t preferred_vulkan_version) { InstanceBuilder& InstanceBuilder::desire_api_version(uint32_t preferred_vulkan_version) {
info.desired_api_version = preferred_vulkan_version; info.desired_api_version = preferred_vulkan_version;
return *this; return *this;
@ -1173,8 +1182,8 @@ PhysicalDeviceSelector::PhysicalDeviceSelector(Instance const& instance) {
instance_info.version = instance.instance_version; instance_info.version = instance.instance_version;
instance_info.supports_properties2_ext = instance.supports_properties2_ext; instance_info.supports_properties2_ext = instance.supports_properties2_ext;
criteria.require_present = !instance.headless; criteria.require_present = !instance.headless;
criteria.required_version = instance.required_version; criteria.required_version = instance.api_version;
criteria.desired_version = instance.max_api_version; criteria.desired_version = instance.api_version;
} }
detail::Result<PhysicalDevice> PhysicalDeviceSelector::select() const { detail::Result<PhysicalDevice> PhysicalDeviceSelector::select() const {

View File

@ -282,8 +282,7 @@ struct Instance {
bool headless = false; bool headless = false;
bool supports_properties2_ext = false; bool supports_properties2_ext = false;
uint32_t instance_version = VKB_VK_API_VERSION_1_0; uint32_t instance_version = VKB_VK_API_VERSION_1_0;
uint32_t required_version = VKB_VK_API_VERSION_1_0; uint32_t api_version = VKB_VK_API_VERSION_1_0;
uint32_t max_api_version = VKB_VK_API_VERSION_1_0;
friend class InstanceBuilder; friend class InstanceBuilder;
friend class PhysicalDeviceSelector; friend class PhysicalDeviceSelector;
@ -340,16 +339,24 @@ class InstanceBuilder {
// Sets the (major, minor, patch) version of the engine. // Sets the (major, minor, patch) version of the engine.
InstanceBuilder& set_engine_version(uint32_t major, uint32_t minor, uint32_t patch = 0); InstanceBuilder& set_engine_version(uint32_t major, uint32_t minor, uint32_t patch = 0);
// Require a vulkan instance API version. Will fail to create if this version isn't available. // Require a vulkan API version. Will fail to create if this version isn't available.
// Should be constructed with VK_MAKE_VERSION or VK_MAKE_API_VERSION. // Should be constructed with VK_MAKE_VERSION or VK_MAKE_API_VERSION.
InstanceBuilder& require_api_version(uint32_t required_api_version); InstanceBuilder& require_api_version(uint32_t required_api_version);
// Require a vulkan instance API version. Will fail to create if this version isn't available. // Require a vulkan API version. Will fail to create if this version isn't available.
InstanceBuilder& require_api_version(uint32_t major, uint32_t minor, uint32_t patch = 0); InstanceBuilder& require_api_version(uint32_t major, uint32_t minor, uint32_t patch = 0);
// Overrides required API version for instance creation. Will fail to create if this version isn't available.
// Should be constructed with VK_MAKE_VERSION or VK_MAKE_API_VERSION.
InstanceBuilder& set_minimum_instance_version(uint32_t minimum_instance_version);
// Overrides required API version for instance creation. Will fail to create if this version isn't available.
InstanceBuilder& set_minimum_instance_version(uint32_t major, uint32_t minor, uint32_t patch = 0);
// Prefer a vulkan instance API version. If the desired version isn't available, it will use the // Prefer a vulkan instance API version. If the desired version isn't available, it will use the
// highest version available. Should be constructed with VK_MAKE_VERSION or VK_MAKE_API_VERSION. // highest version available. Should be constructed with VK_MAKE_VERSION or VK_MAKE_API_VERSION.
[[deprecated("Use require_api_version + set_minimum_instance_version instead.")]]
InstanceBuilder& desire_api_version(uint32_t preferred_vulkan_version); InstanceBuilder& desire_api_version(uint32_t preferred_vulkan_version);
// Prefer a vulkan instance API version. If the desired version isn't available, it will use the highest version available. // Prefer a vulkan instance API version. If the desired version isn't available, it will use the highest version available.
[[deprecated("Use require_api_version + set_minimum_instance_version instead.")]]
InstanceBuilder& desire_api_version(uint32_t major, uint32_t minor, uint32_t patch = 0); InstanceBuilder& desire_api_version(uint32_t major, uint32_t minor, uint32_t patch = 0);
// Adds a layer to be enabled. Will fail to create an instance if the layer isn't available. // Adds a layer to be enabled. Will fail to create an instance if the layer isn't available.
@ -402,6 +409,7 @@ class InstanceBuilder {
const char* engine_name = nullptr; const char* engine_name = nullptr;
uint32_t application_version = 0; uint32_t application_version = 0;
uint32_t engine_version = 0; uint32_t engine_version = 0;
uint32_t minimum_instance_version = 0;
uint32_t required_api_version = VKB_VK_API_VERSION_1_0; uint32_t required_api_version = VKB_VK_API_VERSION_1_0;
uint32_t desired_api_version = VKB_VK_API_VERSION_1_0; uint32_t desired_api_version = VKB_VK_API_VERSION_1_0;
@ -540,6 +548,7 @@ class PhysicalDeviceSelector {
PhysicalDeviceSelector& add_desired_extensions(std::vector<const char*> extensions); PhysicalDeviceSelector& add_desired_extensions(std::vector<const char*> extensions);
// Prefer a physical device that supports a (major, minor) version of vulkan. // Prefer a physical device that supports a (major, minor) version of vulkan.
[[deprecated("Use set_minimum_version + InstanceBuilder::require_api_version.")]]
PhysicalDeviceSelector& set_desired_version(uint32_t major, uint32_t minor); PhysicalDeviceSelector& set_desired_version(uint32_t major, uint32_t minor);
// Require a physical device that supports a (major, minor) version of vulkan. // Require a physical device that supports a (major, minor) version of vulkan.
PhysicalDeviceSelector& set_minimum_version(uint32_t major, uint32_t minor); PhysicalDeviceSelector& set_minimum_version(uint32_t major, uint32_t minor);

View File

@ -30,7 +30,10 @@ TEST_CASE("Instance with surface", "[VkBootstrap.bootstrap]") {
REQUIRE(sys_info_ret); REQUIRE(sys_info_ret);
vkb::InstanceBuilder instance_builder; vkb::InstanceBuilder instance_builder;
auto instance_ret = instance_builder.use_default_debug_messenger().build(); auto instance_ret = instance_builder.require_api_version(1, 1, 0)
.set_minimum_instance_version(1, 0, 0)
.use_default_debug_messenger()
.build();
REQUIRE(instance_ret); REQUIRE(instance_ret);
vkb::Instance instance = instance_ret.value(); vkb::Instance instance = instance_ret.value();
auto surface = create_surface_glfw(instance.instance, window); auto surface = create_surface_glfw(instance.instance, window);
@ -59,7 +62,6 @@ TEST_CASE("Instance with surface", "[VkBootstrap.bootstrap]") {
.add_desired_extension(VK_KHR_MULTIVIEW_EXTENSION_NAME) .add_desired_extension(VK_KHR_MULTIVIEW_EXTENSION_NAME)
.add_required_extension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME) .add_required_extension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)
.set_minimum_version(1, 0) .set_minimum_version(1, 0)
.set_desired_version(1, 1)
.select(); .select();
REQUIRE(phys_dev_ret.has_value()); REQUIRE(phys_dev_ret.has_value());
} }