Etterna 0.75.1
Loading...
Searching...
No Matches
RendererVK.h
1#ifndef RENDERER_VULKAN_H
2#define RENDERER_VULKAN_H
3
4#define VK_NO_PROTOTYPES
5#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
6#define VMA_STATIC_VULKAN_FUNCTIONS 0
7#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1
8
9#include "RageUtil/Graphics/Display/Renderer.h"
10#include "RageUtil/Graphics/RageDisplay.h"
11#include "Core/Services/Locator.hpp"
12
13#define VMA_DEBUG_LOG
14#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1
15#define VMA_DEBUG_LOG_FORMAT(format, ...) \
16 do { \
17 if (DISPLAY->DisplayDebugModeEnabled()) { \
18 char buffer[256] = {}; \
19 snprintf(buffer, sizeof(buffer), format, __VA_ARGS__); \
20 std::string str(buffer); \
21 Locator::getLogger()->debug("{}", \
22 "VulkanMemoryAllocator: " + str); \
23 } \
24 } while (false)
25
26#include <vulkan/vulkan_raii.hpp>
27#include <vk_mem_alloc.h>
28#include <VkBootstrap.h>
29#include <array>
30#include <map>
31#include <set>
32#include <utility>
33#include <optional>
34#include "VkUtils.h"
35#include "Texture.h"
36#include "PersistentBuffer.h"
37#include <bitset>
38#include "PipelineCache.h"
39
41{
42 public:
43 RendererVK();
44 std::string GetApiDescription() const override;
45 void InitializeRenderer(const VideoModeParams& p) override;
46 bool IsReadyForRender() override;
47 void OnRender(const ActualVideoModeParams* p,
48 const DisplayAdapter::CommandBatcher& batcher) override;
49 bool IsD3DInternal() override;
50 intptr_t CreateTexture(RageSurface* img, bool RGBA8) override;
51 void UpdateTexture(intptr_t textureHandle,
52 RageSurface* img,
53 int xOffset,
54 int yOffset,
55 int width,
56 int height) override;
57 void DeleteTexture(intptr_t handle) override;
58 void ClearAllTextures() override;
59 RageSurface* CreateScreenshot() override;
60 intptr_t CreateRenderTarget(const RenderTargetParam& param,
61 int& iTextureWidthOut,
62 int& iTextureHeightOut) override;
63 DisplayAdapter::PipelineHandle CreateGraphicsPipeline(
64 const std::string& vertexShaderPath,
65 const std::string& fragmentShaderPath) override;
66 void ReloadPipelines() override;
67 void TryVideoMode(const VideoModeParams& params) override;
68 int GetMaxTextureSize() override;
69 ~RendererVK() override;
70 void RescaleBatchBuffers(size_t sizeScale) override;
71
72 private:
73 constexpr static size_t FramesInFlight = 3;
74
75 vk::raii::Context m_Context;
76 vk::raii::Instance m_Instance = nullptr;
77 vk::raii::DebugUtilsMessengerEXT m_DebugMessenger = nullptr;
78 vk::raii::PhysicalDevice m_PhysicalDevice = nullptr;
79 vk::raii::Device m_Device = nullptr;
80 vk::raii::SurfaceKHR m_Surface = nullptr;
81 vk::raii::Queue m_GraphicsQueue = nullptr;
82 uint32_t m_GraphicsQueueFamily = 0;
83 vk::raii::Queue m_PresentQueue = nullptr;
84 uint32_t m_PresentQueueFamily = 0;
85 VmaAllocator m_Allocator = nullptr;
86 vk::Format m_DepthFormat = {};
87 vk::SampleCountFlagBits m_MsaaSamples = {};
88 void InitVulkanState();
89
90 vk::raii::SwapchainKHR m_Swapchain = nullptr;
91 vk::Extent2D m_SwapchainExtent;
92 std::vector<vk::Image> m_SwapchainImages;
93 vk::Format m_ImageFormat = {};
94 std::array<Texture, FramesInFlight> m_SwapchainDepthTextures;
95 std::array<Texture, FramesInFlight> m_MsaaTextures;
96 bool m_MsaaTexturesAreDirty = false;
97 bool m_SwapchainVSync = false;
98 bool m_SwapchainBorderless = false;
99 bool m_SwapchainIsInvalid = false;
100 bool m_SmoothLines = false;
101
102 void InitSwapchain(uint32_t width,
103 uint32_t height,
104 bool vSync,
105 bool borderlessWindow,
106 bool smoothLines);
107 void RecreateSwapchain();
108 void CleanupSwapchain();
109
110 std::vector<vk::raii::ImageView> m_SwapchainImageViews;
111 void InitImageViews();
112
113 vk::raii::DescriptorSetLayout m_DescriptorSetLayout = nullptr;
114 vk::raii::DescriptorSetLayout m_TextureLayout = nullptr;
115 void InitGraphicsPipeline();
116 std::vector<vk::DescriptorSetLayoutBinding> GetDescriptorBindings();
117 vk::raii::DescriptorPool m_DescriptorPool = nullptr;
118 std::vector<vk::raii::DescriptorSet> m_DescriptorSets;
119
120 std::vector<vk::DescriptorSetLayoutBinding> GetTextureBindings();
121 vk::raii::DescriptorPool m_TextureDescriptorPool = nullptr;
122 vk::raii::DescriptorSet m_TextureDescriptorSet = nullptr;
123
124 vk::raii::CommandPool m_CommandPool = nullptr;
125 void InitCommandPool();
126
127 std::vector<vk::raii::CommandBuffer> m_CommandBuffers;
128 void InitCommandBuffers();
129
130 void TransitionImageLayout(vk::Image& image,
131 vk::ImageLayout oldLayout,
132 vk::ImageLayout newLayout,
133 vk::AccessFlags2 srcAccessMask,
134 vk::AccessFlags2 dstAccessMask,
135 vk::PipelineStageFlags2 srcStageMask,
136 vk::PipelineStageFlags2 dstStageMask,
137 vk::ImageAspectFlags aspectMask,
138 vk::raii::CommandBuffer& commandBuffer);
139
140 std::vector<vk::raii::Semaphore> m_PresentCompleteSemaphore;
141 std::vector<vk::raii::Semaphore> m_RenderFinishedSemaphore;
142 std::vector<vk::raii::Fence> m_InFlightFence;
143 uint32_t m_CurrentFrame = 0;
144 int m_CurrentImage = 0;
145 void InitSyncStructures();
146 void RecordCommands(uint32_t imageIndex,
147 const DisplayAdapter::CommandBatcher& batcher);
148 void SetBlendMode(BlendMode mode, vk::raii::CommandBuffer& buffer);
149
150 std::array<PersistentBuffer, FramesInFlight> m_VertexBuffer;
151 std::array<PersistentBuffer, FramesInFlight> m_IndexBuffer;
152 std::array<PersistentBuffer, FramesInFlight> m_MatrixStateBuffer;
153 std::array<PersistentBuffer, FramesInFlight> m_ShaderScratchBuffer;
154 std::array<PersistentBuffer, FramesInFlight> m_StagingBuffer;
155
156 void InitBatchDescriptors();
157 void InitBatchBuffers(size_t sizeScale);
158 void InitTextureInfo();
159 void UpdateBatchBuffers(const DisplayAdapter::CommandBatcher& batcher);
160
161 std::map<intptr_t, Texture> m_Textures;
162 std::map<intptr_t, Texture> m_DepthTextures;
163 std::set<intptr_t> m_EmptyTextureSlots;
164
165 std::vector<intptr_t> m_DirtyTextures;
166 std::vector<intptr_t> m_DirtyDepthTextures;
167 std::vector<intptr_t> m_DirtyTextureDescriptors;
168 std::vector<vk::ImageMemoryBarrier2> m_DirtyPreBarriers;
169 std::vector<vk::ImageMemoryBarrier2> m_DirtyPostBarriers;
170 std::vector<vk::DescriptorImageInfo> m_DirtyImageInfos;
171 std::vector<vk::WriteDescriptorSet> m_DirtyImageDescWrites;
172 int GetMaxTextureCount();
173 int m_TextureCount = 0;
174 int m_TextureSize = -1;
175 void DestroyTexture(Texture& texture);
176
177 std::array<vk::raii::Sampler, Texture::PossibleSamplerCount> m_Samplers;
178 void InitTextures();
179 void ResolutionChanged() override;
180 intptr_t CreateRenderTargetTexture(int width,
181 int height,
182 bool withAlpha,
183 bool withDepth);
184
185 std::optional<PipelineCache> m_Cache;
186};
187
188#endif
The actual VideoModeParams determined by the LowLevelWindow implementation. Contains all the attribut...
Definition RageDisplay.h:208
Definition CommandBatcher.h:18
Definition Renderer.h:11
Definition RendererVK.h:41
void OnRender(const ActualVideoModeParams *p, const DisplayAdapter::CommandBatcher &batcher) override
Definition RendererVK.cpp:89
The parameters used for the present Video Mode.
Definition RageDisplay.h:102
Definition PipelineHandle.h:7
Definition RageSurface.h:90
Definition RageDisplay.h:245
Definition Texture.h:10