Program Listing for File VkRenderer.h

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

#pragma once

#include <vulkan/vulkan_core.h>

#include "Containers/Vector.h"
#include "Generic/Renderer.h"
#include "VkCore.h"
#include "Vulkan/VkPlatform.h"
#include "Vulkan/VkScopedBuffer.h"
#include "Vulkan/VkScopedPipeline.h"
#include "Vulkan/VkShader.h"
#include "Log/Log.h"
#include "Vulkan/VkDrawablePool.h"
#include "Vulkan/VkTextureManager.h"
#include "Vulkan/VkScopedSwapChain.h"
#include "Vulkan/VkScopedRenderPass.h"
#include "Vulkan/VkComputePool.h"

namespace Azura {
class Window;
}

namespace Azura {
namespace Vulkan {

class VkRenderer : public Renderer {
public:
  VkRenderer(const ApplicationInfo& appInfo,
             const DeviceRequirements& deviceRequirements,
             const ApplicationRequirements& appRequirements,
             const SwapChainRequirements& swapChainRequirement,
             const RenderPassRequirements& renderPassRequirements,
             const DescriptorRequirements& descriptorRequirements,
             const ShaderRequirements& shaderRequirements,
             Memory::Allocator& mainAllocator,
             Memory::Allocator& drawAllocator,
             Window& window);

  ~VkRenderer();

  VkRenderer(const VkRenderer& other) = delete;
  VkRenderer(VkRenderer&& other) noexcept = delete;
  VkRenderer& operator=(const VkRenderer& other) = delete;
  VkRenderer& operator=(VkRenderer&& other) noexcept = delete;

  DrawablePool& CreateDrawablePool(const DrawablePoolCreateInfo& createInfo) override;
  ComputePool& CreateComputePool(const ComputePoolCreateInfo& createInfo) override;

  VkDevice GetDevice() const;
  String GetRenderingAPI() const override;
  void Submit() override;
  void CreateDescriptorInfo();
  void RenderFrame() override;

  void SnapshotFrame(const String& exportPath) const override;

  void BindRenderTarget(U32 renderTargetId, const TextureDesc& desc, const U8* buffer) override;
  void BindBufferTarget(U32 bufferTargetId, const U8* buffer) override;

private:
  void AddShader(const ShaderCreateInfo& info) override;

  Log log_VulkanRenderSystem;

  Memory::HeapMemoryBuffer m_perFrameBuffer;
  Memory::MonotonicAllocator m_perFrameAllocator;

  Containers::Vector<VkDrawablePool> m_drawablePools;
  Containers::Vector<VkComputePool> m_computePools;

#ifdef BUILD_DEBUG
  VkDebugReportCallbackEXT m_callback;
#endif

  VkInstance m_instance;
  VkSurfaceKHR m_surface;
  VkPhysicalDevice m_physicalDevice;
  VkQueueIndices m_queueIndices;
  VkDevice m_device;
  VkScopedSwapChain m_swapChain;
  Containers::Vector<VkScopedRenderPass> m_renderPasses;
  Containers::Vector<VkDescriptorSetLayout> m_descriptorSetLayouts;

  Containers::Vector<VkSemaphore> m_imageAvailableSemaphores;
  Containers::Vector<VkSemaphore> m_renderFinishedSemaphores;
  Containers::Vector<VkFence> m_inFlightFences;

  Containers::Vector<VkShader> m_shaders;

  Containers::Vector<VkScopedImage> m_renderPassAttachmentImages;

  VkCommandPool m_graphicsCommandPool;
  VkCommandPool m_transferCommandPool;

  VkQueue m_graphicsQueue;
  VkQueue m_presentQueue;
  VkQueue m_transferQueue;

  VkPhysicalDeviceProperties m_physicalDeviceProperties{};

  VkPipelineLayout m_pipelineLayout{};
  VkDescriptorPool m_descriptorPool{};

};
} // namespace Vulkan
} // namespace Azura