From 3bf57200afbebf4c1dc54169c2a2523aa8f30e08 Mon Sep 17 00:00:00 2001 From: antopilo Date: Wed, 25 Dec 2024 17:01:37 -0500 Subject: [PATCH] Now using GPUResource manager and updated VkVertex to match real vertex struct --- Nuake/src/Rendering/Vulkan/VkMesh.h | 3 ++ Nuake/src/Rendering/Vulkan/VkResources.h | 31 +++++++++++++++++++ Nuake/src/Rendering/Vulkan/VkVertex.h | 11 ++++++- Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp | 26 +++++++++------- Nuake/src/Rendering/Vulkan/VulkanRenderer.h | 4 +-- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/Nuake/src/Rendering/Vulkan/VkMesh.h b/Nuake/src/Rendering/Vulkan/VkMesh.h index 82b0a885..715fa62d 100644 --- a/Nuake/src/Rendering/Vulkan/VkMesh.h +++ b/Nuake/src/Rendering/Vulkan/VkMesh.h @@ -22,6 +22,9 @@ namespace Nuake Ref GetVertexBuffer() const { return VertexBuffer; } Ref GetIndexBuffer() const { return IndexBuffer; } + + UUID GetID() const { return ID; } + private: void UploadtoGPU(const std::vector& vertices, const std::vector& indices); }; diff --git a/Nuake/src/Rendering/Vulkan/VkResources.h b/Nuake/src/Rendering/Vulkan/VkResources.h index 62dc2261..3689002e 100644 --- a/Nuake/src/Rendering/Vulkan/VkResources.h +++ b/Nuake/src/Rendering/Vulkan/VkResources.h @@ -11,6 +11,8 @@ namespace Nuake { private: std::map> Buffers; + std::map> Meshes; + public: static GPUResources& Get() @@ -52,5 +54,34 @@ namespace Nuake Logger::Log("Buffer with ID does not exist", "vulkan", CRITICAL); return nullptr; } + + Ref CreateMesh(const std::vector& vertices, const std::vector& indices) + { + Ref mesh = CreateRef(vertices, indices); + Meshes[mesh->GetID()] = mesh; + return mesh; + } + + bool AddMesh(const Ref& mesh) + { + const UUID id = mesh->GetID(); + if (Meshes.find(id) == Meshes.end()) + { + Meshes[id] = mesh; + return true; + } + Logger::Log("Mesh with ID already exists", "vulkan", CRITICAL); + return false; + } + + Ref GetMesh(const UUID& id) + { + if (Meshes.find(id) != Meshes.end()) + { + return Meshes[id]; + } + Logger::Log("Mesh with ID does not exist", "vulkan", CRITICAL); + return nullptr; + } }; } \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/VkVertex.h b/Nuake/src/Rendering/Vulkan/VkVertex.h index 73b42a60..39117612 100644 --- a/Nuake/src/Rendering/Vulkan/VkVertex.h +++ b/Nuake/src/Rendering/Vulkan/VkVertex.h @@ -9,6 +9,15 @@ namespace Nuake float uv_x; Vector3 normal; float uv_y; - Vector4 color; + Vector4 tangent; + Vector4 bitangent; }; + + /* + Vector3 position; + Vector2 uv; + Vector3 normal; + Vector3 tangent = Vector3(0, 1, 0); + Vector3 bitangent = Vector3(1, 0, 0); + */ } diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp index e4f662d8..f6832fac 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp @@ -20,6 +20,8 @@ #include "VulkanAllocatedBuffer.h" #include +#include "VkResources.h" + using namespace Nuake; #include "vk_mem_alloc.h" @@ -83,10 +85,10 @@ void VkRenderer::Initialize() rect_vertices[2].position = { -1, -1, 0 }; rect_vertices[3].position = { -1, 1, 0 }; - rect_vertices[0].color = { 0,0, 0,1 }; - rect_vertices[1].color = { 0.5,0.5,0.5 ,1 }; - rect_vertices[2].color = { 1,0, 0,1 }; - rect_vertices[3].color = { 0,1, 0,1 }; + rect_vertices[0].normal = { 0, 0, 1 }; + rect_vertices[1].normal = { 0.5, 0.5,0.5 }; + rect_vertices[2].normal = { 1.0, 0.0, 1.0f }; + rect_vertices[3].normal = { 0, 1,0 }; std::vector rect_indices; rect_indices.resize(6); @@ -99,14 +101,15 @@ void VkRenderer::Initialize() rect_indices[4] = 1; rect_indices[5] = 3; - rectangle = CreateRef(rect_vertices, rect_indices); + GPUResources& resources = GPUResources::Get(); + rectangle = resources.CreateMesh(rect_vertices, rect_indices); CameraData camData{}; camData.View = Matrix4(1.0f); camData.Projection = Matrix4(1.0f); // init camera buffer - CameraBuffer = AllocatedBuffer(sizeof(CameraData), BufferUsage::STORAGE_BUFFER | BufferUsage::TRANSFER_DST, MemoryUsage::GPU_ONLY); + CameraBuffer = resources.CreateBuffer(sizeof(CameraData), BufferUsage::STORAGE_BUFFER | BufferUsage::TRANSFER_DST, MemoryUsage::GPU_ONLY); UploadCameraData(camData); InitDescriptors(); @@ -273,7 +276,8 @@ void VkRenderer::InitCommands() VK_CALL(vkAllocateCommandBuffers(Device, &cmdAllocInfo, &Frames[i].CommandBuffer)); - Frames[i].CameraStagingBuffer = AllocatedBuffer(sizeof(CameraData), BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY); + GPUResources& resources = GPUResources::Get(); + Frames[i].CameraStagingBuffer = resources.CreateBuffer(sizeof(CameraData), BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY); } VK_CALL(vkCreateCommandPool(Device, &cmdPoolInfo, nullptr, &ImguiCommandPool)); @@ -368,7 +372,7 @@ void VkRenderer::UpdateDescriptorSets() // Update descriptor set for cameras VkDescriptorBufferInfo camBufferInfo{}; - camBufferInfo.buffer = CameraBuffer.GetBuffer(); + camBufferInfo.buffer = CameraBuffer->GetBuffer(); camBufferInfo.offset = 0; camBufferInfo.range = VK_WHOLE_SIZE; @@ -854,7 +858,7 @@ void VkRenderer::UploadCameraData(const CameraData& data) adjustedData.Projection[1][1] *= -1; void* mappedData; - vmaMapMemory(VulkanAllocator::Get().GetAllocator(), (GetCurrentFrame().CameraStagingBuffer.GetAllocation()), &mappedData); + vmaMapMemory(VulkanAllocator::Get().GetAllocator(), (GetCurrentFrame().CameraStagingBuffer->GetAllocation()), &mappedData); memcpy(mappedData, &adjustedData, sizeof(CameraData)); ImmediateSubmit([&](VkCommandBuffer cmd) { @@ -863,10 +867,10 @@ void VkRenderer::UploadCameraData(const CameraData& data) copy.srcOffset = 0; copy.size = sizeof(CameraData); - vkCmdCopyBuffer(cmd, GetCurrentFrame().CameraStagingBuffer.GetBuffer(), CameraBuffer.GetBuffer(), 1, ©); + vkCmdCopyBuffer(cmd, GetCurrentFrame().CameraStagingBuffer->GetBuffer(), CameraBuffer->GetBuffer(), 1, ©); }); - vmaUnmapMemory(VulkanAllocator::Get().GetAllocator(), GetCurrentFrame().CameraStagingBuffer.GetAllocation()); + vmaUnmapMemory(VulkanAllocator::Get().GetAllocator(), GetCurrentFrame().CameraStagingBuffer->GetAllocation()); } void DescriptorLayoutBuilder::AddBinding(uint32_t binding, VkDescriptorType type) diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h index c60dc670..ae62403d 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h @@ -82,7 +82,7 @@ namespace Nuake VkCommandPool CommandPool; // This is like the allocator for a buffer. VkCommandBuffer CommandBuffer; // You send commands in there. - AllocatedBuffer CameraStagingBuffer; + Ref CameraStagingBuffer; // Semaphore are for GPU -> GPU sync // Fence are for CPU -> GPU @@ -195,7 +195,7 @@ namespace Nuake // Buffers Ref rectangle; - AllocatedBuffer CameraBuffer; + Ref CameraBuffer; public: static VkRenderer& Get()