summaryrefslogtreecommitdiff
path: root/engine/xe_renderer.hpp
blob: 58b782d8034223811ca0fbd36a294a522a1302b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#pragma once

#include "xe_swap_chain.hpp"
#include "xe_window.hpp"
#include "xe_device.hpp"
#include "xe_model.hpp"

#include <memory>
#include <vector>
#include <cassert>

namespace xe {
class Renderer {
  public:

    Renderer(Window &window, Device &device);
    ~Renderer();

    Renderer(const Renderer &) = delete;
    Renderer operator=(const Renderer &) = delete;

    VkRenderPass getSwapChainRenderPass() const { return xeSwapChain->getRenderPass(); }
    float getAspectRatio() const { return xeSwapChain->extentAspectRatio(); }
    bool isFrameInProgress() const { return isFrameStarted; }

    VkCommandBuffer getCurrentCommandBuffer() const { 
      assert(isFrameStarted && "Cannot get command buffer when frame not in progress");
      return commandBuffers[currentFrameIndex];
    }

    int getFrameIndex() const {
      assert(isFrameStarted && "Cannot get frame index when frame not in progress");
      return currentFrameIndex;
    }

    VkCommandBuffer beginFrame();
    void endFrame();
    void beginSwapChainRenderPass(VkCommandBuffer commandBuffer);
    void endSwapChainRenderPass(VkCommandBuffer commandBuffer);

  private:
    void createCommandBuffers();
    void freeCommandBuffers();
    void recreateSwapChain();

    Window& xeWindow;
    Device& xeDevice;
    std::unique_ptr<SwapChain> xeSwapChain;
    std::vector<VkCommandBuffer> commandBuffers;

    uint32_t currentImageIndex;
    int currentFrameIndex{0};
    bool isFrameStarted{false};
};
}