AronaCore/core/rhi/buffer_vk.cpp
2024-02-20 10:06:45 +08:00

62 lines
2.2 KiB
C++

#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();
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() const {
if (!buffer) {
return;
}
const renderer* render_vk = application::get()->get_renderer();
const vk::Device& device = render_vk->device;
device.destroyBuffer(buffer);
device.freeMemory(memory);
}
void buffer_vk::update(const void* data, uint32_t size) {
const auto p = map<void>();
memcpy(p, data, size);
unmap();
}