-
Notifications
You must be signed in to change notification settings - Fork 1
/
Buffer.cpp
59 lines (46 loc) · 1.81 KB
/
Buffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//
// Created by barba on 07/05/2023.
//
#include "Buffer.h"
uint32_t Buffer::findMemoryType(const vk::ArrayProxy<vk::MemoryType> &types, uint32_t typeFilter, vk::MemoryPropertyFlags properties) {
for (uint32_t i = 0; i < types.size(); i++) {
if ((typeFilter & (1 << i)) && (types.data()[i].propertyFlags & properties) == properties) {
return i;
}
}
throw std::runtime_error("Could not find memory property");
}
Buffer::Buffer(std::shared_ptr<Instance> _instance, size_t bufferSize, vk::BufferUsageFlags bufferFlags, vk::MemoryPropertyFlags memoryFlags) : instance(std::move(_instance)) {
auto device = instance->device();
_buffer = device.createBuffer({{}, bufferSize, bufferFlags, vk::SharingMode::eExclusive });
auto requirements = device.getBufferMemoryRequirements(_buffer);
auto idx = findMemoryType(instance->memory_properties().memoryTypes, requirements.memoryTypeBits, memoryFlags);
bufferMemory = device.allocateMemory({ requirements.size, idx });
device.bindBufferMemory(_buffer, bufferMemory, 0);
this->bufferSize = bufferSize;
}
void Buffer::clean() {
if (!_buffer) {
return;
}
auto device = instance->device();
device.destroyBuffer(_buffer);
device.freeMemory(bufferMemory);
}
Buffer::~Buffer() {
clean();
}
BufferMapping Buffer::map() const {
return {instance->device(), *this};
}
void Buffer::copy_to(const Buffer &other, const vk::CommandBuffer& commandBuffer) {
//commandBuffer.begin({vk::CommandBufferUsageFlagBits::eOneTimeSubmit, {}});
commandBuffer.copyBuffer(_buffer, other._buffer, vk::BufferCopy{0, 0, bufferSize });
//commandBuffer.end();
}
BufferMapping::BufferMapping(const vk::Device &device, const Buffer &buffer) : device(device), buffer(buffer) {
data = device.mapMemory(buffer.memory(), 0, buffer.size());
}
BufferMapping::~BufferMapping() {
device.unmapMemory(buffer.memory());
}