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/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)} {

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 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
*

24
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)

Loading…
Cancel
Save