summaryrefslogtreecommitdiff
path: root/src/resources/buffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources/buffer.cpp')
-rw-r--r--src/resources/buffer.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/resources/buffer.cpp b/src/resources/buffer.cpp
new file mode 100644
index 0000000..8568466
--- /dev/null
+++ b/src/resources/buffer.cpp
@@ -0,0 +1,56 @@
+#include "resources/buffer.h"
+#include "vulkan_helper.h"
+#include <memory>
+
+namespace iris {
+
+void *Buffer_tt::map() {
+ if (!mapped_data.has_value()) {
+ CHECK_VULKAN(vmaMapMemory(allocator, allocation, &mapped_data.value()));
+ }
+ return mapped_data.value();
+}
+
+void Buffer_tt::unmap() {
+ if (mapped_data.has_value()) {
+ vmaUnmapMemory(allocator, allocation);
+ mapped_data.reset();
+ } else {
+ spdlog::warn("Buffer is not mapped, skipping");
+ }
+}
+
+void Buffer_tt::release() {
+ if (handle != VK_NULL_HANDLE) {
+ spdlog::debug("Destroying buffer: 0x{:x}", (uint64_t)handle);
+ vkDeviceWaitIdle(device);
+ vmaDestroyBuffer(allocator, handle, allocation);
+ handle = VK_NULL_HANDLE;
+ }
+}
+
+std::shared_ptr<Buffer_tt> Device::create_buffer(BufferDesc desc) {
+ VkBufferCreateInfo buffer_create_info = {
+ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+ .size = desc.size,
+ .usage = desc.buffer_usage,
+ };
+ VmaAllocationCreateInfo alloc_create_info = {
+ .usage = desc.memory_usage,
+ };
+ std::shared_ptr<Buffer_tt> buffer = std::make_shared<Buffer_tt>();
+ buffer->device = this->device;
+ buffer->allocator = this->allocator;
+ buffer->desc = desc;
+ CHECK_VULKAN(vmaCreateBuffer(
+ allocator,
+ &buffer_create_info,
+ &alloc_create_info,
+ &buffer->handle,
+ &buffer->allocation,
+ VK_NULL_HANDLE));
+ spdlog::debug("Created buffer: 0x{:x}", (uint64_t)buffer->handle);
+ return buffer;
+}
+
+} // namespace iris \ No newline at end of file