SpiecsEngine
 
Loading...
Searching...
No Matches
VulkanRenderBackend.cpp
Go to the documentation of this file.
1/**
2* @file VulkanRenderBackend.cpp.
3* @brief The VulkanRenderBackend Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
9#include "Debugger/Aftermath/NsightAftermathGpuCrashTracker.h"
10#include "Debugger/Perf/NsightPerfGPUProfilerHUD.h"
11#include "Debugger/Perf/NsightPerfGPUProfilerContinuous.h"
12#include "Debugger/Perf/NsightPerfGPUProfilerReportGenerator.h"
13#include "Debugger/Perf/NsightPerfGPUProfilerOneshotCollection.h"
14#include "Render/Renderer/RendererManager.h"
15#include "Render/RendererResource/RendererResourcePool.h"
16#include "Systems/SlateSystem.h"
17#include "..\..\Core\Thread\ThreadModel.h"
18
19#include "Render/Renderer/SpecificRenderer/PreRenderer.h"
20#include "Render/Renderer/SpecificRenderer/RayTracingRenderer.h"
21#include "Render/Renderer/SpecificRenderer/BasePassRenderer.h"
22#include "Render/Renderer/SpecificRenderer/SlateRenderer.h"
23#include "Render/Renderer/SpecificRenderer/SceneComposeRenderer.h"
24#include "Render/Renderer/SpecificRenderer/WorldPickRenderer.h"
25#include "Render/Renderer/SpecificRenderer/SpriteRenderer.h"
26#include "Render/Renderer/SpecificRenderer/WorldPickStage2Renderer.h"
27#include "Render/Renderer/SpecificRenderer/ParticleRenderer.h"
28#include "Render/Renderer/SpecificRenderer/TestRenderer.h"
29#include "Render/Renderer/SpecificRenderer/RayTracingComposeRenderer.h"
30#include "Render/Renderer/SpecificRenderer/ViewportGridRenderer.h"
31#include "Render/Renderer/SpecificRenderer/PostProcessRenderer.h"
32
33namespace Spices {
34
35 /**
36 * @brief Window create parameter.
37 */
38 const WindowInfo initInfo{ 2200, 1300, "Spices Engine", std::make_shared<WindowIcon>(SPICES_ENGINE_ASSETS_PATH + "Textures/src/Hello_Spices_Engine.png") };
39
43
45 {
47
48 /**
49 * @brief Init NsightAftermath GpuCrashTracker.
50 */
51 {
52 NSIGHTAFTERMATH_GPUCRASHTRACKER_INIT
53 }
54
55 /**
56 * @brief Create basic Vulkan Objects.
57 */
58 {
59 m_VulkanWindows = std::make_unique<VulkanWindows> (m_VulkanState, initInfo);
60 m_VulkanInstance = std::make_unique<VulkanInstance> (m_VulkanState, "app", "engine");
61 m_VulkanDevice = std::make_shared<VulkanDevice> (m_VulkanState);
62
63 /**
64 * @brief Init Debuggers
65 */
66 {
67
69 NSIGHTPERF_GPUPROFILERREPORT_CREATEINSTANCE(m_VulkanState)
70 NSIGHTPERF_GPUPROFILERONESHOT_CREATEINSTANCE(m_VulkanState)
71 NSIGHTPERF_GPUPROFILERCONTINUOUS_CREATEINSTANCE(m_VulkanState)
72 NSIGHTPERF_GPUPROFILERHUD_CREATEINSTANCE(m_VulkanState)
73 }
74
75 m_VmaAllocator = std::make_shared<VulkanMemoryAllocator>(m_VulkanState);
76 m_VulkanCommandPool = std::make_unique<VulkanCommandPool> (m_VulkanState);
77 m_VulkanCommandBuffer = std::make_unique<VulkanCommandBuffer> (m_VulkanState);
78 m_VulkanSwapChain = std::make_unique<VulkanSwapChain> (m_VulkanState, m_VulkanDevice);
79 }
80
81 /**
82 * @brief Create VulkanDescriptorPool.
83 */
84 {
85 m_VulkanDescriptorPool = VulkanDescriptorPool::Builder()
86 .SetPoolFlags(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT | VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT)
87 .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000)
88 .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000)
89 .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000)
90 .AddPoolSize(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000)
91 .AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1000)
92 .Build(m_VulkanState);
93 }
94
95 /**
96 * @brief Create RendererResourcePool.
97 * @todo Move to
98 */
99 {
100 m_RendererResourcePool = std::make_shared<RendererResourcePool>();
101 }
102
103 /**
104 * @brief Create CmdBuffers ThreadPool.
105 */
106 {
107 ThreadModel::Get()->InitRHIThreadPool([&](std::shared_ptr<VulkanCmdThreadPool>& ptr) {
108 ptr = std::make_shared<VulkanCmdThreadPool>(m_VulkanState, "RHIT");
109 });
110 }
111
112 /**
113 * @brief Create all Specific Renderer.
114 */
115 {
116 RendererManager::Get()
117 .Push<PreRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
118
119 /* @brief Ray Tracing Renderer */
120 .Push<RayTracingRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
121 .Push<RayTracingComposeRenderer>(m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
122
123 /* @brief Rasterization Renderer */
124 .Push<BasePassRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
125 .Push<SceneComposeRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
126 .Push<PostProcessRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
127 .Push<ViewportGridRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
128 .Push<SpriteRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
129 .Push<WorldPickRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
130 .Push<WorldPickStage2Renderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
131 //.Push<ParticleRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
132 .Push<TestRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool)
133 .Push<SlateRenderer> (m_VulkanState, m_VulkanDescriptorPool, m_VulkanDevice, m_RendererResourcePool);
134 }
135 }
136
138 {
140
141 /**
142 * @brief Destroy Debuggers
143 */
145 NSIGHTPERF_GPUPROFILERCONTINUOUS_RESET
146 NSIGHTPERF_GPUPROFILERREPORT_RESET(m_VulkanState)
147 NSIGHTPERF_GPUPROFILERONESHOT_QUIT
148
149 /**
150 * @brief Release RendererResourcePool.
151 */
152 m_RendererResourcePool = nullptr;
153
154 /**
155 * @brief Release VulkanDescriptorPool.
156 */
157 m_VulkanDescriptorPool = nullptr;
158
159 /**
160 * @brief Release all Specific Renderer.
161 */
162 {
164 .Pop("SlateRenderer")
165 .Pop("TestRenderer")
166 //.Pop("ParticleRenderer")
167 .Pop("WorldPickStage2Renderer")
168 .Pop("WorldPickRenderer")
169 .Pop("SpriteRenderer")
170 .Pop("ViewportGridRenderer")
171 .Pop("PostProcessRenderer")
172 .Pop("SceneComposeRenderer")
173 .Pop("BasePassRenderer")
174 .Pop("RayTracingComposeRenderer")
175 .Pop("RayTracingRenderer")
176 .Pop("PreRenderer");
177 }
178 }
179
181 {
183
184 /**
185 * @brief Get new size of Windows.
186 */
187 int width = 0, height = 0;
188 glfwGetFramebufferSize(m_VulkanState.m_Windows, &width, &height);
189 while (width == 0 || height == 0)
190 {
191 glfwGetFramebufferSize(m_VulkanState.m_Windows, &width, &height);
192 glfwWaitEvents();
193 }
194
195 /**
196 * @brief Might not needed?
197 */
198 VK_CHECK(vkQueueWaitIdle(m_VulkanState.m_GraphicQueue))
199
200 /**
201 * @brief Create an specific event.
202 */
203 WindowResizeOverEvent event(width, height);
204
205 /**
206 * @brief Execute the global event function pointer by passing the specific event.
207 */
209 }
210
212 {
214
215 VkFence fence[2] = { m_VulkanState.m_ComputeFence[frameInfo.m_FrameIndex], m_VulkanState.m_GraphicFence[frameInfo.m_FrameIndex] };
216
217 {
218 SPICES_PROFILE_ZONEN("BeginFrame::WaitForFences");
219
220 /**
221 * @brief Wait for last frame done.
222 */
223 VK_CHECK(vkWaitForFences(m_VulkanState.m_Device, 2, fence, VK_TRUE, UINT64_MAX))
224 }
225
226 {
227 SPICES_PROFILE_ZONEN("BeginFrame::ResetFences");
228
229 /**
230 * @brief Reset Fences.
231 */
232 VK_CHECK(vkResetFences(m_VulkanState.m_Device, 2, fence))
233 }
234
235 /**
236 * @brief Prepare Writing another SwapchainImage.
237 */
238 const VkResult result = vkAcquireNextImageKHR(
239 m_VulkanState.m_Device ,
240 m_VulkanState.m_SwapChain ,
241 UINT64_MAX ,
242 m_VulkanState.m_GraphicImageSemaphore[frameInfo.m_FrameIndex] , // Signal Semaphore.
243 VK_NULL_HANDLE ,
244 &frameInfo.m_ImageIndex
245 );
246
247 /**
248 * @brief Confine whether swapchain need recreated.
249 */
250 if (result == VK_ERROR_OUT_OF_DATE_KHR)
251 {
253 }
254 else if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
255 {
256 SPICES_CORE_ERROR("Failed to acquire swap chain image!")
257 }
258
259 {
260 SPICES_PROFILE_ZONEN("StartFrame::Suspend Delay ThreadPool");
261
262 ThreadModel::Get()->GetGameThreadPool()->Suspend();
263 }
264
265 {
266 SPICES_PROFILE_ZONEN("StartFrame::Free Parallel CommandBuffer");
267
268 ThreadModel::Get()->GetRHIThreadPool()->FreeParallelCommandBuffers(frameInfo.m_FrameIndex);
269 }
270
271 {
272 SPICES_PROFILE_ZONEN("StartFrame::NsightPerfFrameStart0");
273
274 NSIGHTPERF_GPUPROFILERREPORT_BEGINFRAME(m_VulkanState.m_GraphicQueue, m_VulkanState.m_GraphicQueueFamily)
275 NSIGHTPERF_GPUPROFILERCONTINUOUS_BEGINFRAME(m_VulkanState)
276 }
277
278 {
279 SPICES_PROFILE_ZONEN("BeginFrame::BeginCommandBuffer");
280
281 /**
282 * @brief Instance a VkCommandBufferBeginInfo.
283 */
284 VkCommandBufferBeginInfo beginInfo{};
285 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
286 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
287 beginInfo.pInheritanceInfo = nullptr;
288
289 /**
290 * @brief Start recording a Graphic CommandBuffer.
291 */
292 VK_CHECK(vkBeginCommandBuffer(m_VulkanState.m_ComputeCommandBuffer[frameInfo.m_FrameIndex], &beginInfo))
293
294 /**
295 * @brief Start recording a Graphic CommandBuffer.
296 */
297 beginInfo.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
298 VK_CHECK(vkBeginCommandBuffer(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], &beginInfo))
299
300 /**
301 * @brief Checkpoint of start primary commandBuffers.
302 */
303 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "BeginPrimaryComputeCommandBuffer")
304 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "BeginPrimaryGraphicCommandBuffer")
305 }
306
307 {
308 SPICES_PROFILE_ZONEN("StartFrame::NsightPerfFrameStart1");
309
310 NSIGHTPERF_GPUPROFILERONESHOT_BEGINFRAME(m_VulkanState, m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex])
311 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], "Frame", 0, frameInfo.m_FrameIndex)
312 }
313 }
314
316 {
318
319 {
320 SPICES_PROFILE_ZONEN("EndFrame::NsightPerfOneShotEndFrameRange");
321
322 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], 0)
323 }
324
325 {
326 SPICES_PROFILE_ZONEN("EndFrame::EndCommandBuffer");
327
328 /**
329 * @brief Checkpoint of end primary commandBuffers.
330 */
331 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "EndPrimaryGraphicCommandBuffer")
332 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "BeginPrimaryGraphicCommandBuffer")
333
334 /**
335 * @brief End recording the CommandBuffer.
336 */
337 VK_CHECK(vkEndCommandBuffer(m_VulkanState.m_ComputeCommandBuffer[frameInfo.m_FrameIndex]))
338 VK_CHECK(vkEndCommandBuffer(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex]))
339 }
340
341 {
342 SPICES_PROFILE_ZONEN("EndFrame::ComputeQueueSubmit");
343
344 DEBUGUTILS_BEGINQUEUELABEL(m_VulkanState.m_ComputeQueue, "MainComputeQueue")
345
346 VkSemaphore waitSemphores[] = { m_VulkanState.m_GraphicImageSemaphore[frameInfo.m_FrameIndex] };
347 VkSemaphore signalSemaphores[] = { m_VulkanState.m_ComputeQueueSemaphore[frameInfo.m_FrameIndex] };
348 VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT };
349
350 /**
351 * @brief Instance a VkSubmitInfo.
352 */
353 VkSubmitInfo submitInfo{};
354 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
355 submitInfo.waitSemaphoreCount = 1;
356 submitInfo.pWaitSemaphores = waitSemphores;
357 submitInfo.pWaitDstStageMask = waitStages;
358 submitInfo.commandBufferCount = 1;
359 submitInfo.pCommandBuffers = &m_VulkanState.m_ComputeCommandBuffer[frameInfo.m_FrameIndex];
360 submitInfo.signalSemaphoreCount = 1;
361 submitInfo.pSignalSemaphores = signalSemaphores;
362
363 /**
364 * @brief Submit all commands recorded in queue.
365 */
366 VK_CHECK(vkQueueSubmit(m_VulkanState.m_ComputeQueue, 1, &submitInfo, m_VulkanState.m_ComputeFence[frameInfo.m_FrameIndex]))
367
368 DEBUGUTILS_ENDQUEUELABEL(m_VulkanState.m_ComputeQueue)
369 }
370
371 {
372 SPICES_PROFILE_ZONEN("EndFrame::GraphicQueueSubmit");
373
374 DEBUGUTILS_BEGINQUEUELABEL(m_VulkanState.m_GraphicQueue, "MainGraphicQueue")
375
376 VkSemaphore waitSemphores[] = { m_VulkanState.m_ComputeQueueSemaphore[frameInfo.m_FrameIndex] };
377 VkSemaphore signalSemaphores[] = { m_VulkanState.m_GraphicQueueSemaphore[frameInfo.m_FrameIndex] };
378 VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
379
380 /**
381 * @brief Instance a VkSubmitInfo.
382 */
383 VkSubmitInfo submitInfo{};
384 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
385 submitInfo.waitSemaphoreCount = 1;
386 submitInfo.pWaitSemaphores = waitSemphores;
387 submitInfo.pWaitDstStageMask = waitStages;
388 submitInfo.commandBufferCount = 1;
389 submitInfo.pCommandBuffers = &m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex];
390 submitInfo.signalSemaphoreCount = 1;
391 submitInfo.pSignalSemaphores = signalSemaphores;
392
393 /**
394 * @brief Submit all commands recorded in queue.
395 */
396 VK_CHECK(vkQueueSubmit(m_VulkanState.m_GraphicQueue, 1, &submitInfo, m_VulkanState.m_GraphicFence[frameInfo.m_FrameIndex]))
397
398 DEBUGUTILS_ENDQUEUELABEL(m_VulkanState.m_GraphicQueue)
399 }
400
401 {
402 SPICES_PROFILE_ZONEN("EndFrame::NsightPerfFrameEnd");
403
404 NSIGHTPERF_GPUPROFILERHUD_ENDFRAME(m_VulkanState)
405 NSIGHTPERF_GPUPROFILERCONTINUOUS_ENDFRAME
406 NSIGHTPERF_GPUPROFILERREPORT_ENDFRAME(m_VulkanState)
407 NSIGHTPERF_GPUPROFILERONESHOT_ENDFRAME
408 }
409
410 {
411 SPICES_PROFILE_ZONEN("EndFrame::QueuePresent");
412
413 DEBUGUTILS_BEGINQUEUELABEL(m_VulkanState.m_PresentQueue, "PresentQueue")
414
415 /**
416 * @brief Instance a VkPresentInfoKHR.
417 */
418 VkPresentInfoKHR presentInfo{};
419 presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
420 presentInfo.waitSemaphoreCount = 1;
421 presentInfo.pWaitSemaphores = &m_VulkanState.m_GraphicQueueSemaphore[frameInfo.m_FrameIndex];
422 presentInfo.swapchainCount = 1;
423 presentInfo.pSwapchains = &m_VulkanState.m_SwapChain;
424 presentInfo.pImageIndices = &frameInfo.m_ImageIndex;
425 presentInfo.pResults = nullptr;
426
427 /**
428 * @brief Present the swapchain image to windows.
429 */
430 VkResult result = vkQueuePresentKHR(m_VulkanState.m_PresentQueue, &presentInfo);
431 if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || m_VulkanWindows->IsResized())
432 {
433 m_VulkanWindows->SetResized(false);
435 }
436 else if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
437 {
438 SPICES_CORE_ERROR("Failed to present swap chain image!")
439 }
440
441 DEBUGUTILS_ENDQUEUELABEL(m_VulkanState.m_PresentQueue)
442 }
443
444 {
445 SPICES_PROFILE_ZONEN("StartFrame::Continue Delay ThreadPool");
446
447 ThreadModel::Get()->GetGameThreadPool()->Continue();
448 }
449 }
450
452 {
454
455 /**
456 * @brief Run all specific renderer.
457 */
458 RendererManager::Run(ts, frameInfo);
459 }
460
462 {
464
465 EventDispatcher dispatcher(event);
466
470 }
471
473 {
475
476 m_VulkanDevice->RequerySwapChainSupport();
477
478 /**
479 * @brief Recreate Swapchain here.
480 */
481 m_VulkanSwapChain->Destroy();
482 m_VulkanSwapChain->Create();
483
484 /**
485 * @brief Recreate all rendererpass which size is determained by viewportsize.
486 */
488
489 /**
490 * @brief Do not block the event.
491 */
492 return false;
493 }
494
496 {
498
499 /**
500 * @brief Recreate all resources which size is determained by viewportsize.
501 */
502 m_RendererResourcePool->OnSlateResize(event.GetWidth(), event.GetHeight());
503
504 /**
505 * @brief Recreate all rendererpass which size is determained by viewportsize.
506 */
508
509 /**
510 * @brief Do not block the event.
511 */
512 return false;
513 }
514
516 {
518
519 /**
520 * @brief Recreate descriptorset or other.
521 */
523
524 return false;
525 }
526}
#define BIND_EVENT_FN(x)
Bind Event.
Definition Event.h:88
#define SPICES_PROFILE_GPU_CREATEINSTANCE(...)
#define SPICES_PROFILE_VK_DESTROY
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
EventDispatcher(Event &event)
Constructor Function.
Definition Event.h:172
This Class store a Specific Event type first and Dispatch a event handle function to it.
Definition Event.h:156
static EventCallbackFn GetEventCallbackFn()
Get Global Root Event Function Pointer.
Definition Event.cpp:17
This Class is the basic Event Class. Inherit from it and create specific event class.
Definition Event.h:96
uint32_t m_FrameIndex
FrameIndex, varying during 0 - (MaxFrameInFlight - 1). Used almost anywhere.
Definition FrameInfo.h:69
FrameInfo Class. This class defines the FrameInfo data.
Definition FrameInfo.h:32
This Class is inherited from Event Class.
Definition WorldEvent.h:43
static void OnSlateResize()
Event Called on Slate resize.
static void OnWindowResizeOver()
This function is called on swapchain resized or out of data. Recreate all renderer render pass,...
static void Run(TimeStep &ts, FrameInfo &frameInfo)
All renderer Start to Render.
static RendererManager & Get()
Get Static RendererManager.
static RendererManager & Pop(const std::string &rendererName)
Pop a renderer from this manager, and destroy it.
static void OnMeshAddedWorld()
Event Called on world mark querier.
RendererManager Class. This class Manages all renderer.
RendererResourcePool Class. This class is a pool of all framebuffer's attachment.
This Class is inherited from Event Class. Called by Viewport Resize.
Definition SlateEvent.h:18
This Class handles our engine time step during frames. Global Unique.
Definition TimeStep.h:22
VulkanDescriptorPool Class. This class is the wrapper of VkDescriptorPool.
void EndFrame(FrameInfo &frameInfo)
End record the frame with vulkan render backend.
void RecreateSwapChain()
Called OnSlateResize.
virtual ~VulkanRenderBackend()
Destructor Function.
VulkanRenderBackend()
Constructor Function.
static VulkanState m_VulkanState
The VulkanState in use.
static std::shared_ptr< VulkanDescriptorPool > m_VulkanDescriptorPool
The VulkanDescriptorPool in use.
static std::shared_ptr< RendererResourcePool > m_RendererResourcePool
The RendererResourcePool in use.
bool OnMeshAddedWorldEvent(WorldEvent &event)
This function is called on world mark query tick.
void RenderFrame(TimeStep &ts, FrameInfo &frameInfo)
Draw World.
void OnEvent(Event &event)
This function is called on global event function is called.
void BeginFrame(FrameInfo &frameInfo)
Start record a new frame with vulkan render backend.
bool OnWindowResizeOver(WindowResizeOverEvent &event)
This function is called on window is resized over.
bool OnSlateResize(SlateResizeEvent &event)
This function is called on viewport is resized.
This class defines the render backend behaves of Vulkan.
WindowResizeOverEvent(uint32_t width, uint32_t height)
Constructor Function.
This Class is inherited from Event Class. Inherit from it and create specific KeyEvent class....
Definition WorldEvent.h:20
const WindowInfo initInfo
Window create parameter.
uint32_t m_GraphicQueueFamily
This struct contains all Vulkan object in used global.
Definition VulkanUtils.h:74
This struct defines the basic information of window.