#include "buffer_vk.h" #include "utils/utils.hpp" buffer_vk::buffer_vk() { buffer = nullptr; memory = nullptr; descriptor_type = vk::DescriptorType::eUniformBuffer; } void buffer_vk::create(uint32_t size, vk::BufferUsageFlagBits in_usage, vk::DescriptorType in_descriptor_type) { destroy(); buffer_size = size; descriptor_type = in_descriptor_type; const renderer* render_vk = application::get()->get_renderer(); const vk::Device& device = render_vk->device; vk::BufferCreateInfo buffer_create_info; buffer_create_info.setSize(size); buffer_create_info.setUsage(in_usage); buffer_create_info.setSharingMode(vk::SharingMode::eExclusive); buffer = device.createBuffer(buffer_create_info); const vk::PhysicalDeviceMemoryProperties memory_properties = render_vk->physical_device.getMemoryProperties(); const vk::MemoryRequirements memory_requirements = device.getBufferMemoryRequirements(buffer); const auto memory_type = vk::su::findMemoryType(memory_properties, memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); vk::MemoryAllocateInfo memory_allocate_info; memory_allocate_info.setAllocationSize(memory_requirements.size); memory_allocate_info.setMemoryTypeIndex(memory_type); memory = device.allocateMemory(memory_allocate_info); device.bindBufferMemory(buffer, memory, 0); } void buffer_vk::create_storage(uint32_t size) { create(size, vk::BufferUsageFlagBits::eStorageBuffer, vk::DescriptorType::eStorageBuffer); } void buffer_vk::create_uniform(uint32_t size) { create(size, vk::BufferUsageFlagBits::eUniformBuffer, vk::DescriptorType::eUniformBuffer); } void buffer_vk::create_staging(uint32_t size) { create(size, vk::BufferUsageFlagBits::eTransferSrc, vk::DescriptorType::eUniformBuffer); } void buffer_vk::destroy() { if (!buffer) { return; } const renderer* render_vk = application::get()->get_renderer(); const vk::Device& device = render_vk->device; device.destroyBuffer(buffer); device.freeMemory(memory); buffer = nullptr; memory = nullptr; } void buffer_vk::update(const void* data, uint32_t size) { const auto p = map(); memcpy(p, data, size); unmap(); }