From d53dc06e9cf72e902ed10d3d8152187b15550199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 18 Nov 2020 20:07:27 +0100 Subject: [PATCH] Vk: ability to allocate Buffer directly during construction. Again mirrors what's done in Image. --- src/Magnum/Vk/Buffer.cpp | 9 +++++++++ src/Magnum/Vk/Buffer.h | 18 +++++++++++++++++- src/Magnum/Vk/Test/BufferVkTest.cpp | 24 +++++++++++++++++------- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/Magnum/Vk/Buffer.cpp b/src/Magnum/Vk/Buffer.cpp index d20a76f23..2acd5377e 100644 --- a/src/Magnum/Vk/Buffer.cpp +++ b/src/Magnum/Vk/Buffer.cpp @@ -27,6 +27,7 @@ #include "Magnum/Vk/Assert.h" #include "Magnum/Vk/Device.h" +#include "Magnum/Vk/DeviceProperties.h" #include "Magnum/Vk/Handle.h" #include "Magnum/Vk/Implementation/DeviceState.h" @@ -61,6 +62,14 @@ Buffer::Buffer(Device& device, const BufferCreateInfo& info, NoAllocateT): _devi MAGNUM_VK_INTERNAL_ASSERT_SUCCESS(device->CreateBuffer(device, info, nullptr, &_handle)); } +Buffer::Buffer(Device& device, const BufferCreateInfo& info, const MemoryFlags memoryFlags): Buffer{device, info, NoAllocate} { + const MemoryRequirements requirements = memoryRequirements(); + bindDedicatedMemory(Memory{device, MemoryAllocateInfo{ + requirements.size(), + device.properties().pickMemory(memoryFlags, requirements.memories()) + }}); +} + Buffer::Buffer(NoCreateT): _device{}, _handle{}, _dedicatedMemory{NoCreate} {} Buffer::Buffer(Buffer&& other) noexcept: _device{other._device}, _handle{other._handle}, _flags{other._flags}, _dedicatedMemory{std::move(other._dedicatedMemory)} { diff --git a/src/Magnum/Vk/Buffer.h b/src/Magnum/Vk/Buffer.h index 85eb8c65d..f13edcb17 100644 --- a/src/Magnum/Vk/Buffer.h +++ b/src/Magnum/Vk/Buffer.h @@ -182,10 +182,26 @@ class MAGNUM_VK_EXPORT Buffer { * @param device Vulkan device to create the buffer on * @param info Buffer creation info * - * @see @fn_vk_keyword{CreateBuffer} + * @see @ref Buffer(Device&, const BufferCreateInfo&, MemoryFlags), + * @fn_vk_keyword{CreateBuffer} */ explicit Buffer(Device& device, const BufferCreateInfo& info, NoAllocateT); + /** + * @brief Construct a buffer + * @param device Vulkan device to create the buffer on + * @param info Buffer creation info + * @param memoryFlags Memory allocation flags + * + * Compared to @ref Buffer(Device&, const BufferCreateInfo&, NoAllocateT) + * allocates a memory satisfying @p memoryFlags as well. + * + * @attention At this point, a dedicated allocation is used, + * subsequently accessible through @ref dedicatedMemory(). This + * behavior may change in the future. + */ + explicit Buffer(Device& device, const BufferCreateInfo& info, MemoryFlags memoryFlags); + /** * @brief Construct without creating the buffer * diff --git a/src/Magnum/Vk/Test/BufferVkTest.cpp b/src/Magnum/Vk/Test/BufferVkTest.cpp index 2430115b9..ab75a50a7 100644 --- a/src/Magnum/Vk/Test/BufferVkTest.cpp +++ b/src/Magnum/Vk/Test/BufferVkTest.cpp @@ -46,6 +46,8 @@ struct BufferVkTest: VulkanTester { void bindMemory(); void bindDedicatedMemory(); + + void directAllocation(); }; BufferVkTest::BufferVkTest() { @@ -57,7 +59,9 @@ BufferVkTest::BufferVkTest() { &BufferVkTest::memoryRequirements, &BufferVkTest::bindMemory, - &BufferVkTest::bindDedicatedMemory}); + &BufferVkTest::bindDedicatedMemory, + + &BufferVkTest::directAllocation}); } void BufferVkTest::construct() { @@ -72,13 +76,9 @@ void BufferVkTest::construct() { } void BufferVkTest::constructMove() { - Buffer a{device(), BufferCreateInfo{BufferUsage::StorageBuffer, 1024}, NoAllocate}; - VkBuffer handle = a.handle(); - /* Verify that also the dedicated memory gets moved */ - MemoryRequirements requirements = a.memoryRequirements(); - a.bindDedicatedMemory(Vk::Memory{device(), Vk::MemoryAllocateInfo{requirements.size(), - device().properties().pickMemory(Vk::MemoryFlag::DeviceLocal, requirements.memories())}}); + Buffer a{device(), BufferCreateInfo{BufferUsage::StorageBuffer, 1024}, Vk::MemoryFlag::DeviceLocal}; + VkBuffer handle = a.handle(); VkDeviceMemory memoryHandle = a.dedicatedMemory().handle(); Buffer b = std::move(a); @@ -159,6 +159,16 @@ void BufferVkTest::bindDedicatedMemory() { CORRADE_COMPARE(buffer.dedicatedMemory().handle(), handle); } +void BufferVkTest::directAllocation() { + Buffer buffer{device(), + BufferCreateInfo{BufferUsage::StorageBuffer, 16384}, + Vk::MemoryFlag::DeviceLocal}; + + /* Not sure what else to test here */ + CORRADE_VERIFY(buffer.hasDedicatedMemory()); + CORRADE_VERIFY(buffer.dedicatedMemory().handle()); +} + }}}} CORRADE_TEST_MAIN(Magnum::Vk::Test::BufferVkTest)