Add Device and Window abstraction

This commit is contained in:
Thraix
2023-03-04 23:02:42 +01:00
parent 1e7d08250e
commit c975ed2674
47 changed files with 854 additions and 614 deletions
+26 -23
View File
@@ -1,9 +1,12 @@
#include "copium/buffer/Buffer.h"
#include "copium/core/Device.h"
#include "copium/core/Instance.h"
namespace Copium
{
Buffer::Buffer(Instance& instance, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkDeviceSize size, int count)
: instance{instance}, size{size}, count{count}
Buffer::Buffer(Vulkan& vulkan, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkDeviceSize size, int count)
: vulkan{vulkan}, size{size}, count{count}
{
VkBufferCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -11,25 +14,25 @@ namespace Copium
createInfo.usage = usage;
createInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
CP_VK_ASSERT(vkCreateBuffer(instance.GetDevice(), &createInfo, nullptr, &handle), "Buffer : Failed to initialize buffer");
CP_VK_ASSERT(vkCreateBuffer(vulkan.GetDevice(), &createInfo, nullptr, &handle), "Buffer : Failed to initialize buffer");
VkMemoryRequirements memoryRequirements;
vkGetBufferMemoryRequirements(instance.GetDevice(), handle, &memoryRequirements);
vkGetBufferMemoryRequirements(vulkan.GetDevice(), handle, &memoryRequirements);
VkMemoryAllocateInfo allocateInfo{};
allocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
allocateInfo.allocationSize = memoryRequirements.size;
allocateInfo.memoryTypeIndex = instance.FindMemoryType(memoryRequirements.memoryTypeBits, properties);
allocateInfo.memoryTypeIndex = vulkan.GetDevice().FindMemoryType(memoryRequirements.memoryTypeBits, properties);
CP_VK_ASSERT(vkAllocateMemory(instance.GetDevice(), &allocateInfo, nullptr, &memory), "Buffer : Failed to allocate buffer memory");
CP_VK_ASSERT(vkAllocateMemory(vulkan.GetDevice(), &allocateInfo, nullptr, &memory), "Buffer : Failed to allocate buffer memory");
vkBindBufferMemory(instance.GetDevice(), handle, memory, 0);
vkBindBufferMemory(vulkan.GetDevice(), handle, memory, 0);
}
Buffer::~Buffer()
{
vkFreeMemory(instance.GetDevice(), memory, nullptr);
vkDestroyBuffer(instance.GetDevice(), handle, nullptr);
vkFreeMemory(vulkan.GetDevice(), memory, nullptr);
vkDestroyBuffer(vulkan.GetDevice(), handle, nullptr);
}
void Buffer::Update(void* indexData, int index)
@@ -39,9 +42,9 @@ namespace Copium
if (mappedData == nullptr)
{
void* data;
vkMapMemory(instance.GetDevice(), memory, index * size, size, 0, &data);
vkMapMemory(vulkan.GetDevice(), memory, index * size, size, 0, &data);
memcpy(data, indexData, size);
vkUnmapMemory(instance.GetDevice(), memory);
vkUnmapMemory(vulkan.GetDevice(), memory);
}
else
{
@@ -52,26 +55,26 @@ namespace Copium
void Buffer::UpdateStaging(void* data)
{
VkDeviceSize bufferSize = size * count;
Buffer stagingBuffer{instance, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, bufferSize, 1};
Buffer stagingBuffer{vulkan, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, bufferSize, 1};
stagingBuffer.Update(data, 0);
CopyBuffer(instance, stagingBuffer, *this, 0, bufferSize);
CopyBuffer(vulkan, stagingBuffer, *this, 0, bufferSize);
}
void Buffer::UpdateStaging(void* data, VkDeviceSize offset, VkDeviceSize size)
{
Buffer stagingBuffer{instance, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size, 1};
Buffer stagingBuffer{vulkan, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size, 1};
stagingBuffer.Update(data, 0);
CopyBuffer(instance, stagingBuffer, *this, offset, size);
CopyBuffer(vulkan, stagingBuffer, *this, offset, size);
}
void* Buffer::Map()
{
CP_ASSERT(mappedData == nullptr, "Map : Mapping an already mapped buffer");
vkMapMemory(instance.GetDevice(), memory, 0, size * count, 0, &mappedData);
vkMapMemory(vulkan.GetDevice(), memory, 0, size * count, 0, &mappedData);
return mappedData;
}
@@ -79,7 +82,7 @@ namespace Copium
{
CP_ASSERT(mappedData != nullptr, "Unmap : Unmapping an already unmapped buffer");
vkUnmapMemory(instance.GetDevice(), memory);
vkUnmapMemory(vulkan.GetDevice(), memory);
mappedData = nullptr;
}
@@ -99,17 +102,17 @@ namespace Copium
return size * (VkDeviceSize)index;
}
void Buffer::CopyBuffer(Instance& instance, const Buffer& srcBuffer, const Buffer& dstBuffer, VkDeviceSize offset, VkDeviceSize size)
void Buffer::CopyBuffer(Vulkan& vulkan, const Buffer& srcBuffer, const Buffer& dstBuffer, VkDeviceSize offset, VkDeviceSize size)
{
VkCommandBufferAllocateInfo allocateInfo{};
allocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
allocateInfo.commandPool = instance.GetCommandPool();
allocateInfo.commandPool = vulkan.GetDevice().GetCommandPool();
allocateInfo.commandBufferCount = 1;
VkCommandBuffer commandBuffer;
CP_VK_ASSERT(vkAllocateCommandBuffers(instance.GetDevice(), &allocateInfo, &commandBuffer), "CopyBuffer : Failed to initialize command buffer");
CP_VK_ASSERT(vkAllocateCommandBuffers(vulkan.GetDevice(), &allocateInfo, &commandBuffer), "CopyBuffer : Failed to initialize command buffer");
VkCommandBufferBeginInfo beginInfo{};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
@@ -131,9 +134,9 @@ namespace Copium
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffer;
vkQueueSubmit(instance.GetGraphicsQueue(), 1, &submitInfo, VK_NULL_HANDLE);
vkQueueWaitIdle(instance.GetGraphicsQueue());
vkQueueSubmit(vulkan.GetDevice().GetGraphicsQueue(), 1, &submitInfo, VK_NULL_HANDLE);
vkQueueWaitIdle(vulkan.GetDevice().GetGraphicsQueue());
vkFreeCommandBuffers(instance.GetDevice(), instance.GetCommandPool(), 1, &commandBuffer);
vkFreeCommandBuffers(vulkan.GetDevice(), vulkan.GetDevice().GetCommandPool(), 1, &commandBuffer);
}
}
+4 -4
View File
@@ -1,6 +1,6 @@
#pragma once
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
#include <vulkan/vulkan.hpp>
@@ -11,7 +11,7 @@ namespace Copium
{
CP_DELETE_COPY_AND_MOVE_CTOR(Buffer);
protected:
Instance& instance;
Vulkan& vulkan;
VkDeviceMemory memory;
VkBuffer handle;
@@ -21,7 +21,7 @@ namespace Copium
void* mappedData = nullptr;
public:
Buffer(Instance& instance, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkDeviceSize size, int count);
Buffer(Vulkan& vulkan, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkDeviceSize size, int count);
virtual ~Buffer();
void Update(void* indexData, int index);
@@ -35,6 +35,6 @@ namespace Copium
VkDeviceSize GetSize() const;
VkDeviceSize GetPosition(int index) const;
static void CopyBuffer(Instance& instance, const Buffer& srcBuffer, const Buffer& dstBuffer, VkDeviceSize offset, VkDeviceSize size);
static void CopyBuffer(Vulkan& vulkan, const Buffer& srcBuffer, const Buffer& dstBuffer, VkDeviceSize offset, VkDeviceSize size);
};
}
@@ -1,26 +1,37 @@
#include "copium/buffer/CommandBuffer.h"
#include "copium/core/Device.h"
#include "copium/core/Instance.h"
#include "copium/core/SwapChain.h"
namespace Copium
{
CommandBuffer::CommandBuffer(Instance& instance, Type type)
: instance{instance}, type{type}
CommandBuffer::CommandBuffer(Vulkan& vulkan, Type type)
: vulkan{vulkan}, type{type}
{
if (type == Type::Dynamic)
commandBuffers.resize(instance.GetMaxFramesInFlight());
else
switch (type)
{
case Type::SingleUse:
commandBuffers.resize(1);
break;
case Type::Dynamic:
commandBuffers.resize(SwapChain::MAX_FRAMES_IN_FLIGHT);
break;
default:
CP_ABORT("CommandBuffer : Unreachable switch case");
}
VkCommandBufferAllocateInfo allocateInfo{};
allocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
allocateInfo.commandPool = instance.GetCommandPool();
allocateInfo.commandPool = vulkan.GetDevice().GetCommandPool();
allocateInfo.commandBufferCount = commandBuffers.size();
CP_VK_ASSERT(vkAllocateCommandBuffers(instance.GetDevice(), &allocateInfo, commandBuffers.data()), "CommandBuffer : Failed to allocate CommandBuffer");
CP_VK_ASSERT(vkAllocateCommandBuffers(vulkan.GetDevice(), &allocateInfo, commandBuffers.data()), "CommandBuffer : Failed to allocate CommandBuffer");
}
CommandBuffer::~CommandBuffer()
{
vkFreeCommandBuffers(instance.GetDevice(), instance.GetCommandPool(), commandBuffers.size(), commandBuffers.data());
vkFreeCommandBuffers(vulkan.GetDevice(), vulkan.GetDevice().GetCommandPool(), commandBuffers.size(), commandBuffers.data());
}
// TODO: Test as constexpr function to see if it avoids the switch case
@@ -30,26 +41,25 @@ namespace Copium
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
beginInfo.flags = 0;
beginInfo.pInheritanceInfo = nullptr;
switch (type)
{
case Type::SingleUse:
beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
currentCommandBuffer = commandBuffers.front();
break;
case Type::Dynamic:
currentCommandBuffer = commandBuffers[instance.GetFlightIndex()];
break;
default:
CP_ABORT("Begin : Unreachable switch case");
}
vkResetCommandBuffer(currentCommandBuffer, 0);
CP_VK_ASSERT(vkBeginCommandBuffer(currentCommandBuffer, &beginInfo), "Begin : Failed to begin command buffer");
vkResetCommandBuffer(commandBuffers[vulkan.GetSwapChain().GetFlightIndex()], 0);
CP_VK_ASSERT(vkBeginCommandBuffer(commandBuffers[vulkan.GetSwapChain().GetFlightIndex()], &beginInfo), "Begin : Failed to begin command buffer");
}
void CommandBuffer::End()
{
vkEndCommandBuffer(currentCommandBuffer);
vkEndCommandBuffer(commandBuffers[vulkan.GetSwapChain().GetFlightIndex()]);
}
void CommandBuffer::Submit()
@@ -57,20 +67,15 @@ namespace Copium
VkSubmitInfo submitInfo{};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &currentCommandBuffer;
submitInfo.pCommandBuffers = &commandBuffers[vulkan.GetSwapChain().GetFlightIndex()];
vkQueueSubmit(instance.GetGraphicsQueue(), 1, &submitInfo, VK_NULL_HANDLE);
vkQueueSubmit(vulkan.GetDevice().GetGraphicsQueue(), 1, &submitInfo, VK_NULL_HANDLE);
// TODO: if singleUse?
vkQueueWaitIdle(instance.GetGraphicsQueue());
}
void CommandBuffer::SubmitAsGraphicsQueue()
{
instance.SubmitGraphicsQueue({currentCommandBuffer});
vkQueueWaitIdle(vulkan.GetDevice().GetGraphicsQueue());
}
CommandBuffer::operator VkCommandBuffer() const
{
return currentCommandBuffer;
return commandBuffers[vulkan.GetSwapChain().GetFlightIndex()];
}
}
@@ -1,6 +1,6 @@
#pragma once
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
#include <vulkan/vulkan.hpp>
@@ -16,21 +16,18 @@ namespace Copium
SingleUse, Dynamic
};
private:
Instance& instance;
Vulkan& vulkan;
std::vector<VkCommandBuffer> commandBuffers;
const Type type;
VkCommandBuffer currentCommandBuffer{VK_NULL_HANDLE};
public:
CommandBuffer(Instance& instance, Type type);
CommandBuffer(Vulkan& vulkan, Type type);
virtual ~CommandBuffer();
void Begin();
void End();
void Submit();
void SubmitAsGraphicsQueue();
operator VkCommandBuffer() const;
};
@@ -2,8 +2,8 @@
namespace Copium
{
CommandBufferScoped::CommandBufferScoped(Instance& instance)
: CommandBuffer{instance, Type::SingleUse}
CommandBufferScoped::CommandBufferScoped(Vulkan& vulkan)
: CommandBuffer{vulkan, Type::SingleUse}
{
CommandBuffer::Begin();
}
@@ -1,7 +1,7 @@
#pragma once
#include "copium/buffer/CommandBuffer.h"
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
namespace Copium
@@ -10,7 +10,7 @@ namespace Copium
{
CP_DELETE_COPY_AND_MOVE_CTOR(CommandBufferScoped);
public:
CommandBufferScoped(Instance& instance);
CommandBufferScoped(Vulkan& vulkan);
~CommandBufferScoped() override;
};
+18 -16
View File
@@ -1,12 +1,14 @@
#include "copium/buffer/Framebuffer.h"
#include "copium/buffer/CommandBuffer.h"
#include "copium/core/Device.h"
#include "copium/core/SwapChain.h"
#include "copium/sampler/Image.h"
namespace Copium
{
Framebuffer::Framebuffer(Instance& instance, uint32_t width, uint32_t height)
: instance{instance}, width{width}, height{height}
Framebuffer::Framebuffer(Vulkan& vulkan, uint32_t width, uint32_t height)
: vulkan{vulkan}, width{width}, height{height}
{
InitializeImage();
InitializeDepthBuffer();
@@ -17,19 +19,19 @@ namespace Copium
Framebuffer::~Framebuffer()
{
for (auto& framebuffer : framebuffers)
vkDestroyFramebuffer(instance.GetDevice(), framebuffer, nullptr);
vkDestroyRenderPass(instance.GetDevice(), renderPass, nullptr);
vkDestroyFramebuffer(vulkan.GetDevice(), framebuffer, nullptr);
vkDestroyRenderPass(vulkan.GetDevice(), renderPass, nullptr);
}
void Framebuffer::Resize(uint32_t width, uint32_t height)
{
vkDeviceWaitIdle(instance.GetDevice());
vkDeviceWaitIdle(vulkan.GetDevice());
this->width = width;
this->height = height;
colorAttachment.reset();
depthAttachment.reset();
for (auto&& framebuffer : framebuffers)
vkDestroyFramebuffer(instance.GetDevice(), framebuffer, nullptr);
vkDestroyFramebuffer(vulkan.GetDevice(), framebuffer, nullptr);
InitializeImage();
InitializeDepthBuffer();
InitializeFramebuffers();
@@ -44,7 +46,8 @@ namespace Copium
VkRenderPassBeginInfo renderPassBeginInfo{};
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassBeginInfo.renderPass = renderPass;
renderPassBeginInfo.framebuffer = framebuffers[instance.GetFlightIndex()];
renderPassBeginInfo.framebuffer = framebuffers[vulkan.GetSwapChain().GetFlightIndex()];
;
renderPassBeginInfo.renderArea.offset = {0, 0};
renderPassBeginInfo.renderArea.extent = {width, height};
renderPassBeginInfo.clearValueCount = clearValues.size();
@@ -77,7 +80,7 @@ namespace Copium
VkFramebuffer Framebuffer::GetFramebuffer() const
{
return framebuffers[instance.GetFlightIndex()];
return framebuffers[vulkan.GetSwapChain().GetFlightIndex()];
}
const ColorAttachment& Framebuffer::GetColorAttachment() const
@@ -97,12 +100,12 @@ namespace Copium
void Framebuffer::InitializeImage()
{
colorAttachment = std::make_unique<ColorAttachment>(instance, width, height);
colorAttachment = std::make_unique<ColorAttachment>(vulkan, width, height);
}
void Framebuffer::InitializeDepthBuffer()
{
depthAttachment = std::make_unique<DepthAttachment>(instance, width, height);
depthAttachment = std::make_unique<DepthAttachment>(vulkan, width, height);
}
void Framebuffer::InitializeRenderPass()
@@ -118,7 +121,7 @@ namespace Copium
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkAttachmentDescription depthAttachment{};
depthAttachment.format = Image::SelectDepthFormat(instance);
depthAttachment.format = Image::SelectDepthFormat(vulkan);
depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
@@ -166,14 +169,13 @@ namespace Copium
renderPassCreateInfo.dependencyCount = dependencies.size();
renderPassCreateInfo.pDependencies = dependencies.data();
CP_VK_ASSERT(vkCreateRenderPass(instance.GetDevice(), &renderPassCreateInfo, nullptr, &renderPass), "InitializeRenderPass : Failed to initialze render pass");
CP_VK_ASSERT(vkCreateRenderPass(vulkan.GetDevice(), &renderPassCreateInfo, nullptr, &renderPass), "InitializeRenderPass : Failed to initialze render pass");
}
void Framebuffer::InitializeFramebuffers()
{
framebuffers.resize(instance.GetMaxFramesInFlight());
for (size_t i = 0; i < instance.GetMaxFramesInFlight(); ++i)
framebuffers.resize(SwapChain::MAX_FRAMES_IN_FLIGHT);
for (size_t i = 0; i < framebuffers.size(); ++i)
{
std::vector<VkImageView> attachments{colorAttachment->GetImageView(i), depthAttachment->GetImageView()};
@@ -186,7 +188,7 @@ namespace Copium
createInfo.height = height;
createInfo.layers = 1;
CP_VK_ASSERT(vkCreateFramebuffer(instance.GetDevice(), &createInfo, nullptr, &framebuffers[i]), "InitializeFramebuffers : Failed to initialize framebuffer");
CP_VK_ASSERT(vkCreateFramebuffer(vulkan.GetDevice(), &createInfo, nullptr, &framebuffers[i]), "InitializeFramebuffers : Failed to initialize framebuffer");
}
}
}
+4 -3
View File
@@ -1,6 +1,7 @@
#pragma once
#include "copium/core/Instance.h"
#include "copium/buffer/CommandBuffer.h"
#include "copium/core/Vulkan.h"
#include "copium/sampler/ColorAttachment.h"
#include "copium/sampler/DepthAttachment.h"
#include "copium/util/Common.h"
@@ -13,7 +14,7 @@ namespace Copium
{
CP_DELETE_COPY_AND_MOVE_CTOR(Framebuffer);
private:
Instance& instance;
Vulkan& vulkan;
std::unique_ptr<ColorAttachment> colorAttachment;
std::unique_ptr<DepthAttachment> depthAttachment;
@@ -23,7 +24,7 @@ namespace Copium
uint32_t width;
uint32_t height;
public:
Framebuffer(Instance& instance, uint32_t width, uint32_t height);
Framebuffer(Vulkan& vulkan, uint32_t width, uint32_t height);
~Framebuffer();
void Resize(uint32_t width, uint32_t height);
@@ -1,13 +1,11 @@
#include "copium/buffer/IndexBuffer.h"
#include "copium/buffer/CommandBuffer.h"
#include <vulkan/vulkan.hpp>
namespace Copium
{
IndexBuffer::IndexBuffer(Instance& instance, int indexCount)
: Buffer{instance, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexCount * sizeof(uint16_t), 1},
IndexBuffer::IndexBuffer(Vulkan& vulkan, int indexCount)
: Buffer{vulkan, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexCount * sizeof(uint16_t), 1},
indexCount{indexCount}
{}
+3 -2
View File
@@ -1,7 +1,8 @@
#pragma once
#include "copium/buffer/Buffer.h"
#include "copium/core/Instance.h"
#include "copium/buffer/CommandBuffer.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
namespace Copium
@@ -12,7 +13,7 @@ namespace Copium
private:
int indexCount;
public:
IndexBuffer(Instance& instance, int indexCount);
IndexBuffer(Vulkan& vulkan, int indexCount);
void Bind(const CommandBuffer& commandBuffer);
void Draw(const CommandBuffer& commandBuffer);
@@ -1,9 +1,11 @@
#include "copium/buffer/UniformBuffer.h"
#include "copium/core/SwapChain.h"
namespace Copium
{
UniformBuffer::UniformBuffer(Instance& instance, VkDeviceSize size)
: Buffer{instance, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size, instance.GetMaxFramesInFlight()}
UniformBuffer::UniformBuffer(Vulkan& vulkan, VkDeviceSize size)
: Buffer{vulkan, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size, SwapChain::MAX_FRAMES_IN_FLIGHT}
{}
VkDescriptorBufferInfo UniformBuffer::GetDescriptorBufferInfo(int index) const
@@ -1,7 +1,7 @@
#pragma once
#include "copium/buffer/Buffer.h"
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
#include <vulkan/vulkan.hpp>
@@ -13,18 +13,19 @@ namespace Copium
CP_DELETE_COPY_AND_MOVE_CTOR(UniformBuffer);
public:
UniformBuffer(Instance& instance, VkDeviceSize size);
UniformBuffer(Vulkan& vulkan, VkDeviceSize size);
VkDescriptorBufferInfo GetDescriptorBufferInfo(int index) const;
template <typename T>
void Update(const T& t);
};
template <typename T>
void UniformBuffer::Update(const T& t)
{
CP_ASSERT(sizeof(T) == Buffer::GetSize(), "Update : Template size is not the same as buffer size %u != %u", sizeof(T), Buffer::GetSize());
Buffer::Update((void*)&t, instance.GetFlightIndex());
Buffer::Update((void*)&t, vulkan.GetSwapChain().GetFlightIndex());
}
}
@@ -2,8 +2,8 @@
namespace Copium
{
VertexBuffer::VertexBuffer(Instance& instance, const VertexDescriptor& descriptor, int vertexCount)
: Buffer{instance, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, descriptor.GetVertexSize() * vertexCount, 1}
VertexBuffer::VertexBuffer(Vulkan& vulkan, const VertexDescriptor& descriptor, int vertexCount)
: Buffer{vulkan, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, descriptor.GetVertexSize() * vertexCount, 1}
{
VkDeviceSize offset = 0;
for (auto&& binding : descriptor.GetBindings())
@@ -2,7 +2,7 @@
#include "copium/buffer/Buffer.h"
#include "copium/buffer/CommandBuffer.h"
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/pipeline/VertexDescriptor.h"
#include "copium/util/Common.h"
@@ -18,7 +18,7 @@ namespace Copium
std::vector<VkDeviceSize> bindingOffsets;
std::vector<VkDeviceSize> bindingSizes;
public:
VertexBuffer(Instance& instance, const VertexDescriptor& descriptor, int vertexCount);
VertexBuffer(Vulkan& vulkan, const VertexDescriptor& descriptor, int vertexCount);
void Bind(const CommandBuffer& commandBuffer);
void UpdateStaging(uint32_t binding, void* data);