vulkan图片加载
This commit is contained in:
61
core/rhi/buffer_vk.cpp
Normal file
61
core/rhi/buffer_vk.cpp
Normal file
@@ -0,0 +1,61 @@
|
||||
#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();
|
||||
}
|
||||
Reference in New Issue
Block a user