Browse Source

Vk: ability to allocate Buffer directly during construction.

Again mirrors what's done in Image.
pull/234/head
Vladimír Vondruš 6 years ago
parent
commit
d53dc06e9c
  1. 9
      src/Magnum/Vk/Buffer.cpp
  2. 18
      src/Magnum/Vk/Buffer.h
  3. 24
      src/Magnum/Vk/Test/BufferVkTest.cpp

9
src/Magnum/Vk/Buffer.cpp

@ -27,6 +27,7 @@
#include "Magnum/Vk/Assert.h" #include "Magnum/Vk/Assert.h"
#include "Magnum/Vk/Device.h" #include "Magnum/Vk/Device.h"
#include "Magnum/Vk/DeviceProperties.h"
#include "Magnum/Vk/Handle.h" #include "Magnum/Vk/Handle.h"
#include "Magnum/Vk/Implementation/DeviceState.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)); 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(NoCreateT): _device{}, _handle{}, _dedicatedMemory{NoCreate} {}
Buffer::Buffer(Buffer&& other) noexcept: _device{other._device}, _handle{other._handle}, _flags{other._flags}, _dedicatedMemory{std::move(other._dedicatedMemory)} { Buffer::Buffer(Buffer&& other) noexcept: _device{other._device}, _handle{other._handle}, _flags{other._flags}, _dedicatedMemory{std::move(other._dedicatedMemory)} {

18
src/Magnum/Vk/Buffer.h

@ -182,10 +182,26 @@ class MAGNUM_VK_EXPORT Buffer {
* @param device Vulkan device to create the buffer on * @param device Vulkan device to create the buffer on
* @param info Buffer creation info * @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); 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 * @brief Construct without creating the buffer
* *

24
src/Magnum/Vk/Test/BufferVkTest.cpp

@ -46,6 +46,8 @@ struct BufferVkTest: VulkanTester {
void bindMemory(); void bindMemory();
void bindDedicatedMemory(); void bindDedicatedMemory();
void directAllocation();
}; };
BufferVkTest::BufferVkTest() { BufferVkTest::BufferVkTest() {
@ -57,7 +59,9 @@ BufferVkTest::BufferVkTest() {
&BufferVkTest::memoryRequirements, &BufferVkTest::memoryRequirements,
&BufferVkTest::bindMemory, &BufferVkTest::bindMemory,
&BufferVkTest::bindDedicatedMemory}); &BufferVkTest::bindDedicatedMemory,
&BufferVkTest::directAllocation});
} }
void BufferVkTest::construct() { void BufferVkTest::construct() {
@ -72,13 +76,9 @@ void BufferVkTest::construct() {
} }
void BufferVkTest::constructMove() { void BufferVkTest::constructMove() {
Buffer a{device(), BufferCreateInfo{BufferUsage::StorageBuffer, 1024}, NoAllocate};
VkBuffer handle = a.handle();
/* Verify that also the dedicated memory gets moved */ /* Verify that also the dedicated memory gets moved */
MemoryRequirements requirements = a.memoryRequirements(); Buffer a{device(), BufferCreateInfo{BufferUsage::StorageBuffer, 1024}, Vk::MemoryFlag::DeviceLocal};
a.bindDedicatedMemory(Vk::Memory{device(), Vk::MemoryAllocateInfo{requirements.size(), VkBuffer handle = a.handle();
device().properties().pickMemory(Vk::MemoryFlag::DeviceLocal, requirements.memories())}});
VkDeviceMemory memoryHandle = a.dedicatedMemory().handle(); VkDeviceMemory memoryHandle = a.dedicatedMemory().handle();
Buffer b = std::move(a); Buffer b = std::move(a);
@ -159,6 +159,16 @@ void BufferVkTest::bindDedicatedMemory() {
CORRADE_COMPARE(buffer.dedicatedMemory().handle(), handle); 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) CORRADE_TEST_MAIN(Magnum::Vk::Test::BufferVkTest)

Loading…
Cancel
Save