Program Listing for File VkScopedBuffer.cpp

Return to documentation for file (Source\Azura\RenderSystem\Src\Vulkan\VkScopedBuffer.cpp)

#include "Vulkan/VkScopedBuffer.h"
#include "Vulkan/VkCore.h"
#include "Vulkan/VkMacros.h"

namespace Azura {
namespace Vulkan {

VkScopedBuffer::VkScopedBuffer(VkDevice device,
                               const VkBufferUsageFlags usage,
                               const U32 bufferSize,
                               const VkMemoryPropertyFlags memoryProperties,
                               const VkPhysicalDeviceMemoryProperties& phyDeviceMemoryProperties,
  const Log& logger)
  : m_device(device),
    log_VulkanRenderSystem(std::move(logger)) {
  Create(device, usage, bufferSize, memoryProperties, phyDeviceMemoryProperties);
}

VkScopedBuffer::VkScopedBuffer(const Log& logger)
  : m_device(), log_VulkanRenderSystem(std::move(logger)) {
}

void VkScopedBuffer::Create(VkDevice device,
                            VkBufferUsageFlags usage,
                            U32 bufferSize,
                            VkMemoryPropertyFlags memoryProperties,
                            const VkPhysicalDeviceMemoryProperties& phyDeviceMemoryProperties) {
  m_device = device;

  VkBufferCreateInfo bufferInfo = {};
  bufferInfo.sType              = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  bufferInfo.size               = bufferSize;
  bufferInfo.usage              = usage;
  bufferInfo.sharingMode        = VK_SHARING_MODE_EXCLUSIVE;

  // TODO(vasumahesh1): Need an encapsulation for Sharing Mode

  VERIFY_VK_OP(log_VulkanRenderSystem, vkCreateBuffer(device, &bufferInfo, nullptr, &m_buffer),
    "Failed to create buffer");

  VkMemoryRequirements memRequirements;
  vkGetBufferMemoryRequirements(device, m_buffer, &memRequirements);

  VkMemoryAllocateInfo allocInfo = {};
  allocInfo.sType                = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
  allocInfo.allocationSize       = memRequirements.size;
  allocInfo.memoryTypeIndex      =
    VkCore::FindMemoryType(memRequirements.memoryTypeBits, memoryProperties, phyDeviceMemoryProperties);

  VERIFY_VK_OP(log_VulkanRenderSystem, vkAllocateMemory(device, &allocInfo, nullptr, &m_memory),
    "Failed to allocate buffer memory")

  vkBindBufferMemory(device, m_buffer, m_memory, 0);
}

void* VkScopedBuffer::MapMemory(VkDeviceSize size, VkDeviceSize offset) const {
  void* data;
  vkMapMemory(m_device, m_memory, offset, size, 0, &data);
  return data;
}

void VkScopedBuffer::UnMapMemory() const {
  vkUnmapMemory(m_device, m_memory);
}

VkBuffer VkScopedBuffer::Real() const {
  return m_buffer;
}

VkDeviceMemory VkScopedBuffer::Memory() const {
  return m_memory;
}

VkDescriptorBufferInfo VkScopedBuffer::GetDescriptorInfo(U32 offset, U32 range) const {
  VkDescriptorBufferInfo bufferInfo;
  bufferInfo.buffer = Real();
  bufferInfo.offset = offset;
  bufferInfo.range  = range;

  return bufferInfo;
}

void VkScopedBuffer::CleanUp() const {
  vkDestroyBuffer(m_device, m_buffer, nullptr);
  vkFreeMemory(m_device, m_memory, nullptr);
}
} // namespace Vulkan
} // namespace Azura