From 441156542e84e2fb7046e98f59f8b791ae388320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 7 Nov 2022 21:17:27 +0100 Subject: [PATCH] Vk: use StringIterable for all extension/layer/workaround lists. No backwards compatibility headers as the whole Vulkan wrapper is still considered experimental. So people should expect pain and suffering. --- src/Magnum/Vk/Device.cpp | 18 +++-------------- src/Magnum/Vk/Device.h | 5 +---- src/Magnum/Vk/DeviceCreateInfo.h | 8 ++------ src/Magnum/Vk/DeviceProperties.cpp | 7 ++++--- src/Magnum/Vk/DeviceProperties.h | 11 ++++++---- src/Magnum/Vk/ExtensionProperties.cpp | 9 +++++---- src/Magnum/Vk/ExtensionProperties.h | 20 +++++++++---------- src/Magnum/Vk/Instance.cpp | 18 +++-------------- src/Magnum/Vk/Instance.h | 5 +---- src/Magnum/Vk/InstanceCreateInfo.h | 8 ++------ src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp | 1 + src/Magnum/Vk/Test/DeviceVkTest.cpp | 4 ++-- .../Vk/Test/ExtensionPropertiesVkTest.cpp | 1 + src/Magnum/Vk/Test/InstanceVkTest.cpp | 1 + 14 files changed, 43 insertions(+), 73 deletions(-) diff --git a/src/Magnum/Vk/Device.cpp b/src/Magnum/Vk/Device.cpp index db0ef3d6e..d6a6f4f23 100644 --- a/src/Magnum/Vk/Device.cpp +++ b/src/Magnum/Vk/Device.cpp @@ -290,7 +290,7 @@ DeviceCreateInfo& DeviceCreateInfo::operator=(DeviceCreateInfo&& other) noexcept return *this; } -DeviceCreateInfo& DeviceCreateInfo::addEnabledExtensions(const Containers::ArrayView extensions) & { +DeviceCreateInfo& DeviceCreateInfo::addEnabledExtensions(const Containers::StringIterable& extensions) & { if(extensions.isEmpty()) return *this; /* This can happen in case we used the NoInit or VkDeviceCreateInfo constructor */ @@ -322,15 +322,7 @@ DeviceCreateInfo& DeviceCreateInfo::addEnabledExtensions(const Containers::Array return *this; } -DeviceCreateInfo&& DeviceCreateInfo::addEnabledExtensions(const Containers::ArrayView extensions) && { - return std::move(addEnabledExtensions(extensions)); -} - -DeviceCreateInfo& DeviceCreateInfo::addEnabledExtensions(const std::initializer_list extensions) & { - return addEnabledExtensions(Containers::arrayView(extensions)); -} - -DeviceCreateInfo&& DeviceCreateInfo::addEnabledExtensions(const std::initializer_list extensions) && { +DeviceCreateInfo&& DeviceCreateInfo::addEnabledExtensions(const Containers::StringIterable& extensions) && { return std::move(addEnabledExtensions(extensions)); } @@ -661,7 +653,7 @@ constexpr Version KnownVersionsForExtensions[]{ } -void Device::wrap(Instance& instance, const VkPhysicalDevice physicalDevice, const VkDevice handle, const Version version, const Containers::ArrayView enabledExtensions, const DeviceFeatures& enabledFeatures, const HandleFlags flags) { +void Device::wrap(Instance& instance, const VkPhysicalDevice physicalDevice, const VkDevice handle, const Version version, const Containers::StringIterable& enabledExtensions, const DeviceFeatures& enabledFeatures, const HandleFlags flags) { CORRADE_ASSERT(!_handle, "Vk::Device::wrap(): device already created", ); @@ -677,10 +669,6 @@ void Device::wrap(Instance& instance, const VkPhysicalDevice physicalDevice, con initialize(instance, version, enabledExtensions, encounteredWorkarounds, enabledFeatures); } -void Device::wrap(Instance& instance, const VkPhysicalDevice physicalDevice, const VkDevice handle, const Version version, const std::initializer_list enabledExtensions, const DeviceFeatures& enabledFeatures, const HandleFlags flags) { - wrap(instance, physicalDevice, handle, version, Containers::arrayView(enabledExtensions), enabledFeatures, flags); -} - Device::Device(Instance& instance, const DeviceCreateInfo& info): Device{NoCreate} { create(instance, info); } diff --git a/src/Magnum/Vk/Device.h b/src/Magnum/Vk/Device.h index 93e5019da..e71196f78 100644 --- a/src/Magnum/Vk/Device.h +++ b/src/Magnum/Vk/Device.h @@ -273,10 +273,7 @@ class MAGNUM_VK_EXPORT Device { * for different behavior. * @see @ref release() */ - void wrap(Instance& instance, VkPhysicalDevice physicalDevice, VkDevice handle, Version version, Containers::ArrayView enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); - - /** @overload */ - void wrap(Instance& instance, VkPhysicalDevice physicalDevice, VkDevice handle, Version version, std::initializer_list enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); + void wrap(Instance& instance, VkPhysicalDevice physicalDevice, VkDevice handle, Version version, const Containers::StringIterable& enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); /** * @brief Constructor diff --git a/src/Magnum/Vk/DeviceCreateInfo.h b/src/Magnum/Vk/DeviceCreateInfo.h index c451c1030..5405cdbe8 100644 --- a/src/Magnum/Vk/DeviceCreateInfo.h +++ b/src/Magnum/Vk/DeviceCreateInfo.h @@ -190,13 +190,9 @@ class MAGNUM_VK_EXPORT DeviceCreateInfo { * @link Containers::Literals::operator""_s() @endlink * literal to prevent that where possible. */ - DeviceCreateInfo& addEnabledExtensions(Containers::ArrayView extensions) &; + DeviceCreateInfo& addEnabledExtensions(const Containers::StringIterable& extensions) &; /** @overload */ - DeviceCreateInfo&& addEnabledExtensions(Containers::ArrayView extensions) &&; - /** @overload */ - DeviceCreateInfo& addEnabledExtensions(std::initializer_list extension) &; - /** @overload */ - DeviceCreateInfo&& addEnabledExtensions(std::initializer_list extension) &&; + DeviceCreateInfo&& addEnabledExtensions(const Containers::StringIterable& extensions) &&; /** @overload */ DeviceCreateInfo& addEnabledExtensions(Containers::ArrayView extensions) &; /** @overload */ diff --git a/src/Magnum/Vk/DeviceProperties.cpp b/src/Magnum/Vk/DeviceProperties.cpp index 6af161cfc..c19982175 100644 --- a/src/Magnum/Vk/DeviceProperties.cpp +++ b/src/Magnum/Vk/DeviceProperties.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -237,15 +238,15 @@ void DeviceProperties::getFeaturesImplementation11(DeviceProperties& self, VkPhy return (**self._instance).GetPhysicalDeviceFeatures2(self._handle, &features); } -ExtensionProperties DeviceProperties::enumerateExtensionProperties(Containers::ArrayView layers) { +ExtensionProperties DeviceProperties::enumerateExtensionProperties(const Containers::StringIterable& layers) { return InstanceExtensionProperties{layers, [](void* state, const char* const layer, UnsignedInt* count, VkExtensionProperties* properties) { auto& deviceProperties = *static_cast(state); return (**deviceProperties._instance).EnumerateDeviceExtensionProperties(deviceProperties._handle, layer, count, properties); }, this}; } -ExtensionProperties DeviceProperties::enumerateExtensionProperties(std::initializer_list layers) { - return enumerateExtensionProperties(Containers::arrayView(layers)); +ExtensionProperties DeviceProperties::enumerateExtensionProperties() { + return enumerateExtensionProperties({}); } const ExtensionProperties& DeviceProperties::extensionPropertiesInternal() { diff --git a/src/Magnum/Vk/DeviceProperties.h b/src/Magnum/Vk/DeviceProperties.h index 973d67521..3e547ef71 100644 --- a/src/Magnum/Vk/DeviceProperties.h +++ b/src/Magnum/Vk/DeviceProperties.h @@ -405,10 +405,13 @@ class MAGNUM_VK_EXPORT DeviceProperties { * @see @ref LayerProperties::isSupported(), * @fn_vk_keyword{EnumerateDeviceExtensionProperties} */ - ExtensionProperties enumerateExtensionProperties(Containers::ArrayView layers = {}); - - /** @overload */ - ExtensionProperties enumerateExtensionProperties(std::initializer_list layers); + #ifdef DOXYGEN_GENERATING_OUTPUT + ExtensionProperties enumerateExtensionProperties(const Containers::StringIterable& layers = {}); + #else + /* To avoid including StringIterable */ + ExtensionProperties enumerateExtensionProperties(const Containers::StringIterable& layers); + ExtensionProperties enumerateExtensionProperties(); + #endif /** * @brief Device features diff --git a/src/Magnum/Vk/ExtensionProperties.cpp b/src/Magnum/Vk/ExtensionProperties.cpp index bfe471b07..7ced981ec 100644 --- a/src/Magnum/Vk/ExtensionProperties.cpp +++ b/src/Magnum/Vk/ExtensionProperties.cpp @@ -27,6 +27,7 @@ #include /* std::lower_bound() */ #include +#include #include #include #include @@ -45,7 +46,7 @@ ExtensionProperties::~ExtensionProperties() = default; ExtensionProperties& ExtensionProperties::operator=(ExtensionProperties&&) noexcept = default; -ExtensionProperties::ExtensionProperties(const Containers::ArrayView layers, VkResult(*const enumerator)(void*, const char*, UnsignedInt*, VkExtensionProperties*), void* const state) { +ExtensionProperties::ExtensionProperties(const Containers::StringIterable& layers, VkResult(*const enumerator)(void*, const char*, UnsignedInt*, VkExtensionProperties*), void* const state) { /* Retrieve total extension count for all layers + the global extensions */ std::size_t totalCount = 0; for(std::size_t i = 0; i <= layers.size(); ++i) { @@ -186,14 +187,14 @@ UnsignedInt InstanceExtensionProperties::revision(const InstanceExtension& exten return revision(extension.string()); } -InstanceExtensionProperties enumerateInstanceExtensionProperties(const Containers::ArrayView layers) { +InstanceExtensionProperties enumerateInstanceExtensionProperties(const Containers::StringIterable& layers) { return InstanceExtensionProperties{layers, [](void*, const char* const layer, UnsignedInt* count, VkExtensionProperties* properties) { return vkEnumerateInstanceExtensionProperties(layer, count, properties); }, nullptr}; } -InstanceExtensionProperties enumerateInstanceExtensionProperties(const std::initializer_list layers) { - return enumerateInstanceExtensionProperties(Containers::arrayView(layers)); +InstanceExtensionProperties enumerateInstanceExtensionProperties() { + return enumerateInstanceExtensionProperties({}); } }} diff --git a/src/Magnum/Vk/ExtensionProperties.h b/src/Magnum/Vk/ExtensionProperties.h index 07717b840..509c836a9 100644 --- a/src/Magnum/Vk/ExtensionProperties.h +++ b/src/Magnum/Vk/ExtensionProperties.h @@ -183,7 +183,7 @@ class MAGNUM_VK_EXPORT ExtensionProperties { private: friend class InstanceExtensionProperties; - explicit ExtensionProperties(const Containers::ArrayView layers, VkResult(*enumerator)(void*, const char*, UnsignedInt*, VkExtensionProperties*), void* state); + explicit ExtensionProperties(const Containers::StringIterable& layers, VkResult(*enumerator)(void*, const char*, UnsignedInt*, VkExtensionProperties*), void* state); Containers::ArrayTuple _data; Containers::ArrayView _extensions; @@ -257,10 +257,10 @@ class MAGNUM_VK_EXPORT InstanceExtensionProperties: public ExtensionProperties { /* The DAMN THING forgets parameter name if this is present, FFS. It also lists this among friends, which is AN IMPLEMENTATION DETAIL */ friend DeviceProperties; - friend MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(Containers::ArrayView); + friend MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(const Containers::StringIterable&); #endif - explicit InstanceExtensionProperties(const Containers::ArrayView layers, VkResult(*enumerator)(void*, const char*, UnsignedInt*, VkExtensionProperties*), void* state): ExtensionProperties{layers, enumerator, state} {} + explicit InstanceExtensionProperties(const Containers::StringIterable& layers, VkResult(*enumerator)(void*, const char*, UnsignedInt*, VkExtensionProperties*), void* state): ExtensionProperties{layers, enumerator, state} {} }; /** @@ -272,13 +272,13 @@ Expects that all listed layers are supported. @see @ref LayerProperties::isSupported(), @fn_vk_keyword{EnumerateExtensionProperties} */ -MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(Containers::ArrayView layers = {}); - -/** - * @overload - * @m_since_latest - */ -MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(std::initializer_list layers); +#ifdef DOXYGEN_GENERATING_OUTPUT +MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(const Containers::StringIterable& layers = {}); +#else +/* To avoid including StringIterable */ +MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(const Containers::StringIterable& layers); +MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(); +#endif }} diff --git a/src/Magnum/Vk/Instance.cpp b/src/Magnum/Vk/Instance.cpp index d8b628526..e22c21125 100644 --- a/src/Magnum/Vk/Instance.cpp +++ b/src/Magnum/Vk/Instance.cpp @@ -174,7 +174,7 @@ InstanceCreateInfo& InstanceCreateInfo::setApplicationInfo(const Containers::Str return *this; } -InstanceCreateInfo& InstanceCreateInfo::addEnabledLayers(const Containers::ArrayView layers) { +InstanceCreateInfo& InstanceCreateInfo::addEnabledLayers(const Containers::StringIterable& layers) { if(layers.isEmpty()) return *this; if(!_state) _state.emplace(); @@ -204,11 +204,7 @@ InstanceCreateInfo& InstanceCreateInfo::addEnabledLayers(const Containers::Array return *this; } -InstanceCreateInfo& InstanceCreateInfo::addEnabledLayers(const std::initializer_list layers) { - return addEnabledLayers(Containers::arrayView(layers)); -} - -InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const Containers::ArrayView extensions) { +InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const Containers::StringIterable& extensions) { if(extensions.isEmpty()) return *this; if(!_state) _state.emplace(); @@ -238,10 +234,6 @@ InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const Containers::A return *this; } -InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const std::initializer_list extensions) { - return addEnabledExtensions(Containers::arrayView(extensions)); -} - InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const Containers::ArrayView extensions) { if(extensions.isEmpty()) return *this; if(!_state) _state.emplace(); @@ -265,7 +257,7 @@ InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const std::initiali return addEnabledExtensions(Containers::arrayView(extensions)); } -void Instance::wrap(const VkInstance handle, const Version version, const Containers::ArrayView enabledExtensions, const HandleFlags flags) { +void Instance::wrap(const VkInstance handle, const Version version, const Containers::StringIterable& enabledExtensions, const HandleFlags flags) { CORRADE_ASSERT(!_handle, "Vk::Instance::wrap(): instance already created", ); @@ -276,10 +268,6 @@ void Instance::wrap(const VkInstance handle, const Version version, const Contai initialize(version, enabledExtensions, 0, nullptr); } -void Instance::wrap(const VkInstance handle, const Version version, const std::initializer_list enabledExtensions, const HandleFlags flags) { - wrap(handle, version, Containers::arrayView(enabledExtensions), flags); -} - Instance::Instance(const InstanceCreateInfo& info): Instance{NoCreate} { create(info); } diff --git a/src/Magnum/Vk/Instance.h b/src/Magnum/Vk/Instance.h index af9ae28d8..a8b7538bf 100644 --- a/src/Magnum/Vk/Instance.h +++ b/src/Magnum/Vk/Instance.h @@ -248,10 +248,7 @@ class MAGNUM_VK_EXPORT Instance { * behavior. * @see @ref release() */ - void wrap(VkInstance handle, Version version, Containers::ArrayView enabledExtensions, HandleFlags flags = {}); - - /** @overload */ - void wrap(VkInstance handle, Version version, std::initializer_list enabledExtensions, HandleFlags flags = {}); + void wrap(VkInstance handle, Version version, const Containers::StringIterable& enabledExtensions, HandleFlags flags = {}); /** * @brief Constructor diff --git a/src/Magnum/Vk/InstanceCreateInfo.h b/src/Magnum/Vk/InstanceCreateInfo.h index 9ca5eabab..2a95efd19 100644 --- a/src/Magnum/Vk/InstanceCreateInfo.h +++ b/src/Magnum/Vk/InstanceCreateInfo.h @@ -183,9 +183,7 @@ class MAGNUM_VK_EXPORT InstanceCreateInfo { * @link Containers::Literals::operator""_s() @endlink literal to * prevent that where possible. */ - InstanceCreateInfo& addEnabledLayers(Containers::ArrayView layers); - /** @overload */ - InstanceCreateInfo& addEnabledLayers(std::initializer_list layers); + InstanceCreateInfo& addEnabledLayers(const Containers::StringIterable& layers); /** * @brief Add enabled instance extensions @@ -213,9 +211,7 @@ class MAGNUM_VK_EXPORT InstanceCreateInfo { * @link Containers::Literals::operator""_s() @endlink literal to * prevent that where possible. */ - InstanceCreateInfo& addEnabledExtensions(Containers::ArrayView extensions); - /** @overload */ - InstanceCreateInfo& addEnabledExtensions(std::initializer_list extension); + InstanceCreateInfo& addEnabledExtensions(const Containers::StringIterable& extensions); /** @overload */ InstanceCreateInfo& addEnabledExtensions(Containers::ArrayView extensions); /** @overload */ diff --git a/src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp b/src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp index a10de6f2d..32a84126b 100644 --- a/src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp +++ b/src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Magnum/Vk/Test/DeviceVkTest.cpp b/src/Magnum/Vk/Test/DeviceVkTest.cpp index d4cb6cc8f..89da474fd 100644 --- a/src/Magnum/Vk/Test/DeviceVkTest.cpp +++ b/src/Magnum/Vk/Test/DeviceVkTest.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -563,8 +564,7 @@ void DeviceVkTest::createInfoRvalue() { rawQueueInfo.queueCount = 1; DeviceCreateInfo&& info = DeviceCreateInfo{pickDevice(instance())} - .addEnabledExtensions(Containers::ArrayView{}) - .addEnabledExtensions(std::initializer_list{}) + .addEnabledExtensions(Containers::StringIterable{}) .addEnabledExtensions(Containers::ArrayView{}) .addEnabledExtensions(std::initializer_list{}) .addEnabledExtensions<>() diff --git a/src/Magnum/Vk/Test/ExtensionPropertiesVkTest.cpp b/src/Magnum/Vk/Test/ExtensionPropertiesVkTest.cpp index c4e092f59..f1ac01a60 100644 --- a/src/Magnum/Vk/Test/ExtensionPropertiesVkTest.cpp +++ b/src/Magnum/Vk/Test/ExtensionPropertiesVkTest.cpp @@ -24,6 +24,7 @@ */ #include +#include #include #include #include diff --git a/src/Magnum/Vk/Test/InstanceVkTest.cpp b/src/Magnum/Vk/Test/InstanceVkTest.cpp index c2b138f7a..f4e78e584 100644 --- a/src/Magnum/Vk/Test/InstanceVkTest.cpp +++ b/src/Magnum/Vk/Test/InstanceVkTest.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include