Now using GPUResource manager and updated VkVertex to match real vertex struct

This commit is contained in:
antopilo
2024-12-25 17:01:37 -05:00
parent 1a5a8608fc
commit 3bf57200af
5 changed files with 61 additions and 14 deletions

View File

@@ -22,6 +22,9 @@ namespace Nuake
Ref<AllocatedBuffer> GetVertexBuffer() const { return VertexBuffer; }
Ref<AllocatedBuffer> GetIndexBuffer() const { return IndexBuffer; }
UUID GetID() const { return ID; }
private:
void UploadtoGPU(const std::vector<VkVertex>& vertices, const std::vector<uint32_t>& indices);
};

View File

@@ -11,6 +11,8 @@ namespace Nuake
{
private:
std::map<UUID, Ref<AllocatedBuffer>> Buffers;
std::map<UUID, Ref<VkMesh>> Meshes;
public:
static GPUResources& Get()
@@ -52,5 +54,34 @@ namespace Nuake
Logger::Log("Buffer with ID does not exist", "vulkan", CRITICAL);
return nullptr;
}
Ref<VkMesh> CreateMesh(const std::vector<VkVertex>& vertices, const std::vector<uint32_t>& indices)
{
Ref<VkMesh> mesh = CreateRef<VkMesh>(vertices, indices);
Meshes[mesh->GetID()] = mesh;
return mesh;
}
bool AddMesh(const Ref<VkMesh>& 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<VkMesh> 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;
}
};
}

View File

@@ -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);
*/
}

View File

@@ -20,6 +20,8 @@
#include "VulkanAllocatedBuffer.h"
#include <array>
#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<uint32_t> rect_indices;
rect_indices.resize(6);
@@ -99,14 +101,15 @@ void VkRenderer::Initialize()
rect_indices[4] = 1;
rect_indices[5] = 3;
rectangle = CreateRef<VkMesh>(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, &copy);
vkCmdCopyBuffer(cmd, GetCurrentFrame().CameraStagingBuffer->GetBuffer(), CameraBuffer->GetBuffer(), 1, &copy);
});
vmaUnmapMemory(VulkanAllocator::Get().GetAllocator(), GetCurrentFrame().CameraStagingBuffer.GetAllocation());
vmaUnmapMemory(VulkanAllocator::Get().GetAllocator(), GetCurrentFrame().CameraStagingBuffer->GetAllocation());
}
void DescriptorLayoutBuilder::AddBinding(uint32_t binding, VkDescriptorType type)

View File

@@ -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<AllocatedBuffer> CameraStagingBuffer;
// Semaphore are for GPU -> GPU sync
// Fence are for CPU -> GPU
@@ -195,7 +195,7 @@ namespace Nuake
// Buffers
Ref<VkMesh> rectangle;
AllocatedBuffer CameraBuffer;
Ref<AllocatedBuffer> CameraBuffer;
public:
static VkRenderer& Get()