Program Listing for File VkDrawablePool.h

Return to documentation for file (Source\Azura\RenderSystem\Inc\Vulkan\VkDrawablePool.h)

#pragma once

#include <vulkan/vulkan_core.h>

#include "Generic/Drawable.h"
#include "VkScopedBuffer.h"
#include "VkScopedPipeline.h"
#include "Log/Log.h"
#include "VkScopedImage.h"
#include "VkScopedSampler.h"
#include "VkScopedRenderPass.h"

namespace Azura {
struct ApplicationRequirements;
}

namespace Azura {
namespace Vulkan {

class VkDrawablePool;

class VkDrawable : public Drawable {
public:
  VkDrawable(VkDevice device,
             VkBuffer mainBuffer,
             const Containers::Vector<VkDescriptorSetLayout>& descriptorSetLayouts,
             VkDescriptorPool descriptorPool,
             const DrawableCreateInfo& info,
             U32 numVertexSlots,
             U32 numInstanceSlots,
             U32 numUniformSlots,
             Memory::Allocator& allocator,
             Log logger);

  void WriteDescriptorSets(
    const Containers::Vector<TextureBufferInfo>& textureBufferInfos,
    const Containers::Vector<std::reference_wrapper<VkScopedRenderPass>>& renderPasses,
    const Containers::Vector<SamplerInfo>& samplerInfos,
    const Containers::Vector<VkScopedSampler>& samplers,
    const Containers::Vector<VkScopedImage>& images,
    const Containers::Vector<VkScopedImage>& renderPassAttachments);

  const Containers::Vector<VkDescriptorSet>& GetDescriptorSet() const;

  void CleanUp(VkDevice device) const;

private:
  VkDevice m_device;
  Containers::Vector<VkDescriptorSetLayout> m_descriptorSetLayouts;
  VkDescriptorPool m_descriptorPool;
  VkBuffer m_mainBuffer;

  Containers::Vector<VkDescriptorSet> m_descriptorSets;
  const Log log_VulkanRenderSystem;
};

class VkDrawablePool final : public DrawablePool {
  friend class VkDrawable;

public:
  VkDrawablePool(const DrawablePoolCreateInfo& createInfo,
                 VkDevice device,
                 VkQueue graphicsQueue,
                 VkBufferUsageFlags usage,
                 VkMemoryPropertyFlags memoryProperties,
                 VkCommandPool graphicsCommandPool,
                 VkPipelineLayout pipelineLayout,
                 VkDescriptorPool descriptorPool,
                 const Containers::Vector<VkDescriptorSetLayout>& descriptorSetLayouts,
                 const Containers::Vector<VkScopedRenderPass>& renderPasses,
                 const Containers::Vector<VkScopedImage>& renderPassAttachments,
                 const Containers::Vector<VkShader>& allShaders,
                 const ApplicationRequirements& appReq,
                 const ViewportDimensions& viewport,
                 const VkPhysicalDeviceMemoryProperties& phyDeviceMemoryProperties,
                 const VkPhysicalDeviceProperties& physicalDeviceProperties,
                 const VkScopedSwapChain& swapChain,
                 const Containers::Vector<DescriptorSlot>& descriptorSlots,
                 const DescriptorCount& descriptorCount,
                 Memory::Allocator& allocator,
                 Memory::Allocator& allocatorTemporary,
                 Log logger);

  DrawableID CreateDrawable(const DrawableCreateInfo& createInfo) override;

  void AddShader(U32 shaderId) override;

  void Submit() override;

  void CleanUp() const;

  void GetCommandBuffers(Containers::Vector<std::pair<U32, VkCommandBuffer>>& commandBuffers) const;

  // Drawable Scope Binds
  void BindVertexData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void BindVertexData(DrawableID drawableId, SlotID slot, U32 sourceBuffer, U32 offset, U32 size) override;
  void BindInstanceData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void BindUniformData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;

  // Pool Scope Binds
  void BindTextureData(SlotID slot, const TextureDesc& desc, const U8* buffer) override;
  void BindSampler(SlotID slot, const SamplerDesc& desc) override;

  void SetIndexData(DrawableID drawableId, const U8* buffer, U32 size) override;

  void AppendToMainBuffer(const U8* buffer, U32 bufferSize);

  void BeginUpdates() override;
  void UpdateUniformData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void UpdateVertexData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void UpdateInstanceData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void UpdateTextureData(SlotID slot, const U8* buffer) override;
  void SubmitUpdates() override;

private:
  void SubmitTextureData();

  VkScopedBuffer m_buffer;
  VkScopedBuffer m_stagingBuffer;
  VkDevice m_device;
  Containers::Vector<std::reference_wrapper<VkScopedRenderPass>> m_renderPasses;
  const Containers::Vector<VkDescriptorSetLayout>& m_descriptorSetLayouts;
  const Containers::Vector<DescriptorSlot>& m_descriptorSlots;
  const Containers::Vector<VkScopedImage>& m_renderPassAttachments;
  const Containers::Vector<VkShader>& m_allShaders;

  ViewportDimensions m_viewport;
  VkPhysicalDeviceMemoryProperties m_physicalDeviceMemoryProperties;

  VkDescriptorPool m_descriptorPool;

  Containers::Vector<VkScopedPipeline> m_pipelines;
  VkPipelineLayout m_pipelineLayout;
  VkPipelineFactory m_pipelineFactory;

  Containers::Vector<VkCommandBuffer> m_commandBuffers;
  VkCommandPool m_graphicsCommandPool;

  VkQueue m_graphicsQueue;

  U32 m_mainBufferOffset{0};

  const VkScopedSwapChain& m_swapChain;
  const ApplicationRequirements& m_appRequirements;
  const VkPhysicalDeviceProperties& m_physicalDeviceProperties;

  Containers::Vector<VkDrawable> m_drawables;
  Containers::Vector<VkScopedImage> m_images;
  Containers::Vector<VkScopedSampler> m_samplers;

  const Log log_VulkanRenderSystem;
};

} // namespace Vulkan
} // namespace Azura