Program Listing for File Rasterizer.hpp

Return to documentation for file (Src/GraphicsEngineVulkan/renderer/Rasterizer.hpp)

#pragma once
#include <vulkan/vulkan.h>

#include "renderer/pushConstants/PushConstantRasterizer.hpp"
#include "scene/Scene.hpp"
#include "scene/Texture.hpp"
#include "vulkan_base/VulkanDevice.hpp"
#include "vulkan_base/VulkanSwapChain.hpp"

namespace Kataglyphis::VulkanRendererInternals {
class Rasterizer
{
  public:
    Rasterizer();

    void init(VulkanDevice *device,
      VulkanSwapChain *vulkanSwapChain,
      const std::vector<VkDescriptorSetLayout> &descriptorSetLayouts,
      VkCommandPool &commandPool);

    void shaderHotReload(const std::vector<VkDescriptorSetLayout> &descriptor_set_layouts);

    Texture &getOffscreenTexture(uint32_t index);

    void setPushConstant(PushConstantRasterizer pushConstant);

    void recordCommands(VkCommandBuffer &commandBuffer,
      uint32_t image_index,
      Scene *scene,
      const std::vector<VkDescriptorSet> &descriptorSets);

    void cleanUp();

    ~Rasterizer();

  private:
    VulkanDevice *device{ VK_NULL_HANDLE };
    VulkanSwapChain *vulkanSwapChain{ VK_NULL_HANDLE };

    CommandBufferManager commandBufferManager;

    std::vector<VkFramebuffer> framebuffer;
    std::vector<Texture> offscreenTextures;
    Texture depthBufferImage;

    VkPushConstantRange push_constant_range{ VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM, 0, 0 };
    PushConstantRasterizer pushConstant{ glm::mat4(1.f) };

    VkPipeline graphics_pipeline{ VK_NULL_HANDLE };
    VkPipelineLayout pipeline_layout{ VK_NULL_HANDLE };
    VkRenderPass render_pass{ VK_NULL_HANDLE };

    void createTextures(VkCommandPool &commandPool);
    void createGraphicsPipeline(const std::vector<VkDescriptorSetLayout> &descriptorSetLayouts);
    void createRenderPass();
    void createFramebuffer();
    void createPushConstantRange();
};
}// namespace Kataglyphis::VulkanRendererInternals