Skip to content

Commit

Permalink
Shrank Down Uniform Buffer code alot
Browse files Browse the repository at this point in the history
Removed creating descriptor sets in uniform buffer, instead I can just write to those then update descriptor sets based on layout idea in my google doc (I think)
  • Loading branch information
tomheeleynz committed Jun 14, 2022
1 parent 4adae37 commit 806ac1d
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 193 deletions.
41 changes: 41 additions & 0 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,4 +244,45 @@ namespace Arcane {

vkFreeCommandBuffers(logicalDevice.GetLogicalDevice(), commandPool, 1, &commandBuffer);
}

void VulkanDevice::CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory)
{
VkBufferCreateInfo bufferInfo{};
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
bufferInfo.size = size;
bufferInfo.usage = usage;
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;

if (vkCreateBuffer(m_Device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) {
printf("Failed to create buffer\n");
}

VkMemoryRequirements memRequirements;
vkGetBufferMemoryRequirements(m_Device, buffer, &memRequirements);

VkMemoryAllocateInfo allocInfo{};
allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
allocInfo.allocationSize = memRequirements.size;
allocInfo.memoryTypeIndex = FindMemoryType(memRequirements.memoryTypeBits, properties);

if (vkAllocateMemory(m_Device, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) {
printf("Failed to allocate buffer memory\n");
}

vkBindBufferMemory(m_Device, buffer, bufferMemory, 0);
}

uint32_t VulkanDevice::FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
{
VkPhysicalDeviceMemoryProperties memProperties;
vkGetPhysicalDeviceMemoryProperties(m_PhysicalDevice.GetPhysicalDevice(), &memProperties);

for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) {
if ((typeFilter & (1 << i)) && (memProperties.memoryTypes[i].propertyFlags & properties) == properties) {
return i;
}
}

return -1;
}
}
3 changes: 3 additions & 0 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ namespace Arcane {

VkCommandBuffer CreateCommandBuffer(VkCommandBufferLevel commandBufferLevel);
void FlushCommandBuffer(VkCommandBuffer commandBuffer);

void CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory);
uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
private:
VulkanPhysicalDevice m_PhysicalDevice;
VkDevice m_Device;
Expand Down
108 changes: 9 additions & 99 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanUniformBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,96 +5,22 @@

namespace Arcane
{
static uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
{
Application& app = Application::Get();
VkDevice logicalDevice = static_cast<VulkanContext*>(app.GetWindow().GetContext())->GetDevice().GetLogicalDevice();
VkPhysicalDevice physicalDevice = static_cast<VulkanContext*>(app.GetWindow().GetContext())->GetPhysicalDevice().GetPhysicalDevice();

VkPhysicalDeviceMemoryProperties memProperties;
vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProperties);

for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) {
if ((typeFilter & (1 << i)) && (memProperties.memoryTypes[i].propertyFlags & properties) == properties) {
return i;
}
}

return -1;
}

VulkanUniformBuffer::VulkanUniformBuffer(std::initializer_list<UniformDescriptor*> descriptors)
VulkanUniformBuffer::VulkanUniformBuffer(uint32_t size)
{
VulkanContext* context = static_cast<VulkanContext*>(Application::Get().GetWindow().GetContext());
VulkanSwapChain& swapchain = context->GetSwapChain();
VkDevice logicalDevice = context->GetDevice().GetLogicalDevice();
uint32_t imageCount = swapchain.GetSwapChainImagesSize();

uint32_t uniformBufferSize = 0;
bool foundUniformBuffer = false;
// Size of uniform buffer
VkDeviceSize bufferSize = size;
m_UniformBuffers.resize(imageCount);
m_UniformBuffers.resize(imageCount);

// Get The sizes for creating uniform buffers
for (UniformDescriptor* descriptor : descriptors)
{
UniformDescriptorType currentType = descriptor->GetType();

switch (currentType)
{
case UniformDescriptorType::UniformBufferObject: {
UniformObject* object = static_cast<UniformObject*>(descriptor);
uniformBufferSize = object->GetSize();
foundUniformBuffer = true;
break;
}
default:
break;
}
for (int i = 0; i < imageCount; i++) {
// Create Uniform Buffer
context->GetDevice().CreateBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, m_UniformBuffers[i], m_UniformBuffersMemory[i]);
}

VkDeviceSize bufferSize = uniformBufferSize;
m_UniformBuffers.resize(swapchain.GetSwapChainImagesSize());
m_UniformBuffersMemory.resize(swapchain.GetSwapChainImagesSize());

if (foundUniformBuffer) {
for (int i = 0; i < swapchain.GetSwapChainImagesSize(); i++) {
VkBufferCreateInfo bufferInfo{};
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
bufferInfo.size = uniformBufferSize;
bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;

if (vkCreateBuffer(logicalDevice, &bufferInfo, nullptr, &m_UniformBuffers[i]) != VK_SUCCESS) {
printf("Uniform Buffer Not Created\n");
}
else {
printf("Uniform Buffer Created\n");
}

if (foundUniformBuffer) {
VkMemoryRequirements memRequirements;
vkGetBufferMemoryRequirements(logicalDevice, m_UniformBuffers[i], &memRequirements);

VkMemoryAllocateInfo allocInfo{};
allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
allocInfo.allocationSize = memRequirements.size;
allocInfo.memoryTypeIndex = FindMemoryType(memRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);

if (vkAllocateMemory(logicalDevice, &allocInfo, nullptr, &m_UniformBuffersMemory[i]) != VK_SUCCESS) {
printf("Failed to allocated Uniform buffer memory\n");
}
else {
printf("Allocated Uniform buffer memory\n");
}

vkBindBufferMemory(logicalDevice, m_UniformBuffers[i], m_UniformBuffersMemory[i], 0);
}
}

m_DescriptorSet = new VulkanDescriptorSet(m_UniformBuffers, descriptors);
}
else {
m_DescriptorSet = new VulkanDescriptorSet(descriptors);
}

}

void VulkanUniformBuffer::WriteData(void* data, uint32_t size)
Expand All @@ -108,20 +34,4 @@ namespace Arcane
memcpy(tempData, data, size);
vkUnmapMemory(logicalDevice, m_UniformBuffersMemory[swapchain.GetImageIndex()]);
}

void VulkanUniformBuffer::WriteData(UniformObject* object)
{
VulkanContext* context = static_cast<VulkanContext*>(Application::Get().GetWindow().GetContext());
VulkanSwapChain& swapchain = context->GetSwapChain();
VkDevice logicalDevice = context->GetDevice().GetLogicalDevice();

for (int i = 0; i < swapchain.GetSwapChainImagesSize(); i++)
{
void* tempData;
vkMapMemory(logicalDevice, m_UniformBuffersMemory[i], 0, object->GetSize(), 0, &tempData);
memcpy(tempData, object->GetData(), object->GetSize());
vkUnmapMemory(logicalDevice, m_UniformBuffersMemory[i]);
}
}

}
7 changes: 1 addition & 6 deletions Arcane/src/Arcane/Platform/Vulkan/VulkanUniformBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,11 @@ namespace Arcane
class VulkanUniformBuffer : public UniformBuffer
{
public:
VulkanUniformBuffer(std::initializer_list<UniformDescriptor*> descriptors);
VulkanUniformBuffer(uint32_t size);

void WriteData(void* data, uint32_t size) override;
void WriteData(UniformObject* object) override;

VkDescriptorSetLayout GetLayout() { return m_DescriptorSet->GetLayout(); }
std::vector<VkDescriptorSet> GetDescriptorSets() { return m_DescriptorSet->GetDescriptorSets(); }
private:
std::vector<VkBuffer> m_UniformBuffers;
std::vector<VkDeviceMemory> m_UniformBuffersMemory;
VulkanDescriptorSet* m_DescriptorSet;
};
}
4 changes: 2 additions & 2 deletions Arcane/src/Arcane/Renderer/UniformBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

namespace Arcane
{
UniformBuffer* UniformBuffer::Create(std::initializer_list<UniformDescriptor*> descriptors)
UniformBuffer* UniformBuffer::Create(uint32_t size)
{
switch (RendererAPI::Current())
{
case RendererAPIType::Vulkan: return new VulkanUniformBuffer(descriptors);
case RendererAPIType::Vulkan: return new VulkanUniformBuffer(size);
default:
break;
}
Expand Down
87 changes: 1 addition & 86 deletions Arcane/src/Arcane/Renderer/UniformBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,96 +8,11 @@

namespace Arcane
{
enum class UniformDescriptorType
{
UniformBufferObject,
TextureSampler
};

enum class UniformDescriptorLocation
{
VERTEX,
FRAGMENT
};

class UniformDescriptor
{
public:
UniformDescriptor(UniformDescriptorType _type) {
m_Type = _type;
}

void SetBinding(uint32_t bindNum) { m_BindNum = bindNum; }
uint32_t GetBinding() { return m_BindNum; }

UniformDescriptorType GetType() { return m_Type; }


void SetLocation(UniformDescriptorLocation location) { m_Location = location; }
UniformDescriptorLocation GetLocation() { return m_Location; }
private:
uint32_t m_BindNum = -1;
UniformDescriptorType m_Type;
UniformDescriptorLocation m_Location;
};

class UniformObject : public UniformDescriptor
{
public:
UniformObject(uint32_t size) : UniformDescriptor(UniformDescriptorType::UniformBufferObject) {
m_Size = size;
}

uint32_t GetSize() { return m_Size; }
void* GetData() { return m_Data; }

void WriteData(void* data) { m_Data = data; };
private:
uint32_t m_Size;
void* m_Data = nullptr;

};

class TextureSampler : public UniformDescriptor
{
public:
enum class TextureType
{
BASIC,
FRAMEBUFFER
};

public:
TextureSampler(Texture* texture) : UniformDescriptor(UniformDescriptorType::TextureSampler) {
m_Texture = texture;
m_Type = TextureType::BASIC;
}

TextureSampler(Framebuffer* framebuffer) : UniformDescriptor(UniformDescriptorType::TextureSampler) {
m_Framebuffer = framebuffer;
m_Type = TextureType::FRAMEBUFFER;
}

TextureType GetType() { return m_Type; }

Framebuffer* GetFramebuffer() { return m_Framebuffer; };
Texture* GetTexture() { return m_Texture; }

void SetTexture(Texture* texture) { m_Texture = texture; }
void SetFramebuffer(Framebuffer* framebuffer) { m_Framebuffer = framebuffer; }
private:
Texture* m_Texture = nullptr;
Framebuffer* m_Framebuffer = nullptr;
TextureType m_Type;
};

class UniformBuffer
{
public:
virtual void WriteData(void* data, uint32_t size) = 0;
// -- Write a uniform object
virtual void WriteData(UniformObject* object) = 0;
static UniformBuffer* Create(std::initializer_list<UniformDescriptor*> descriptors);
static UniformBuffer* Create(uint32_t size);
private:

};
Expand Down

0 comments on commit 806ac1d

Please sign in to comment.