Moved to VkMesh

This commit is contained in:
antopilo
2024-12-25 16:36:42 -05:00
parent 724459e0dd
commit 1a5a8608fc
7 changed files with 105 additions and 78 deletions

View File

@@ -0,0 +1,52 @@
#include "VkMesh.h"
#include "VkResources.h"
#include "VulkanRenderer.h"
#include "VulkanAllocator.h"
using namespace Nuake;
VkMesh::VkMesh(const std::vector<VkVertex>& vertices, const std::vector<uint32_t>& indices)
{
// First we allocate the buffers on the GPU
const size_t vertexBufferSize = vertices.size() * sizeof(VkVertex);
const size_t indexBufferSize = indices.size() * sizeof(uint32_t);
GPUResources& resources = GPUResources::Get();
VertexBuffer = resources.CreateBuffer(vertexBufferSize, BufferUsage::STORAGE_BUFFER | BufferUsage::TRANSFER_DST, MemoryUsage::GPU_ONLY);
IndexBuffer = resources.CreateBuffer(indexBufferSize, BufferUsage::INDEX_BUFFER | BufferUsage::TRANSFER_DST, MemoryUsage::GPU_ONLY);
// Then we upload to data to those buffers.
UploadtoGPU(vertices, indices);
}
void VkMesh::UploadtoGPU(const std::vector<VkVertex>& vertices, const std::vector<uint32_t>& indices)
{
// Create a staging buffer
AllocatedBuffer staging = AllocatedBuffer(VertexBuffer->GetSize() + IndexBuffer->GetSize(), BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY);
void* mappedData;
vmaMapMemory(VulkanAllocator::Get().GetAllocator(), staging.GetAllocation(), &mappedData);
// copy vertex buffer
memcpy(mappedData, vertices.data(), VertexBuffer->GetSize());
// copy index buffer
memcpy((char*)mappedData + VertexBuffer->GetSize(), indices.data(), IndexBuffer->GetSize());
VkRenderer::Get().ImmediateSubmit([&](VkCommandBuffer cmd) {
VkBufferCopy vertexCopy{ 0 };
vertexCopy.dstOffset = 0;
vertexCopy.srcOffset = 0;
vertexCopy.size = VertexBuffer->GetSize();
vkCmdCopyBuffer(cmd, staging.GetBuffer(), VertexBuffer->GetBuffer(), 1, &vertexCopy);
VkBufferCopy indexCopy{ 0 };
indexCopy.dstOffset = 0;
indexCopy.srcOffset = VertexBuffer->GetSize();
indexCopy.size = IndexBuffer->GetSize();
vkCmdCopyBuffer(cmd, staging.GetBuffer(), IndexBuffer->GetBuffer(), 1, &indexCopy);
});
}

View File

@@ -0,0 +1,28 @@
#pragma once
#include "src/Core/Core.h"
#include "src/Resource/UUID.h"
#include "VulkanAllocatedBuffer.h"
namespace Nuake
{
class VkMesh
{
private:
UUID ID;
Ref<AllocatedBuffer> IndexBuffer;
Ref<AllocatedBuffer> VertexBuffer;
public:
VkMesh(const std::vector<VkVertex>& vertices, const std::vector<uint32_t>& indices);
~VkMesh() = default;
Ref<AllocatedBuffer> GetVertexBuffer() const { return VertexBuffer; }
Ref<AllocatedBuffer> GetIndexBuffer() const { return IndexBuffer; }
private:
void UploadtoGPU(const std::vector<VkVertex>& vertices, const std::vector<uint32_t>& indices);
};
}

View File

@@ -3,6 +3,7 @@
#include "src/Resource/UUID.h"
#include "VulkanAllocatedBuffer.h"
#include <src/Core/Logger.h>
namespace Nuake
{
@@ -21,14 +22,23 @@ namespace Nuake
GPUResources() = default;
~GPUResources() = default;
bool AddBuffer(const UUID& id, const Ref<AllocatedBuffer>& buffer)
Ref<AllocatedBuffer> CreateBuffer(size_t size, BufferUsage flags, MemoryUsage usage)
{
Ref<AllocatedBuffer> buffer = CreateRef<AllocatedBuffer>(size, flags, usage);
Buffers[buffer->GetID()] = buffer;
return buffer;
}
bool AddBuffer(const Ref<AllocatedBuffer>& buffer)
{
const UUID id = buffer->GetID();
if (Buffers.find(id) == Buffers.end())
{
Buffers[id] = buffer;
return true;
}
Logger::Log("Buffer with ID already exists", "vulkan", CRITICAL);
return false;
}
@@ -39,6 +49,7 @@ namespace Nuake
return Buffers[id];
}
Logger::Log("Buffer with ID does not exist", "vulkan", CRITICAL);
return nullptr;
}
};

View File

@@ -5,10 +5,13 @@
#include "VulkanRenderer.h"
#include "vk_mem_alloc.h"
#include "VkResources.h"
using namespace Nuake;
AllocatedBuffer::AllocatedBuffer(size_t inSize, BufferUsage inFlags, MemoryUsage inUsage)
: ID(UUID()),
Size(inSize)
{
// allocate buffer
VkBufferCreateInfo bufferInfo = { .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
@@ -30,25 +33,3 @@ AllocatedBuffer::~AllocatedBuffer()
{
// TODO: deletion of buffer
}
GPUMeshBuffers::GPUMeshBuffers(std::vector<VkVertex> vertices, std::vector<uint32_t> indices)
{
const size_t vertexBufferSize = vertices.size() * sizeof(VkVertex);
const size_t indexBufferSize = indices.size() * sizeof(uint32_t);
vertexBuffer = AllocatedBuffer(vertexBufferSize, BufferUsage::STORAGE_BUFFER | BufferUsage::TRANSFER_DST,
MemoryUsage::GPU_ONLY);
//find the adress of the vertex buffer
VkBufferDeviceAddressInfo deviceAddressInfo
{
.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
.buffer = vertexBuffer.GetBuffer()
};
vertexBufferAddress = vkGetBufferDeviceAddress(VkRenderer::Get().GetDevice(), &deviceAddressInfo);
//create index buffer
indexBuffer = AllocatedBuffer(indexBufferSize, BufferUsage::INDEX_BUFFER | BufferUsage::TRANSFER_DST,
MemoryUsage::GPU_ONLY);
}

View File

@@ -1,6 +1,7 @@
#pragma once
#include "src/Core/Maths.h"
#include "src/Resource/UUID.h"
#include "src/Rendering/Vulkan/VkVertex.h"
#include <vector>
@@ -35,9 +36,11 @@ namespace Nuake
class AllocatedBuffer
{
private:
UUID ID;
VkBuffer Buffer;
VmaAllocation Allocation;
VmaAllocationInfo Info;
size_t Size;
public:
AllocatedBuffer(size_t size, BufferUsage flags, MemoryUsage usage);
@@ -46,6 +49,8 @@ namespace Nuake
VkBuffer GetBuffer() const { return Buffer; }
VmaAllocation GetAllocation() const { return Allocation; }
UUID GetID() const { return ID; }
size_t GetSize() const { return Size; }
};
// push constants for our mesh object draws
@@ -55,17 +60,4 @@ namespace Nuake
VkDeviceAddress vertexBuffer;
};
// holds the resources needed for a mesh
class GPUMeshBuffers
{
public:
AllocatedBuffer indexBuffer;
AllocatedBuffer vertexBuffer;
VkDeviceAddress vertexBufferAddress;
GPUMeshBuffers(std::vector<VkVertex> vertices, std::vector<uint32_t> indices);
GPUMeshBuffers() = default;
~GPUMeshBuffers() = default;
};
}

View File

@@ -99,7 +99,7 @@ void VkRenderer::Initialize()
rect_indices[4] = 1;
rect_indices[5] = 3;
rectangle = UploadMesh(rect_indices, rect_vertices);
rectangle = CreateRef<VkMesh>(rect_vertices, rect_indices);
CameraData camData{};
camData.View = Matrix4(1.0f);
@@ -384,7 +384,7 @@ void VkRenderer::UpdateDescriptorSets()
// Update descriptor set for TriangleBufferDescriptors
VkDescriptorBufferInfo bufferInfo{};
bufferInfo.buffer = rectangle->vertexBuffer.GetBuffer();
bufferInfo.buffer = rectangle->GetVertexBuffer()->GetBuffer();
bufferInfo.offset = 0;
bufferInfo.range = VK_WHOLE_SIZE;
@@ -519,7 +519,7 @@ void VkRenderer::DrawGeometry(VkCommandBuffer cmd)
vkCmdSetScissor(cmd, 0, 1, &scissor);
vkCmdBindIndexBuffer(cmd, rectangle->indexBuffer.GetBuffer(), 0, VK_INDEX_TYPE_UINT32);
vkCmdBindIndexBuffer(cmd, rectangle->GetIndexBuffer()->GetBuffer(), 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(cmd, 6, 1, 0, 0, 0);
//launch a draw command to draw 3 vertices
@@ -869,43 +869,6 @@ void VkRenderer::UploadCameraData(const CameraData& data)
vmaUnmapMemory(VulkanAllocator::Get().GetAllocator(), GetCurrentFrame().CameraStagingBuffer.GetAllocation());
}
Ref<GPUMeshBuffers> VkRenderer::UploadMesh(std::vector<uint32_t> indices, std::vector<VkVertex> vertices)
{
const size_t vertexBufferSize = vertices.size() * sizeof(VkVertex);
const size_t indexBufferSize = indices.size() * sizeof(uint32_t);
auto newSurface = CreateRef<GPUMeshBuffers>(vertices, indices);
AllocatedBuffer staging = AllocatedBuffer(vertexBufferSize + indexBufferSize, BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY);
void* mappedData;
vmaMapMemory(VulkanAllocator::Get().GetAllocator(), staging.GetAllocation(), &mappedData);
// copy vertex buffer
memcpy(mappedData, vertices.data(), vertexBufferSize);
// copy index buffer
memcpy((char*)mappedData + vertexBufferSize, indices.data(), indexBufferSize);
ImmediateSubmit([&](VkCommandBuffer cmd) {
VkBufferCopy vertexCopy{ 0 };
vertexCopy.dstOffset = 0;
vertexCopy.srcOffset = 0;
vertexCopy.size = vertexBufferSize;
vkCmdCopyBuffer(cmd, staging.GetBuffer(), newSurface->vertexBuffer.GetBuffer(), 1, &vertexCopy);
VkBufferCopy indexCopy{ 0 };
indexCopy.dstOffset = 0;
indexCopy.srcOffset = vertexBufferSize;
indexCopy.size = indexBufferSize;
vkCmdCopyBuffer(cmd, staging.GetBuffer(), newSurface->indexBuffer.GetBuffer(), 1, &indexCopy);
});
// TODO: destroy_buffer(staging);
return newSurface;
}
void DescriptorLayoutBuilder::AddBinding(uint32_t binding, VkDescriptorType type)
{
VkDescriptorSetLayoutBinding newbind{};

View File

@@ -16,6 +16,7 @@
#include "vk_mem_alloc.h"
#include "VkMesh.h"
namespace Nuake
{
@@ -192,7 +193,7 @@ namespace Nuake
VkCommandPool ImguiCommandPool;
// Buffers
Ref<GPUMeshBuffers> rectangle;
Ref<VkMesh> rectangle;
AllocatedBuffer CameraBuffer;
@@ -241,7 +242,6 @@ namespace Nuake
void ImmediateSubmit(std::function<void(VkCommandBuffer cmd)>&& function);
void UploadCameraData(const CameraData& data);
Ref<GPUMeshBuffers> UploadMesh(std::vector<uint32_t> indices, std::vector<VkVertex> vertices);
VkDescriptorSet GetViewportDescriptor() const { return DrawImageDescriptors; }
Ref<VulkanImage> GetDrawImage() const { return DrawImage; }