Browse Source

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.
pull/605/head
Vladimír Vondruš 4 years ago
parent
commit
441156542e
  1. 18
      src/Magnum/Vk/Device.cpp
  2. 5
      src/Magnum/Vk/Device.h
  3. 8
      src/Magnum/Vk/DeviceCreateInfo.h
  4. 7
      src/Magnum/Vk/DeviceProperties.cpp
  5. 11
      src/Magnum/Vk/DeviceProperties.h
  6. 9
      src/Magnum/Vk/ExtensionProperties.cpp
  7. 20
      src/Magnum/Vk/ExtensionProperties.h
  8. 18
      src/Magnum/Vk/Instance.cpp
  9. 5
      src/Magnum/Vk/Instance.h
  10. 8
      src/Magnum/Vk/InstanceCreateInfo.h
  11. 1
      src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp
  12. 4
      src/Magnum/Vk/Test/DeviceVkTest.cpp
  13. 1
      src/Magnum/Vk/Test/ExtensionPropertiesVkTest.cpp
  14. 1
      src/Magnum/Vk/Test/InstanceVkTest.cpp

18
src/Magnum/Vk/Device.cpp

@ -290,7 +290,7 @@ DeviceCreateInfo& DeviceCreateInfo::operator=(DeviceCreateInfo&& other) noexcept
return *this;
}
DeviceCreateInfo& DeviceCreateInfo::addEnabledExtensions(const Containers::ArrayView<const Containers::StringView> 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<const Containers::StringView> extensions) && {
return std::move(addEnabledExtensions(extensions));
}
DeviceCreateInfo& DeviceCreateInfo::addEnabledExtensions(const std::initializer_list<Containers::StringView> extensions) & {
return addEnabledExtensions(Containers::arrayView(extensions));
}
DeviceCreateInfo&& DeviceCreateInfo::addEnabledExtensions(const std::initializer_list<Containers::StringView> 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<const Containers::StringView> 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<Containers::StringView> 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);
}

5
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<const Containers::StringView> enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {});
/** @overload */
void wrap(Instance& instance, VkPhysicalDevice physicalDevice, VkDevice handle, Version version, std::initializer_list<Containers::StringView> 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

8
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<const Containers::StringView> extensions) &;
DeviceCreateInfo& addEnabledExtensions(const Containers::StringIterable& extensions) &;
/** @overload */
DeviceCreateInfo&& addEnabledExtensions(Containers::ArrayView<const Containers::StringView> extensions) &&;
/** @overload */
DeviceCreateInfo& addEnabledExtensions(std::initializer_list<Containers::StringView> extension) &;
/** @overload */
DeviceCreateInfo&& addEnabledExtensions(std::initializer_list<Containers::StringView> extension) &&;
DeviceCreateInfo&& addEnabledExtensions(const Containers::StringIterable& extensions) &&;
/** @overload */
DeviceCreateInfo& addEnabledExtensions(Containers::ArrayView<const Extension> extensions) &;
/** @overload */

7
src/Magnum/Vk/DeviceProperties.cpp

@ -29,6 +29,7 @@
#include <Corrade/Containers/EnumSet.hpp>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StaticArray.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringView.h>
#include <Corrade/Utility/Arguments.h>
#include <Corrade/Utility/Debug.h>
@ -237,15 +238,15 @@ void DeviceProperties::getFeaturesImplementation11(DeviceProperties& self, VkPhy
return (**self._instance).GetPhysicalDeviceFeatures2(self._handle, &features);
}
ExtensionProperties DeviceProperties::enumerateExtensionProperties(Containers::ArrayView<const Containers::StringView> 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<DeviceProperties*>(state);
return (**deviceProperties._instance).EnumerateDeviceExtensionProperties(deviceProperties._handle, layer, count, properties);
}, this};
}
ExtensionProperties DeviceProperties::enumerateExtensionProperties(std::initializer_list<Containers::StringView> layers) {
return enumerateExtensionProperties(Containers::arrayView(layers));
ExtensionProperties DeviceProperties::enumerateExtensionProperties() {
return enumerateExtensionProperties({});
}
const ExtensionProperties& DeviceProperties::extensionPropertiesInternal() {

11
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<const Containers::StringView> layers = {});
/** @overload */
ExtensionProperties enumerateExtensionProperties(std::initializer_list<Containers::StringView> 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

9
src/Magnum/Vk/ExtensionProperties.cpp

@ -27,6 +27,7 @@
#include <algorithm> /* std::lower_bound() */
#include <Corrade/Containers/String.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringView.h>
#include <Corrade/Utility/Assert.h>
#include <Corrade/Utility/Debug.h>
@ -45,7 +46,7 @@ ExtensionProperties::~ExtensionProperties() = default;
ExtensionProperties& ExtensionProperties::operator=(ExtensionProperties&&) noexcept = default;
ExtensionProperties::ExtensionProperties(const Containers::ArrayView<const Containers::StringView> 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<const Containers::StringView> 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<Containers::StringView> layers) {
return enumerateInstanceExtensionProperties(Containers::arrayView(layers));
InstanceExtensionProperties enumerateInstanceExtensionProperties() {
return enumerateInstanceExtensionProperties({});
}
}}

20
src/Magnum/Vk/ExtensionProperties.h

@ -183,7 +183,7 @@ class MAGNUM_VK_EXPORT ExtensionProperties {
private:
friend class InstanceExtensionProperties;
explicit ExtensionProperties(const Containers::ArrayView<const Containers::StringView> 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<VkExtensionProperties> _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<const Containers::StringView>);
friend MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(const Containers::StringIterable&);
#endif
explicit InstanceExtensionProperties(const Containers::ArrayView<const Containers::StringView> 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<const Containers::StringView> layers = {});
/**
* @overload
* @m_since_latest
*/
MAGNUM_VK_EXPORT InstanceExtensionProperties enumerateInstanceExtensionProperties(std::initializer_list<Containers::StringView> 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
}}

18
src/Magnum/Vk/Instance.cpp

@ -174,7 +174,7 @@ InstanceCreateInfo& InstanceCreateInfo::setApplicationInfo(const Containers::Str
return *this;
}
InstanceCreateInfo& InstanceCreateInfo::addEnabledLayers(const Containers::ArrayView<const Containers::StringView> 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<Containers::StringView> layers) {
return addEnabledLayers(Containers::arrayView(layers));
}
InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const Containers::ArrayView<const Containers::StringView> 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<Containers::StringView> extensions) {
return addEnabledExtensions(Containers::arrayView(extensions));
}
InstanceCreateInfo& InstanceCreateInfo::addEnabledExtensions(const Containers::ArrayView<const InstanceExtension> 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<const Containers::StringView> 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<Containers::StringView> enabledExtensions, const HandleFlags flags) {
wrap(handle, version, Containers::arrayView(enabledExtensions), flags);
}
Instance::Instance(const InstanceCreateInfo& info): Instance{NoCreate} {
create(info);
}

5
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<const Containers::StringView> enabledExtensions, HandleFlags flags = {});
/** @overload */
void wrap(VkInstance handle, Version version, std::initializer_list<Containers::StringView> enabledExtensions, HandleFlags flags = {});
void wrap(VkInstance handle, Version version, const Containers::StringIterable& enabledExtensions, HandleFlags flags = {});
/**
* @brief Constructor

8
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<const Containers::StringView> layers);
/** @overload */
InstanceCreateInfo& addEnabledLayers(std::initializer_list<Containers::StringView> 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<const Containers::StringView> extensions);
/** @overload */
InstanceCreateInfo& addEnabledExtensions(std::initializer_list<Containers::StringView> extension);
InstanceCreateInfo& addEnabledExtensions(const Containers::StringIterable& extensions);
/** @overload */
InstanceCreateInfo& addEnabledExtensions(Containers::ArrayView<const InstanceExtension> extensions);
/** @overload */

1
src/Magnum/Vk/Test/DevicePropertiesVkTest.cpp

@ -27,6 +27,7 @@
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringStl.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringView.h>
#include <Corrade/TestSuite/Compare/Numeric.h>
#include <Corrade/Utility/DebugStl.h>

4
src/Magnum/Vk/Test/DeviceVkTest.cpp

@ -26,6 +26,7 @@
#include <sstream>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringStl.h>
#include <Corrade/TestSuite/Compare/Numeric.h>
#include <Corrade/Utility/DebugStl.h>
@ -563,8 +564,7 @@ void DeviceVkTest::createInfoRvalue() {
rawQueueInfo.queueCount = 1;
DeviceCreateInfo&& info = DeviceCreateInfo{pickDevice(instance())}
.addEnabledExtensions(Containers::ArrayView<const Containers::StringView>{})
.addEnabledExtensions(std::initializer_list<Containers::StringView>{})
.addEnabledExtensions(Containers::StringIterable{})
.addEnabledExtensions(Containers::ArrayView<const Extension>{})
.addEnabledExtensions(std::initializer_list<Extension>{})
.addEnabledExtensions<>()

1
src/Magnum/Vk/Test/ExtensionPropertiesVkTest.cpp

@ -24,6 +24,7 @@
*/
#include <sstream>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringStl.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Numeric.h>

1
src/Magnum/Vk/Test/InstanceVkTest.cpp

@ -25,6 +25,7 @@
#include <sstream>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringStl.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Numeric.h>

Loading…
Cancel
Save