62 lines
2.2 KiB
C++
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();
|
|
}
|