Skip to content
Snippets Groups Projects
Verified Commit ee35ab6d authored by Tobias Frisch's avatar Tobias Frisch
Browse files

[#48] Allow using BufferHandle instead of id or Buffer-template

parent 4f7ced6a
No related branches found
No related tags found
1 merge request!37Resolve "Buffer-Klasse Template-fix"
Pipeline #25213 passed
......@@ -4,58 +4,70 @@
* @file vkcv/Buffer.hpp
* @brief template buffer class, template for type security, implemented here because template classes can't be written in .cpp
*/
#include "Handles.hpp"
#include "BufferManager.hpp"
namespace vkcv {
template<typename T>
class Buffer {
friend class Core;
public:
// explicit destruction of default constructor
Buffer<T>() = delete;
BufferType getType() {
[[nodiscard]]
const BufferHandle& getHandle() const {
return m_handle;
}
[[nodiscard]]
BufferType getType() const {
return m_type;
};
size_t getCount() {
[[nodiscard]]
size_t getCount() const {
return m_count;
}
size_t getSize() {
[[nodiscard]]
size_t getSize() const {
return m_count * sizeof(T);
}
void fill(T* data, size_t count = 0, size_t offset = 0) {
m_manager->fillBuffer(m_handle_id, data, count * sizeof(T), offset * sizeof(T));
m_manager->fillBuffer(m_handle, data, count * sizeof(T), offset * sizeof(T));
}
[[nodiscard]]
T* map(size_t offset = 0, size_t count = 0) {
return reinterpret_cast<T*>(m_manager->mapBuffer(m_handle_id, offset * sizeof(T), count * sizeof(T)));
return reinterpret_cast<T*>(m_manager->mapBuffer(m_handle, offset * sizeof(T), count * sizeof(T)));
}
void unmap() {
m_manager->unmapBuffer(m_handle_id);
}
static Buffer<T> create(BufferManager* manager, BufferType type, size_t count, BufferMemoryType memoryType) {
return Buffer<T>(manager, manager->createBuffer(type, count * sizeof(T), memoryType), type, count, memoryType);
m_manager->unmapBuffer(m_handle);
}
private:
BufferManager* const m_manager;
const uint64_t m_handle_id;
const BufferHandle m_handle;
const BufferType m_type;
const size_t m_count;
const BufferMemoryType m_memoryType;
Buffer<T>(BufferManager* manager, uint64_t id, BufferType type, size_t count, BufferMemoryType memoryType) :
Buffer<T>(BufferManager* manager, BufferHandle handle, BufferType type, size_t count, BufferMemoryType memoryType) :
m_manager(manager),
m_handle_id(id),
m_handle(handle),
m_type(type),
m_count(count),
m_memoryType(memoryType)
{}
[[nodiscard]]
static Buffer<T> create(BufferManager* manager, BufferType type, size_t count, BufferMemoryType memoryType) {
return Buffer<T>(manager, manager->createBuffer(type, count * sizeof(T), memoryType), type, count, memoryType);
}
};
}
......@@ -3,6 +3,8 @@
#include <vector>
#include <vulkan/vulkan.hpp>
#include "Handles.hpp"
namespace vkcv
{
enum class BufferType {
......@@ -36,7 +38,7 @@ namespace vkcv
Core* m_core;
std::vector<Buffer> m_buffers;
uint64_t m_stagingBuffer;
BufferHandle m_stagingBuffer;
BufferManager() noexcept;
......@@ -58,67 +60,67 @@ namespace vkcv
* @param type Type of buffer
* @param size Size of buffer in bytes
* @param memoryType Type of buffers memory
* @return New buffer handle id
* @return New buffer handle
*/
uint64_t createBuffer(BufferType type, size_t size, BufferMemoryType memoryType);
BufferHandle createBuffer(BufferType type, size_t size, BufferMemoryType memoryType);
/**
* Returns the Vulkan buffer handle of a buffer
* represented by a given buffer handle id.
*
* @param id Buffer handle id
* @param handle Buffer handle
* @return Vulkan buffer handle
*/
[[nodiscard]]
vk::Buffer getBuffer(uint64_t id) const;
vk::Buffer getBuffer(const BufferHandle& handle) const;
/**
* Returns the Vulkan device memory handle of a buffer
* represented by a given buffer handle id.
*
* @param id Buffer handle id
* @param handle Buffer handle
* @return Vulkan device memory handle
*/
[[nodiscard]]
vk::DeviceMemory getDeviceMemory(uint64_t id) const;
vk::DeviceMemory getDeviceMemory(const BufferHandle& handle) const;
/**
* Fills a buffer represented by a given buffer
* handle id with custom data.
*
* @param id Buffer handle id
* @param handle Buffer handle
* @param data Pointer to data
* @param size Size of data in bytes
* @param offset Offset to fill in data in bytes
*/
void fillBuffer(uint64_t id, void* data, size_t size, size_t offset);
void fillBuffer(const BufferHandle& handle, void* data, size_t size, size_t offset);
/**
* Maps memory to a buffer represented by a given
* buffer handle id and returns it.
*
* @param id Buffer handle id
* @param handle Buffer handle
* @param offset Offset of mapping in bytes
* @param size Size of mapping in bytes
* @return Pointer to mapped memory
*/
void* mapBuffer(uint64_t id, size_t offset, size_t size);
void* mapBuffer(const BufferHandle& handle, size_t offset, size_t size);
/**
* Unmaps memory from a buffer represented by a given
* buffer handle id.
*
* @param id Buffer handle id
* @param handle Buffer handle
*/
void unmapBuffer(uint64_t id);
void unmapBuffer(const BufferHandle& handle);
/**
* Destroys and deallocates buffer represented by a given
* buffer handle id.
*
* @param id Buffer handle id
* @param handle Buffer handle
*/
void destroyBuffer(uint64_t id);
void destroyBuffer(const BufferHandle& handle);
};
......
......@@ -9,7 +9,7 @@
namespace vkcv {
BufferManager::BufferManager() noexcept :
m_core(nullptr), m_buffers(), m_stagingBuffer(UINT64_MAX)
m_core(nullptr), m_buffers(), m_stagingBuffer(BufferHandle{ UINT64_MAX })
{
}
......@@ -23,7 +23,7 @@ namespace vkcv {
BufferManager::~BufferManager() noexcept {
for (size_t id = 0; id < m_buffers.size(); id++) {
destroyBuffer(id);
destroyBuffer(BufferHandle{ id });
}
}
......@@ -52,7 +52,7 @@ namespace vkcv {
return memoryTypeIndex;
}
uint64_t BufferManager::createBuffer(BufferType type, size_t size, BufferMemoryType memoryType) {
BufferHandle BufferManager::createBuffer(BufferType type, size_t size, BufferMemoryType memoryType) {
vk::BufferCreateFlags createFlags;
vk::BufferUsageFlags usageFlags;
......@@ -115,7 +115,7 @@ namespace vkcv {
const uint64_t id = m_buffers.size();
m_buffers.push_back({ buffer, memory, size, nullptr, mappable });
return id;
return BufferHandle{ id };
}
struct StagingStepInfo {
......@@ -178,7 +178,9 @@ namespace vkcv {
);
}
vk::Buffer BufferManager::getBuffer(uint64_t id) const {
vk::Buffer BufferManager::getBuffer(const BufferHandle& handle) const {
const uint64_t id = handle.id;
if (id >= m_buffers.size()) {
return nullptr;
}
......@@ -188,7 +190,9 @@ namespace vkcv {
return buffer.m_handle;
}
vk::DeviceMemory BufferManager::getDeviceMemory(uint64_t id) const {
vk::DeviceMemory BufferManager::getDeviceMemory(const BufferHandle& handle) const {
const uint64_t id = handle.id;
if (id >= m_buffers.size()) {
return nullptr;
}
......@@ -198,7 +202,9 @@ namespace vkcv {
return buffer.m_memory;
}
void BufferManager::fillBuffer(uint64_t id, void *data, size_t size, size_t offset) {
void BufferManager::fillBuffer(const BufferHandle& handle, void *data, size_t size, size_t offset) {
const uint64_t id = handle.id;
if (size == 0) {
size = SIZE_MAX;
}
......@@ -226,7 +232,7 @@ namespace vkcv {
memcpy(mapped, data, max_size);
device.unmapMemory(buffer.m_memory);
} else {
auto& stagingBuffer = m_buffers[m_stagingBuffer];
auto& stagingBuffer = m_buffers[ m_stagingBuffer.id ];
StagingStepInfo info;
info.data = data;
......@@ -246,7 +252,9 @@ namespace vkcv {
}
}
void* BufferManager::mapBuffer(uint64_t id, size_t offset, size_t size) {
void* BufferManager::mapBuffer(const BufferHandle& handle, size_t offset, size_t size) {
const uint64_t id = handle.id;
if (size == 0) {
size = SIZE_MAX;
}
......@@ -272,7 +280,9 @@ namespace vkcv {
return buffer.m_mapped;
}
void BufferManager::unmapBuffer(uint64_t id) {
void BufferManager::unmapBuffer(const BufferHandle& handle) {
const uint64_t id = handle.id;
if (id >= m_buffers.size()) {
return;
}
......@@ -289,7 +299,9 @@ namespace vkcv {
buffer.m_mapped = nullptr;
}
void BufferManager::destroyBuffer(uint64_t id) {
void BufferManager::destroyBuffer(const BufferHandle& handle) {
const uint64_t id = handle.id;
if (id >= m_buffers.size()) {
return;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment