From 86d7adb07f9dbb16377a06928895dc01114d68c3 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Sun, 27 Apr 2025 00:05:21 +0200 Subject: [PATCH] buffer --- Crafter.Grahpics-Mesh.cppm | 15 +++++ Crafter.Graphics-Camera.cpp | 11 ++-- Crafter.Graphics-Camera.cppm | 5 +- Crafter.Graphics-Types.cppm | 6 ++ Crafter.Graphics-VulkanBuffer.cppm | 54 +++++++++++++++++ Crafter.Graphics-VulkanDevice.cpp | 94 ------------------------------ Crafter.Graphics-VulkanDevice.cppm | 2 - Crafter.Graphics.cppm | 3 +- project.json | 2 +- 9 files changed, 84 insertions(+), 108 deletions(-) create mode 100644 Crafter.Grahpics-Mesh.cppm create mode 100644 Crafter.Graphics-VulkanBuffer.cppm diff --git a/Crafter.Grahpics-Mesh.cppm b/Crafter.Grahpics-Mesh.cppm new file mode 100644 index 0000000..b5fe9cd --- /dev/null +++ b/Crafter.Grahpics-Mesh.cppm @@ -0,0 +1,15 @@ +module; + +#include + +export module Crafter.Graphics:Mesh; + +namespace Crafter { + export class Mesh { + public: + vks::Buffer buffer; + Mesh(); + private: + CameraBufferData data; + }; +} diff --git a/Crafter.Graphics-Camera.cpp b/Crafter.Graphics-Camera.cpp index 0be2569..b903e29 100644 --- a/Crafter.Graphics-Camera.cpp +++ b/Crafter.Graphics-Camera.cpp @@ -15,17 +15,14 @@ module; module Crafter.Graphics; using namespace Crafter; -Camera::Camera() { +Camera::Camera() : buffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { old::Camera camera; camera.type = old::Camera::CameraType::lookat; camera.setPerspective(60.0f, 128 / 128, 0.1f, 512.0f); camera.setRotation(glm::vec3(0.0f, 15.0f, 0.0f)); camera.setTranslation(glm::vec3(0.0f, 0.0f, -5.0f)); - VulkanDevice::CreateBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &buffer, sizeof(CameraBufferData)); - VulkanDevice::CHECK_VK_RESULT(buffer.map()); - data.projection = camera.matrices.perspective; - data.view = camera.matrices.view; - data.model = glm::mat4(1.0f); - memcpy(buffer.mapped, &data, sizeof(CameraBufferData)); + buffer.value->projection = camera.matrices.perspective; + buffer.value->view = camera.matrices.view; + buffer.value->model = glm::mat4(1.0f); } \ No newline at end of file diff --git a/Crafter.Graphics-Camera.cppm b/Crafter.Graphics-Camera.cppm index 6d3da77..c4deb17 100644 --- a/Crafter.Graphics-Camera.cppm +++ b/Crafter.Graphics-Camera.cppm @@ -12,6 +12,7 @@ module; #include "camera.hpp" export module Crafter.Graphics:Camera; +import :VulkanBuffer; namespace Crafter { struct CameraBufferData { @@ -21,9 +22,7 @@ namespace Crafter { }; export class Camera { public: - vks::Buffer buffer; + Buffer buffer; Camera(); - private: - CameraBufferData data; }; } diff --git a/Crafter.Graphics-Types.cppm b/Crafter.Graphics-Types.cppm index b93ff3d..ef9cb71 100644 --- a/Crafter.Graphics-Types.cppm +++ b/Crafter.Graphics-Types.cppm @@ -22,4 +22,10 @@ namespace Crafter { std::uint8_t b; std::uint8_t a; }; + + export struct Vertex_xf32_yf32_zf32 { + float x; + float y; + float z; + }; } diff --git a/Crafter.Graphics-VulkanBuffer.cppm b/Crafter.Graphics-VulkanBuffer.cppm new file mode 100644 index 0000000..3271a05 --- /dev/null +++ b/Crafter.Graphics-VulkanBuffer.cppm @@ -0,0 +1,54 @@ +module; + +#include +#include +#include "VulkanInitializers.hpp" + +export module Crafter.Graphics:VulkanBuffer; +import :VulkanDevice; + +namespace Crafter { + export template + class Buffer { + public: + T* value; + VkDescriptorBufferInfo descriptor; + Buffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags) { + VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(usageFlags, sizeof(T)*count); + VulkanDevice::CHECK_VK_RESULT(vkCreateBuffer(VulkanDevice::device, &bufferCreateInfo, nullptr, &buffer)); + + // Create the memory backing up the buffer handle + VkMemoryRequirements memReqs; + VkMemoryAllocateInfo memAlloc = vks::initializers::memoryAllocateInfo(); + vkGetBufferMemoryRequirements(VulkanDevice::device, buffer, &memReqs); + memAlloc.allocationSize = memReqs.size; + // Find a memory type index that fits the properties of the buffer + memAlloc.memoryTypeIndex = VulkanDevice::GetMemoryType(memReqs.memoryTypeBits, memoryPropertyFlags); + // If the buffer has VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT set we also need to enable the appropriate flag during allocation + VkMemoryAllocateFlagsInfoKHR allocFlagsInfo{}; + if (usageFlags & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) { + allocFlagsInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR; + allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR; + memAlloc.pNext = &allocFlagsInfo; + } + VulkanDevice::CHECK_VK_RESULT(vkAllocateMemory(VulkanDevice::device, &memAlloc, nullptr, &memory)); + + alignment = memReqs.alignment; + usageFlags = usageFlags; + memoryPropertyFlags = memoryPropertyFlags; + + descriptor.offset = 0; + descriptor.buffer = buffer; + descriptor.range = sizeof(T)*count; + + VulkanDevice::CHECK_VK_RESULT(vkBindBufferMemory(VulkanDevice::device, buffer, memory, 0)); + VulkanDevice::CHECK_VK_RESULT(vkMapMemory(VulkanDevice::device, memory, 0, sizeof(T)*count, 0, reinterpret_cast(&value))); + } + private: + VkBuffer buffer = VK_NULL_HANDLE; + VkDeviceMemory memory = VK_NULL_HANDLE; + VkDeviceSize alignment = 0; + VkMemoryPropertyFlags memoryPropertyFlags; + VkBufferUsageFlags usageFlags; + }; +} diff --git a/Crafter.Graphics-VulkanDevice.cpp b/Crafter.Graphics-VulkanDevice.cpp index ef12aab..b6c0a3c 100644 --- a/Crafter.Graphics-VulkanDevice.cpp +++ b/Crafter.Graphics-VulkanDevice.cpp @@ -282,98 +282,4 @@ std::uint32_t VulkanDevice::GetMemoryType(uint32_t typeBits, VkMemoryPropertyFla } throw std::runtime_error("Could not find a matching memory type"); -} - -void VulkanDevice::CreateBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size, VkBuffer *buffer, VkDeviceMemory *memory, void *data) -{ - // Create the buffer handle - VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(usageFlags, size); - bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - CHECK_VK_RESULT(vkCreateBuffer(device, &bufferCreateInfo, nullptr, buffer)); - - // Create the memory backing up the buffer handle - VkMemoryRequirements memReqs; - VkMemoryAllocateInfo memAlloc = vks::initializers::memoryAllocateInfo(); - vkGetBufferMemoryRequirements(device, *buffer, &memReqs); - memAlloc.allocationSize = memReqs.size; - // Find a memory type index that fits the properties of the buffer - memAlloc.memoryTypeIndex = GetMemoryType(memReqs.memoryTypeBits, memoryPropertyFlags); - // If the buffer has VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT set we also need to enable the appropriate flag during allocation - VkMemoryAllocateFlagsInfoKHR allocFlagsInfo{}; - if (usageFlags & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) { - allocFlagsInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR; - allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR; - memAlloc.pNext = &allocFlagsInfo; - } - CHECK_VK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, memory)); - - // If a pointer to the buffer data has been passed, map the buffer and copy over the data - if (data != nullptr) - { - void *mapped; - CHECK_VK_RESULT(vkMapMemory(device, *memory, 0, size, 0, &mapped)); - memcpy(mapped, data, size); - // If host coherency hasn't been requested, do a manual flush to make writes visible - if ((memoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0) - { - VkMappedMemoryRange mappedRange = vks::initializers::mappedMemoryRange(); - mappedRange.memory = *memory; - mappedRange.offset = 0; - mappedRange.size = size; - vkFlushMappedMemoryRanges(device, 1, &mappedRange); - } - vkUnmapMemory(device, *memory); - } - - // Attach the memory to the buffer object - CHECK_VK_RESULT(vkBindBufferMemory(device, *buffer, *memory, 0)); -} - - -void VulkanDevice::CreateBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, vks::Buffer *buffer, VkDeviceSize size, void *data) -{ - buffer->device = device; - - // Create the buffer handle - VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(usageFlags, size); - CHECK_VK_RESULT(vkCreateBuffer(device, &bufferCreateInfo, nullptr, &buffer->buffer)); - - // Create the memory backing up the buffer handle - VkMemoryRequirements memReqs; - VkMemoryAllocateInfo memAlloc = vks::initializers::memoryAllocateInfo(); - vkGetBufferMemoryRequirements(device, buffer->buffer, &memReqs); - memAlloc.allocationSize = memReqs.size; - // Find a memory type index that fits the properties of the buffer - memAlloc.memoryTypeIndex = GetMemoryType(memReqs.memoryTypeBits, memoryPropertyFlags); - // If the buffer has VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT set we also need to enable the appropriate flag during allocation - VkMemoryAllocateFlagsInfoKHR allocFlagsInfo{}; - if (usageFlags & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) { - allocFlagsInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR; - allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR; - memAlloc.pNext = &allocFlagsInfo; - } - CHECK_VK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &buffer->memory)); - - buffer->alignment = memReqs.alignment; - buffer->size = size; - buffer->usageFlags = usageFlags; - buffer->memoryPropertyFlags = memoryPropertyFlags; - - // If a pointer to the buffer data has been passed, map the buffer and copy over the data - if (data != nullptr) - { - CHECK_VK_RESULT(buffer->map()); - memcpy(buffer->mapped, data, size); - if ((memoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0) { - buffer->flush(); - } - - buffer->unmap(); - } - - // Initialize a default descriptor that covers the whole buffer size - buffer->setupDescriptor(); - - // Attach the memory to the buffer object - CHECK_VK_RESULT(buffer->bind()); } \ No newline at end of file diff --git a/Crafter.Graphics-VulkanDevice.cppm b/Crafter.Graphics-VulkanDevice.cppm index 209bed1..ee5fddc 100644 --- a/Crafter.Graphics-VulkanDevice.cppm +++ b/Crafter.Graphics-VulkanDevice.cppm @@ -25,8 +25,6 @@ export namespace Crafter { inline static VkFormat depthFormat = VK_FORMAT_UNDEFINED; static void CreateDevice(); static void CHECK_VK_RESULT(VkResult result); - static void CreateBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size, VkBuffer *buffer, VkDeviceMemory *memory, void *data = nullptr); - static void CreateBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, vks::Buffer *buffer, VkDeviceSize size, void *data = nullptr); static std::uint32_t GetMemoryType(std::uint32_t typeBits, VkMemoryPropertyFlags properties); }; } \ No newline at end of file diff --git a/Crafter.Graphics.cppm b/Crafter.Graphics.cppm index c803a73..ee8d222 100644 --- a/Crafter.Graphics.cppm +++ b/Crafter.Graphics.cppm @@ -11,4 +11,5 @@ export import :VulkanPipeline; export import :VulkanShader; export import :VulkanElement; export import :Camera; -export import :VulkanElementFromPipeline; \ No newline at end of file +export import :VulkanElementFromPipeline; +export import :VulkanBuffer; \ No newline at end of file diff --git a/project.json b/project.json index 80a729e..2eb9d49 100644 --- a/project.json +++ b/project.json @@ -6,7 +6,7 @@ "standard": "c++26", "source_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics-UiElement", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-WindowWaylandVulkan", "VulkanBuffer", "VulkanTools", "Crafter.Graphics-VulkanElement", "Crafter.Graphics-Camera"], "c_files": ["wayland-xdg-decoration-unstable-v1-client-protocol", "xdg-shell-protocol", "shm"], - "module_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics", "Crafter.Graphics-UiElement", "Crafter.Graphics-Types", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-VulkanPipeline", "Crafter.Graphics-VulkanShader", "Crafter.Graphics-WindowWaylandVulkan", "Crafter.Graphics-VulkanElement", "Crafter.Graphics-VulkanElementFromPipeline", "Crafter.Graphics-Camera"], + "module_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics", "Crafter.Graphics-UiElement", "Crafter.Graphics-Types", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-VulkanPipeline", "Crafter.Graphics-VulkanShader", "Crafter.Graphics-WindowWaylandVulkan", "Crafter.Graphics-VulkanElement", "Crafter.Graphics-VulkanElementFromPipeline", "Crafter.Graphics-Camera", "Crafter.Graphics-VulkanBuffer"], "build_dir": "./build", "output_dir": "./bin", "type":"library",