Skip to content
Snippets Groups Projects
BufferManager.hpp 3.76 KiB
#pragma once
/**
 * @authors Tobias Frisch, Alexander Gauggel, Artur Wasmut, Lars Hoerttrich, Sebastian Gaida
 * @file vkcv/BufferManager.hpp
 * @brief Manager to handle buffer operations.
 */

#include <vector>
#include <vulkan/vulkan.hpp>
#include <vk_mem_alloc.hpp>

#include "Handles.hpp"

namespace vkcv
{
	enum class BufferType {
		INDEX,
		VERTEX,
		UNIFORM,
		STORAGE,
		STAGING,
		INDIRECT
	};
	
	enum class BufferMemoryType {
		DEVICE_LOCAL,
		HOST_VISIBLE
	};
	
	class Core;
	
	class BufferManager
	{
		friend class Core;
	private:
		
		struct Buffer
		{
			vk::Buffer m_handle;
			vma::Allocation m_allocation;
			size_t m_size = 0;
			bool m_mappable = false;
		};
		
		Core* m_core;
		std::vector<Buffer> m_buffers;
		BufferHandle m_stagingBuffer;
		
		BufferManager() noexcept;
		
		void init();
		
		/**
		 * Destroys and deallocates buffer represented by a given
		 * buffer handle id.
		 *
		 * @param id Buffer handle id
		 */
		void destroyBufferById(uint64_t id);
		
	public:
		~BufferManager() noexcept;
		
		BufferManager(BufferManager&& other) = delete;
		BufferManager(const BufferManager& other) = delete;
		
		BufferManager& operator=(BufferManager&& other) = delete;
		BufferManager& operator=(const BufferManager& other) = delete;
		
		/**