SpiecsEngine
 
Loading...
Searching...
No Matches
SlateRenderer.cpp
Go to the documentation of this file.
1/**
2* @file SlateRenderer.cpp.
3* @brief The SlateRenderer Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
9#include "Systems/SlateSystem.h"
10#include "Debugger/Perf/NsightPerfGPUProfilerHUD.h"
11#include "Core/Library/FileLibrary.h"
12
13namespace Spices {
14
15 static scl::thread_unordered_map<std::string, std::shared_ptr<VulkanPipeline>>* m_SlatePipelinesPtr = nullptr;
16
18 const std::string& rendererName ,
19 VulkanState& vulkanState ,
20 const std::shared_ptr<VulkanDescriptorPool>& descriptorPool ,
21 const std::shared_ptr<VulkanDevice>& device ,
22 const std::shared_ptr<RendererResourcePool>& rendererResourcePool
23 )
24 : Renderer(rendererName, vulkanState, descriptorPool, device, rendererResourcePool)
25 {
27
28 m_SlatePipelinesPtr = &m_Pipelines;
30 }
31
33 {
35
36 RendererPassBuilder{ "Slate", this }
37 .AddSubPass("Slate")
38 .AddSwapChainAttachment([](VkAttachmentDescription& description) {
39 description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
40 description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
41 })
44 }
45
47 {
48 DescriptorSetBuilder{ "Slate", this }
49 .AddPushConstant(16)
50 .AddTexture<Texture2D>(0, 0, VK_SHADER_STAGE_FRAGMENT_BIT, {"default.jpg"})
51 .Build();
52 }
53
55 std::shared_ptr<Material> material ,
56 VkPipelineLayout& layout ,
57 std::shared_ptr<RendererSubPass> subPass
58 )
59 {
60 PipelineBuilder{ subPass, material, this }
61 .SetDefault()
62 .SetBindingDescriptions(InputAssembly::GetSlateBindingDescriptions())
63 .SetAttributeDescriptions(InputAssembly::GetSlateAttributeDescriptions())
64 .SetRenderPass()
65 .SetSubPassIndex()
66 .SetPipelineLayout(layout)
67 .SetCullMode(VK_CULL_MODE_NONE)
68 .SetColorAttachments()
69 .Build();
70 }
71
73 {
75
76 /**
77 * @brief Call Parent Function.
78 */
80
81 /**
82 * @breif Init ImGui.
83 */
85 }
86
88 {
90
91 /**
92 * @brief Just call OnSlateResize.
93 */
95 }
96
98 {
100
101 /**
102 * @brief Context, a concept of OpenGL, means OpenGL objects in used during a render stage.
103 * Likes VkInstance.
104 */
105 ImGui::CreateContext();
106
107 /**
108 * @breif Init ImPlot Library's Context.
109 */
110 ImPlot::CreateContext();
111
112 /**
113 * @breif Configuration of ImGui.
114 * Can Set custom UI style here.
115 */
116 ImGuiIO& io = ImGui::GetIO();
117
118 FileLibrary::FileLibrary_CopyFile(
119 SPICES_ENGINE_ASSETS_PATH + "SlateLayout/DefaultLayout.ini",
120 "DefaultLayout.ini"
121 );
122
123 /**
124 * @brief ImGui Slate Layout cache file.
125 * Set nullptr, if not need.
126 */
127 io.IniFilename = "DefaultLayout.ini";
128 io.LogFilename = nullptr;
129 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
130 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
131 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows
132
135
136 /**
137 * @brief Setup Platform / Renderer backends.
138 */
139 ImGui_ImplGlfw_InitForVulkan(m_VulkanState.m_Windows, true);
140
141 /**
142 * @brief Instance a ImGui_ImplVulkan_InitInfo.
143 */
144 ImGui_ImplVulkan_InitInfo init_info = {};
145 init_info.Instance = m_VulkanState.m_Instance;
146 init_info.PhysicalDevice = m_VulkanState.m_PhysicalDevice;
147 init_info.Device = m_VulkanState.m_Device;
148 init_info.QueueFamily = m_VulkanState.m_GraphicQueueFamily;
149 init_info.Queue = m_VulkanState.m_GraphicQueue;
150 init_info.PipelineCache = VK_NULL_HANDLE;
151 init_info.DescriptorPool = m_DescriptorPool->GetPool();
152 init_info.RenderPass = m_Pass->Get();
153 init_info.Subpass = 0;
154 init_info.MinImageCount = MaxFrameInFlight;
155 init_info.ImageCount = MaxFrameInFlight;
156 init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT;
157 init_info.Allocator = VK_NULL_HANDLE;
158 init_info.CheckVkResultFn = [](VkResult result) { VK_CHECK(result); };
159
160 /**
161 * @brief ImGui Init for Vulkan.
162 */
163 ImGui_ImplVulkan_Init(&init_info);
164
165 /**
166 * @brief Create IconFont.
167 */
168 ImGui_ImplVulkan_CreateFontsTexture();
169
170 /**
171 * @brief Init NsightPerf HUD Renderer.
172 */
173 NSIGHTPERF_GPUPROFILERHUD_INITHUDRENDERER;
174
175 VK_CHECK(vkQueueWaitIdle(m_VulkanState.m_GraphicQueue))
176 }
177
179 {
181
182 NSIGHTPERF_GPUPROFILERHUD_RESET
183
184 ImGui_ImplVulkan_Shutdown();
185 ImGui_ImplGlfw_Shutdown();
186 ImPlot::DestroyContext();
187 ImGui::DestroyContext();
188 }
189
191 {
193
194 {
195 SPICES_PROFILE_ZONEN("ImGui_ImplVulkan_NewFrame");
196
197 ImGui_ImplVulkan_NewFrame();
198 }
199
200 {
201 SPICES_PROFILE_ZONEN("ImGui_ImplGlfw_NewFrame");
202
203 ImGui_ImplGlfw_NewFrame();
204 }
205
206 {
207 SPICES_PROFILE_ZONEN("ImGui::NewFrame");
208
209 ImGui::NewFrame();
211 }
212
213 {
214 SPICES_PROFILE_ZONEN("ImGuizmo::BeginFrame");
215
216 ImGuizmo::BeginFrame();
217 }
218
219 {
220 SPICES_PROFILE_ZONEN("NvPerf::Consume");
221
222 NSIGHTPERF_GPUPROFILERHUD_FRAMECONSUME
223 }
224 }
225
226 void SlateRenderer::EndImguiFrame(uint32_t index) const
227 {
229
230 const ImGuiIO& io = ImGui::GetIO();
231
232 ImGui::Render();
233 ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), m_VulkanState.m_GraphicCommandBuffer[index]);
234
235 if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
236 {
237 ImGui::UpdatePlatformWindows();
238 ImGui::RenderPlatformWindowsDefault();
239 }
240 }
241
242 void SlateRenderer::EndImguiFrameAsync(uint32_t index)
243 {
245
246 const ImGuiIO& io = ImGui::GetIO();
247
248 ImGui::Render();
249
250 SubmitCmdsParallel(m_VulkanState.m_GraphicCommandBuffer[index], 0, [&](VkCommandBuffer cmdBuffer) {
251 ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cmdBuffer);
252 });
253
254 if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
255 {
256 ImGui::UpdatePlatformWindows();
257 ImGui::RenderPlatformWindowsDefault();
258 }
259 }
260
261 void SlateRenderer::Render(TimeStep& ts, FrameInfo& frameInfo)
262 {
264
265 RenderBehaveBuilder builder{ this, frameInfo.m_FrameIndex, frameInfo.m_ImageIndex };
266
268
269 SlateSystem::GetRegister()->OnRender();
270
271 builder.BeginRenderPass();
272
274
275 builder.EndRenderPass();
276 }
277
278 std::shared_ptr<VulkanPipeline> SlateRenderer::GetPipeline(const std::string& name)
279 {
281
282 return m_SlatePipelinesPtr->Find(name);
283 }
284}
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
This Class manages all descriptor sets this project.
uint32_t m_FrameIndex
FrameIndex, varying during 0 - (MaxFrameInFlight - 1). Used almost anywhere.
Definition FrameInfo.h:69
uint32_t m_ImageIndex
ImageIndex, varying during 0 - (MaxFrameInFlight - 1). Used in swapchain index and framebuffer index.
Definition FrameInfo.h:75
FrameInfo Class. This class defines the FrameInfo data.
Definition FrameInfo.h:32
static void SetFonts(FontMode fontmode=FontMode::FONT_PROPORTIONAL_SCALED)
Looking for TTF fonts, first on the VULKAN SDK, then Windows default fonts.
static void SetStyle()
Setting common style across samples.
static void MainDockSpace(Side side=Side::Scene, float alpha=1.0f)
Begin a docking space.
The ImGuiH Class. This class defines helper function for slate render.
Definition ImguiHelper.h:61
Material Class. This class contains a branch of parameter and shader, also descriptor.
Definition Material.h:62
RendererResourcePool Class. This class is a pool of all framebuffer's attachment.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.
virtual void BeginRenderPass()
Begin this Renderer's RenderPass.
Definition Renderer.cpp:840
virtual void EndRenderPass()
End this Renderer's RenderPass.
Definition Renderer.cpp:981
This class helps to bind pipeline and bind buffer. Only instanced during Render().
Definition Renderer.h:985
RendererPassBuilder & EndSubPass()
End recording a sub pass.
void Build() const
Build the RendererPass.
RendererPassBuilder & AddSubPass(const std::string &subPassName, Querier::StatisticsFlags flags=Querier::ALL)
Add a new SubPass to Renderer Pass.
virtual void OnSlateResize()
Definition Renderer.cpp:66
Renderer(const std::string &rendererName, VulkanState &vulkanState, const std::shared_ptr< VulkanDescriptorPool > &DescriptorPool, const std::shared_ptr< VulkanDevice > &device, const std::shared_ptr< RendererResourcePool > &rendererResourcePool, bool isLoadDefaultMaterial=true)
Constructor Function. Init member variables.
Definition Renderer.cpp:16
DescriptorSetManager::DescriptorSetCombineFlags m_DescriptorSetCombine
Combination of DescriptorSet.
Definition Renderer.h:2027
virtual void OnSystemInitialize()
This interface is called on render system is registered. Initialize the specific renderer's pipeline,...
Definition Renderer.cpp:38
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
Definition Renderer.h:1992
Renderer Class. This class defines the basic behaves of renderer. When we add an new Renderer,...
Definition Renderer.h:57
void InitImgui() const
Init Imgui.
virtual void OnWindowResizeOver() override
This interface is called on Window resized over (registry by swapchain). If the specific renderer use...
virtual void CreatePipeline(std::shared_ptr< Material > material, VkPipelineLayout &layout, std::shared_ptr< RendererSubPass > subPass) override
The interface is inherited from Renderer. Create Material Specific Pipeline.
void BeginImguiFrame()
Begin Imgui frame.
virtual void CreateRendererPass() override
The interface is inherited from Renderer. Create specific render pass.
SlateRenderer(const std::string &rendererName, VulkanState &vulkanState, const std::shared_ptr< VulkanDescriptorPool > &descriptorPool, const std::shared_ptr< VulkanDevice > &device, const std::shared_ptr< RendererResourcePool > &rendererResourcePool)
Constructor Function. Init member variables.
virtual void OnSystemInitialize() override
Rewrite Renderer OnSystemInitialize to add other code.
void ShutdownImgui()
Shutdown Imgui.
virtual void CreateDescriptorSet() override
The interface is inherited from Renderer. Create specific descriptor set for sub pass.
void EndImguiFrame(uint32_t index) const
End Imgui frame.
virtual void Render(TimeStep &ts, FrameInfo &frameInfo) override
The interface is inherited from Renderer.
static std::shared_ptr< VulkanPipeline > GetPipeline(const std::string &name)
Get slate material pipeline.
void EndImguiFrameAsync(uint32_t index)
End Imgui frame.
SlateRenderer Class. This class defines the imgui render behaves.
This Class handles our engine time step during frames. Global Unique.
Definition TimeStep.h:22
VulkanDescriptorPool Class. This class is the wrapper of VkDescriptorPool.
VulkanInstance Class. This class defines the VulkanDevice behave. This class is just a wrapper of vkd...
This class is a wrapper of VkPipelineLayout and VkPipeline.
Thread safe unordered_map.
static scl::thread_unordered_map< std::string, std::shared_ptr< VulkanPipeline > > * m_SlatePipelinesPtr
This struct contains all Vulkan object in used global.
Definition VulkanUtils.h:74