diff --git a/src/Magnum/Vk/Device.cpp b/src/Magnum/Vk/Device.cpp index 9e33cc0ec..01c5a5868 100644 --- a/src/Magnum/Vk/Device.cpp +++ b/src/Magnum/Vk/Device.cpp @@ -612,7 +612,7 @@ constexpr Version KnownVersionsForExtensions[]{ } -void Device::wrap(Instance& instance, 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::ArrayView enabledExtensions, const DeviceFeatures& enabledFeatures, const HandleFlags flags) { CORRADE_ASSERT(!_handle, "Vk::Device::wrap(): device already created", ); @@ -620,12 +620,13 @@ void Device::wrap(Instance& instance, const VkDevice handle, const Version versi repeating what was passed via the arguments */ _handle = handle; _flags = flags; + _properties.emplace(DeviceProperties::wrap(instance, physicalDevice)); initializeExtensions(enabledExtensions); initialize(instance, version, enabledFeatures); } -void Device::wrap(Instance& instance, const VkDevice handle, const Version version, const std::initializer_list enabledExtensions, const DeviceFeatures& enabledFeatures, const HandleFlags flags) { - wrap(instance, handle, version, Containers::arrayView(enabledExtensions), enabledFeatures, flags); +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} { diff --git a/src/Magnum/Vk/Device.h b/src/Magnum/Vk/Device.h index b9366d73f..000b7ab39 100644 --- a/src/Magnum/Vk/Device.h +++ b/src/Magnum/Vk/Device.h @@ -209,15 +209,17 @@ class MAGNUM_VK_EXPORT Device { public: /** * @brief Wrap existing Vulkan handle - * @param instance Vulkan instance the device is created on - * @param handle The @type_vk{Device} handle - * @param version Vulkan version that's assumed to be used on the - * device + * @param instance Vulkan instance the device is created on + * @param physicalDevice Physical device the @type_vk{VkDevice} was + * created from. Used to populate @ref properties(). + * @param handle The @type_vk{Device} handle + * @param version Vulkan version that's assumed to be used on + * the device * @param enabledExtensions Extensions that are assumed to be enabled * on the device - * @param enabledFeatures Features that are assumed to be enabled on + * @param enabledFeatures Features that are assumed to be enabled on * the device - * @param flags Handle flags + * @param flags Handle flags * * * @@ -230,14 +232,14 @@ class MAGNUM_VK_EXPORT Device { * instance. See @ref Vk-Device-disabled-move for more * information. * - * The @p handle is expected to be originating from @p instance. The - * @p version, @p enabledExtensions and @p enabledFeatures parameters - * populate internal info about supported version, enabled extensions - * and enabled features and will be reflected in - * @ref isVersionSupported(), @ref isExtensionEnabled() and - * @ref enabledFeatures(), among other things. If @p enabledExtensions - * / @p enabledFeatures is empty, the device will behave as if no - * extensions / no features were enabled. + * The @p handle is expected to be originating from @p instance and + * @p physicalDevice. The @p version, @p enabledExtensions and + * @p enabledFeatures parameters populate internal info about supported + * version, enabled extensions and enabled features and will be + * reflected in @ref isVersionSupported(), @ref isExtensionEnabled() + * and @ref enabledFeatures(), among other things. If + * @p enabledExtensions / @p enabledFeatures is empty, the device will + * behave as if no extensions / no features were enabled. * * Note that this function retrieves all device-specific Vulkan * function pointers, which is a relatively costly operation. It's thus @@ -249,10 +251,10 @@ class MAGNUM_VK_EXPORT Device { * for different behavior. * @see @ref release() */ - void wrap(Instance& instance, VkDevice handle, Version version, Containers::ArrayView enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); + void wrap(Instance& instance, VkPhysicalDevice physicalDevice, VkDevice handle, Version version, Containers::ArrayView enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); /** @overload */ - void wrap(Instance& instance, VkDevice handle, Version version, std::initializer_list enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); + void wrap(Instance& instance, VkPhysicalDevice physicalDevice, VkDevice handle, Version version, std::initializer_list enabledExtensions, const DeviceFeatures& enabledFeatures, HandleFlags flags = {}); /** * @brief Constructor diff --git a/src/Magnum/Vk/Test/DeviceVkTest.cpp b/src/Magnum/Vk/Test/DeviceVkTest.cpp index eee300d2d..77bce304b 100644 --- a/src/Magnum/Vk/Test/DeviceVkTest.cpp +++ b/src/Magnum/Vk/Test/DeviceVkTest.cpp @@ -1081,7 +1081,7 @@ void DeviceVkTest::wrap() { { /* Wrapping should load the basic function pointers */ Device wrapped{NoCreate}; - wrapped.wrap(instance2, device, Version::Vk11, { + wrapped.wrap(instance2, deviceProperties, device, Version::Vk11, { Extensions::EXT::debug_marker::string() }, DeviceFeature::RobustBufferAccess, HandleFlag::DestroyOnDestruction); CORRADE_VERIFY(wrapped->DestroyDevice); @@ -1113,7 +1113,7 @@ void DeviceVkTest::wrap() { /* ...so we can wrap it again, non-owned, and then destroy it manually */ Device wrapped{NoCreate}; - wrapped.wrap(instance2, device, Version::Vk10, {}, {}); + wrapped.wrap(instance2, deviceProperties, device, Version::Vk10, {}, {}); CORRADE_VERIFY(wrapped->DestroyDevice); wrapped->DestroyDevice(device, nullptr); } @@ -1131,7 +1131,7 @@ void DeviceVkTest::wrapAlreadyCreated() { std::ostringstream out; Error redirectError{&out}; - device.wrap(instance(), {}, {}, {}, {}); + device.wrap(instance(), {}, {}, {}, {}, {}); CORRADE_COMPARE(out.str(), "Vk::Device::wrap(): device already created\n"); }