From ae06cc850869b7a49572269c8e45f19316fbb3ad Mon Sep 17 00:00:00 2001 From: Lars Hoerttrich <larshoerttrich@uni-koblenz.de> Date: Wed, 19 May 2021 19:23:26 +0200 Subject: [PATCH] [#22] Outsourced some functionality from hpp to cpp --- include/vkcv/Buffer.hpp | 66 ++++++++++------------------------------- src/vkcv/Buffer.cpp | 53 ++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 51 deletions(-) diff --git a/include/vkcv/Buffer.hpp b/include/vkcv/Buffer.hpp index 69e59d3b..6647cbf2 100644 --- a/include/vkcv/Buffer.hpp +++ b/include/vkcv/Buffer.hpp @@ -14,13 +14,10 @@ namespace vkcv { //Enum of buffertypes enum BufferType { VERTEX, UNIFORM, STORAGE }; - //(temporary?) struct example for T - //TODO - struct vertex_t { - //glm::vec3 pos; - //glm::vec3 color; - float x, y, z; - }; + //Functions outsourced to Buffer.cpp file: + void outsourcedDestructor(vk::Device device, vk::DeviceMemory bufferMemory, vk::Buffer buffer); + vk::Buffer outsourcedCreateBuffer(vk::Device device, BufferType type, size_t size); + vk::DeviceMemory outsourcedAllocateMemory(vk::Device device, vk::PhysicalDevice physicalDevice, vk::MemoryRequirements memoryRequirements); template<typename T> class Buffer { @@ -35,8 +32,7 @@ namespace vkcv { Buffer<T>() = delete; // is never called directly ~Buffer<T>() noexcept { - m_Device.freeMemory(m_BufferMemory); - m_Device.destroyBuffer(m_Buffer); + outsourcedDestructor(m_Device, m_BufferMemory, m_Buffer); } Buffer<T>(const Buffer<T>& other) = delete; // copy-ctor @@ -77,7 +73,13 @@ namespace vkcv { BufferType getType() { return m_Type; }; size_t getSize() { return m_Size; }; - // TODO: we will probably need staging-buffer here later (possible add in BufferManager later?) + /** + * Maps this buffers Memory, fills this buffer with @p data of type T and count @p count + * unmaps afterwards. + * @p data Pointer to data + * @p count Amount of data of type T + */ + // TODO: we will probably need staging-buffer here later (possible add in BufferManager later?) void fill(T* data, size_t count) { const vk::MemoryRequirements requirements = m_Device.getBufferMemoryRequirements(m_Buffer); @@ -111,15 +113,8 @@ namespace vkcv { static Buffer<T> create(vk::Device device, vk::PhysicalDevice physicalDevice, BufferType type, size_t size) { vk::Buffer buffer = nullptr; - switch (type) { - case VERTEX: { - //create vertex buffer - buffer = device.createBuffer(vk::BufferCreateInfo(vk::BufferCreateFlags(), sizeof(T) * size, vk::BufferUsageFlagBits::eVertexBuffer)); - } - default: { - // TODO: maybe an issue - } - } + + buffer = outsourcedCreateBuffer(device, type, sizeof(T) * size); if (!buffer) { //TODO: potential issue @@ -128,11 +123,7 @@ namespace vkcv { //get requirements for allocation const vk::MemoryRequirements requirements = device.getBufferMemoryRequirements(buffer); - //find Memory Type - uint32_t memoryType = searchMemoryType(physicalDevice.getMemoryProperties(), requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); - - //allocate memory for buffer - vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryType)); + vk::DeviceMemory memory= outsourcedAllocateMemory(device, physicalDevice, requirements); if (!memory) { //TODO: other potential issue @@ -167,31 +158,6 @@ namespace vkcv { m_Type(type), m_Size(size), m_DataP(nullptr) - {} - - /** - * @brief searches memory type index for buffer allocation, inspired by vulkan tutorial and "https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/samples/utils/utils.hpp" - * @param physicalMemoryProperties Memory Properties of physical device - * @param typeBits - * @param requirements Property flags that are required - * @return memory type index for Buffer - */ - static uint32_t searchMemoryType(vk::PhysicalDeviceMemoryProperties const& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) { - uint32_t memoryTypeIndex = uint32_t(0); - - for (uint32_t i = 0; i < physicalMemoryProperties.memoryTypeCount; i++) - { - if ((typeBits & 1) && - ((physicalMemoryProperties.memoryTypes[i].propertyFlags & requirements) == requirements)) - { - memoryTypeIndex = i; - break; - } - typeBits >>= 1; - } - - return memoryTypeIndex; - } - + {} }; } diff --git a/src/vkcv/Buffer.cpp b/src/vkcv/Buffer.cpp index 55604884..956f6800 100644 --- a/src/vkcv/Buffer.cpp +++ b/src/vkcv/Buffer.cpp @@ -6,5 +6,56 @@ #include"vkcv/Buffer.hpp" namespace vkcv { - + + /** + * @brief searches memory type index for buffer allocation, inspired by vulkan tutorial and "https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/samples/utils/utils.hpp" + * @param physicalMemoryProperties Memory Properties of physical device + * @param typeBits + * @param requirements Property flags that are required + * @return memory type index for Buffer + */ + uint32_t searchMemoryType(vk::PhysicalDeviceMemoryProperties const& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) { + uint32_t memoryTypeIndex = uint32_t(0); + for (uint32_t i = 0; i < physicalMemoryProperties.memoryTypeCount; i++) + { + if ((typeBits & 1) && + ((physicalMemoryProperties.memoryTypes[i].propertyFlags & requirements) == requirements)) + { + memoryTypeIndex = i; + break; + } + typeBits >>= 1; + } + return memoryTypeIndex; + } + + void outsourcedDestructor(vk::Device device, vk::DeviceMemory bufferMemory, vk::Buffer buffer) + { + if (device) { + device.freeMemory(bufferMemory); + device.destroyBuffer(buffer); + } + } + + vk::Buffer outsourcedCreateBuffer(vk::Device device, BufferType type, size_t size) + { + switch (type) { + case VERTEX: { + //create vertex buffer + return device.createBuffer(vk::BufferCreateInfo(vk::BufferCreateFlags(), size, vk::BufferUsageFlagBits::eVertexBuffer)); + } + default: { + // TODO: maybe an issue + } + } + + return vk::Buffer(); //should never be reached + } + + vk::DeviceMemory outsourcedAllocateMemory(vk::Device device, vk::PhysicalDevice physicalDevice, vk::MemoryRequirements memoryRequirements) + { + //find Memory Type + uint32_t memoryType = searchMemoryType(physicalDevice.getMemoryProperties(), memoryRequirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); + return device.allocateMemory(vk::MemoryAllocateInfo(memoryRequirements.size, memoryType)); + } } \ No newline at end of file -- GitLab