SpiecsEngine
 
Loading...
Searching...
No Matches
Renderer.h
Go to the documentation of this file.
1/**
2* @file Renderer.h
3* @brief The Renderer Class Definitions.
4* @author Spices.
5*/
6
7#pragma once
8/******************************Core Header**********************************************************/
9#include "Core/Core.h"
10#include "DescriptorSetManager/DescriptorSetManager.h"
11#include "Render/Renderer/RendererPass/RendererPass.h"
12#include "RenderPassStatistics\PipelineStatisticsQuerier.h"
13#include "..\..\..\assets\Shaders\src\Header\ShaderCommon.h"
14#include "Debugger/Aftermath/NsightAftermathGpuCrashTracker.h"
15#include "Debugger/Perf/NsightPerfGPUProfilerReportGenerator.h"
16#include "Debugger/Perf/NsightPerfGPUProfilerOneshotCollection.h"
17#include "Core/Container/BehaveStateList.h"
18#include "..\..\Core\Thread\ThreadModel.h"
19#include "Render/Renderer/RendererCache/RendererCache.h"
20#include "Core/Container/ThreadUnorderedMap.h"
21/***************************************************************************************************/
22
23/******************************Vulkan Backend Header************************************************/
24#include "Render/FrameInfo.h"
25#include "Render/Vulkan/VulkanRenderBackend.h"
26#include "Render/Vulkan/VulkanPipeline.h"
27#include "Render/Vulkan/VulkanUtils.h"
28#include "Render/Vulkan/VulkanBuffer.h"
29#include "Render/Vulkan/VulkanImage.h"
30#include "Render/Vulkan/VulkanDescriptor.h"
31#include "Render/Vulkan/VulkanRenderPass.h"
32#include "Render/Vulkan/VulkanDeviceGeneratedCommandsNV.h"
33/***************************************************************************************************/
34
35/******************************World Component Header***********************************************/
36#include "World/World/World.h"
37#include "World/Components/MeshComponent.h"
38#include "World/Components/TransformComponent.h"
39/***************************************************************************************************/
40
41/******************************STL Header***********************************************************/
42#include <memory>
43#include <unordered_map>
44/***************************************************************************************************/
45
46static constexpr uint32_t MAX_DIRECTIONALLIGHT_NUM = 10;
47static constexpr uint32_t MAX_POINTLIGHT_MUN = 100;
48
49namespace Spices {
50
51 /**
52 * @brief Renderer Class.
53 * This class defines the basic behaves of renderer.
54 * When we add an new Renderer, we need inherit from this.
55 */
57 {
58 public:
59
60 /******************************Basic Function**************************************************/
61
62 /**
63 * @brief Constructor Function.
64 * Init member variables.
65 * @param[in] rendererName The name of this Renderer.
66 * @param[in] vulkanState The core vulkan objects that in use.
67 * @param[in] DescriptorPool The shared pointer of DescriptorPool, used for allocate descriptor and free descriptor.
68 * @param[in] device The shared pointer of VulkanDevice, used for render pass's formats query.
69 * @param[in] rendererResourcePool The shared pointer of RendererResourcePool, used for registry/access RT.
70 * @param[in] isLoadDefaultMaterial True if need load a default material.
71 */
73 (
74 const std::string& rendererName ,
75 VulkanState& vulkanState ,
76 const std::shared_ptr<VulkanDescriptorPool>& DescriptorPool ,
77 const std::shared_ptr<VulkanDevice>& device ,
78 const std::shared_ptr<RendererResourcePool>& rendererResourcePool ,
79 bool isLoadDefaultMaterial = true
80 );
81
82 /**
83 * @brief Destructor Function.
84 * We destroy pipeline layout and free descriptors that holed by this renderer here.
85 */
86 virtual ~Renderer() = default;
87
88 /**
89 * @brief Copy Constructor Function.
90 * @note This Class not allowed copy behaves.
91 */
92 Renderer(const Renderer&) = delete;
93
94 /**
95 * @brief Copy Assignment Operation.
96 * @note This Class not allowed copy behaves.
97 */
98 Renderer& operator=(const Renderer&) = delete;
99
100 /***************************************************************************************************/
101
102 /******************************The interface do not needs override now******************************/
103
104 /**
105 * @brief This interface is called on render system is registered.
106 * Initialize the specific renderer's pipeline, render pass. framebuffer, descriptor, and so on...
107 * @note Though this is a interface, Usually not making scene in overriding it.
108 */
109 virtual void OnSystemInitialize();
110
111 /***************************************************************************************************/
112
113 /******************************The interface needs override*****************************************/
114
115 /**
116 * @brief The interface is called every frame.
117 * Defines what data needs to be renderer and how to render.
118 * @param[in] ts TimeStep.
119 * @param[in] frameInfo The current frame data.
120 */
121 virtual void Render(TimeStep& ts, FrameInfo& frameInfo) = 0;
122
123 /**
124 * @brief This interface is called on Window resized over (registry by swapchain).
125 * If the specific renderer uses swapchain image attachment during CreateRenderPass(),
126 * this interface needs to override, callOnSlateResize here just will be fine.
127 */
128 virtual void OnWindowResizeOver() {}
129
130 /**
131 * @breif This interface is called on Viewport resize (registry by ImGui Viewport).
132 * If the specific renderer uses the attachment that needs recreated during CreateRenderPass(),
133 * this interface needs to override, call CreateRenderPass() and CreateDescriptorSet() here just will be fine.
134 */
135 virtual void OnSlateResize();
136
137 /**
138 * @breif This interface is called on world mark query tick (registry by MeshComponent).
139 */
140 virtual void OnMeshAddedWorld();
141
142 /**
143 * @brief Registry material to Specific Renderer.
144 * @param[in] materialName Material Name.
145 * @param[in] subPassName SubPass Name.
146 */
147 void RegistryMaterial(
148 const std::string& materialName ,
149 const std::string& subPassName
150 );
151
152 /**
153 * @brief Registry dgc pipeline to Specific Renderer.
154 * @param[in] materialName Material Name.
155 * @param[in] subPassName SubPass Name.
156 * @param[in] indirectPtr VulkanDeviceGeneratedCommandsNV.
157 */
159 const std::string& materialName,
160 const std::string& subPassName ,
162 );
163
164 /**
165 * @brief Fill in World RenderAble data to IndirectBuffer.
166 * @tparam T Specific Component.
167 * @param[in] subPassName .
168 * @param[in] view Component View.
169 * @return Returns new VulkanDeviceGeneratedCommandsNV.
170 */
171 template<typename T>
172 std::shared_ptr<VulkanDeviceGeneratedCommandsNV> FillIndirectRenderData(const std::string& subPassName, std::shared_ptr<std::vector<uint32_t>> view);
173
174 /**
175 * @brief Get entities with component in world.
176 * @tparam T Specific Component.
177 * @param[in] world world pointer .
178 * @return Returns entities.
179 */
180 template<typename T>
182
183 /**
184 * @brief Get RendererPass.
185 * @return Returns the RendererPass.
186 */
187 inline std::shared_ptr<RendererPass>& GetPasses() { return m_Pass; }
188
189 /**
190 * @brief Get default material using sub pass Name.
191 * @param subPassName sub pass Name.
192 * @return default material.
193 */
194 std::shared_ptr<Material> GetDefaultMaterial(const std::string& subPassName) const;
195
196 /**
197 * @brief Iterator the specific RenderPass Statistics in Renderer.
198 * @param[in] func The function pointer that handle Statistics.
199 */
200 template<typename F>
201 inline void IterStatistics(F&& func);
202
203 /**
204 * @brief Reset Renderer State to disActive.
205 */
206 void ResetRendererState() { m_IsActive = false; }
207
208 protected:
209
210 /**
211 * @brief The interface is called during OnSystemInitialize().
212 * Create specific render pass.
213 */
214 virtual void CreateRendererPass() = 0;
215
216 /**
217 * @brief This interface is called during OnSystemInitialize().
218 * Create all sub pass descriptorSet.
219 */
220 virtual void CreateDescriptorSet() = 0;
221
222 /**
223 * @brief This interface is called during OnSystemInitialize().
224 * Create Device Generated Commands Layout.
225 */
227
228 /**
229 * @brief Create Specific Material Pipeline.
230 * @param[in] material Specific Material.
231 * @param[in] layout VkPipelineLayout.
232 * @param[in] subPass RendererSubPass.
233 */
234 virtual void CreatePipeline(
235 std::shared_ptr<Material> material ,
236 VkPipelineLayout& layout ,
237 std::shared_ptr<RendererSubPass> subPass
238 ) = 0;
239
240 /**
241 * @brief Create Specific Renderer Default Material.
242 */
244
245 /**
246 * @brief Create Specific Renderer DGC Material.
247 * @param[in] subPass SubPass Name.
248 * @param[in] indirectPtr VulkanDeviceGeneratedCommandsNV.
249 */
250 void CreateDGCMaterial(const std::string& subPass, VulkanDeviceGeneratedCommandsNV* indirectPtr);
251
252 /**
253 * @brief Create Pipeline Layout with material's descriptorset and renderer's descriptor set.
254 * @param[in] rowSetLayouts All descriptor set collected.
255 * @param[in] subPass material used sub pass.
256 */
260 ) const;
261
262 /**
263 * @brief Create device generated command Pipeline.
264 * @param[in] pipelineName Pipeline's name.
265 * @param[in] materialName Material's name.
266 * @param[in] layout PipelineLayout.
267 * @param[in] subPass RendererSubPass.
268 * @param[in] indirectPtr VulkanDeviceGeneratedCommandsNV.
269 */
271 const std::string& pipelineName ,
272 const std::string& materialName ,
273 VkPipelineLayout& layout ,
274 std::shared_ptr<RendererSubPass> subPass ,
276 ) {}
277
278 /***************************************************************************************************/
279
280 protected:
281
282 /******************************Renderer Help Function**********************************************/
283
284 /**
285 * @brief Submit a group of commands to secondary command buffer, and execute all of them.
286 * @param[in] primaryCmdBuffer The main Command Buffer.
287 * @param[in] subPass subPass index.
288 * @param func Specific Commands.
289 * @return Returns future VkCommandBuffer.
290 */
291 template<typename F>
293
294 /**
295 * @brief Iterator the specific Component in World.
296 * @tparam T The specific Component class.
297 * @param[in] frameInfo The current frame data.
298 * @param[in] func The function pointer that need to execute during this function.
299 */
300 template<typename T, typename F>
301 inline void IterWorldComp(FrameInfo& frameInfo, F func);
302
303 /**
304 * @brief Iterator the specific Component in World With break.
305 * @tparam T The specific Component class.
306 * @param[in] frameInfo The current frame data.
307 * @param[in] func The function pointer that need to execute during this function.
308 */
309 template<typename T, typename F>
310 inline void IterWorldCompWithBreak(FrameInfo& frameInfo, F func);
311
312 /**
313 * @brief Iterator the specific Component in World With range.
314 * @tparam T The specific Component class.
315 * @param[in] frameInfo The current frame data.
316 * @param[in] ranges Entities View ranges.
317 * @param[in] func The function pointer that need to execute during this function.
318 */
319 template<typename T, typename F>
320 inline void IterWorldCompWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, F func);
321
322 /**
323 * @brief Iterator the specific Component in World With range.
324 * @tparam T The specific Component class.
325 * @param[in] frameInfo The current frame data.
326 * @param[in] ranges Entities View ranges.
327 * @param[in] floor ranges floor.
328 * @param[in] ceil ranges ceil.
329 * @param[in] func The function pointer that need to execute during this function.
330 */
331 template<typename T, typename F>
332 inline void IterWorldCompWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, uint32_t floor, uint32_t ceil, F func);
333
334 /**
335 * @brief Iterator the specific Component in World With break With range.
336 * @tparam T The specific Component class.
337 * @param[in] frameInfo The current frame data.
338 * @param[in] ranges Entities View ranges.
339 * @param[in] func The function pointer that need to execute during this function.
340 */
341 template<typename T, typename F>
342 inline void IterWorldCompWithBreakWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, F func);
343
344 /**
345 * @brief Iterator the specific Component in World With break With range.
346 * @tparam T The specific Component class.
347 * @param[in] frameInfo The current frame data.
348 * @param[in] ranges Entities View ranges.
349 * @param[in] floor ranges floor.
350 * @param[in] ceil ranges ceil.
351 * @param[in] func The function pointer that need to execute during this function.
352 */
353 template<typename T, typename F>
354 inline void IterWorldCompWithBreakWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, uint32_t floor, uint32_t ceil, F func);
355
356 /**
357 * @brief Get The activated camera entity's view matrix and projection matrix.
358 * @param[in] frameInfo The current frame data.
359 * @return Returns a tuple of view matrix, projection matrix, stable frames, fov.
360 */
361 std::tuple<glm::mat4, glm::mat4, unsigned int, float> GetActiveCameraMatrix(FrameInfo& frameInfo);
362
363 /**
364 * @brief Get DirectionalLightComponent's render data in World.
365 * @param[in] frameInfo The current frame data.
366 * @param[out] dLightBuffer DirectionalLight.
367 * @todo Multiple directional light.
368 */
369 void GetDirectionalLight(FrameInfo& frameInfo, std::array<SpicesShader::DirectionalLight, SpicesShader::DIRECTIONALLIGHT_BUFFER_MAXNUM>& dLightBuffer);
370
371 void GetDirectionalLightMatrix(FrameInfo& frameInfo, std::array<glm::mat4, MAX_DIRECTIONALLIGHT_NUM>& directionalLight);
372
373 /**
374 * @brief Get PointLightComponent's render data in World.
375 * @param[in] frameInfo The current frame data.
376 * @param[out] pLightBuffer PointLight Buffer.
377 * @todo infinity pointlight.
378 */
379 void GetPointLight(FrameInfo& frameInfo, std::array<SpicesShader::PointLight, SpicesShader::POINTLIGHT_BUFFER_MAXNUM>& pLightBuffer);
380
381 /***************************************************************************************************/
382
383 protected:
384
385 /******************************Help Class for quick build*******************************************/
386
387 /**
388 * @brief This Class is a helper for Building RendererPass.
389 * Only instanced during CreateRendererPass().
390 */
392 {
393 public:
394
395 /**
396 * @brief Constructor Function.
397 * @param[in] rendererPassName The RendererPass Name.
398 * @param[in] renderer The Owner, pass this pointer.
399 */
401 const std::string& rendererPassName ,
402 Renderer* renderer
403 );
404
405 /**
406 * @brief Destructor Function.
407 */
408 virtual ~RendererPassBuilder() = default;
409
410 /**
411 * @brief Add a new SubPass to Renderer Pass.
412 * @param[in] subPassName SunPass Name.
413 * @param[in] flags Statistics Flags.
414 * @return Returns the RendererPassBuilder.
415 */
417 const std::string& subPassName ,
419 );
420
421 /**
422 * @brief Add a swapchain image attachment.
423 * @param[in] func Defines Specific VkAttachmentDescription.
424 * @return Returns the RendererPassBuilder.
425 */
426 template<typename T>
428
429 /**
430 * @brief Add a color attachment.
431 * @param[in] attachmentName Attachment Name.
432 * @param[in] type Attachment TextureType.
433 * @param[in] func Defines Specific VkAttachmentDescription.
434 * @return Returns the RendererPassBuilder.
435 */
436 template<typename T>
438 const std::string& attachmentName ,
439 const TextureType& type ,
440 T func
441 );
442
443 /**
444 * @brief Add a depth attachment.
445 * @param[in] attachmentName Attachment Name.
446 * @param[in] type Attachment TextureType.
447 * @param[in] func Defines Specific VkAttachmentDescription.
448 * @return Returns the RendererPassBuilder.
449 */
450 template<typename T>
452 const std::string& attachmentName ,
453 const TextureType& type ,
454 T func
455 );
456
457 /**
458 * @brief Add a input attachment.
459 * @param[in] attachmentName Attachment Name.
460 * @param[in] type Attachment TextureType.
461 * @param[in] func Defines Specific VkAttachmentDescription.
462 * @return Returns the RendererPassBuilder.
463 */
464 template<typename T>
466 const std::string& attachmentName ,
467 const TextureType& type ,
468 T func
469 );
470
471 /**
472 * @brief Add subPass Self Dependency.
473 * @param[in] srcAccessMask VkAccessFlags.
474 * @param[in] dstAccessMask VkAccessFlags.
475 * @param[in] srcStageMask VkPipelineStageFlags.
476 * @param[in] dstStageMask VkPipelineStageFlags.
477 */
479 VkAccessFlags srcAccessMask ,
480 VkAccessFlags dstAccessMask ,
481 VkPipelineStageFlags srcStageMask ,
482 VkPipelineStageFlags dstStageMask
483 );
484
485 /**
486 * @brief End recording a sub pass.
487 * @return Returns the RendererPassBuilder.
488 */
490
491 /**
492 * @brief Build the RendererPass.
493 */
494 void Build() const;
495
496 private:
497
498 /**
499 * @brief RendererPass Name.
500 */
502
503 /**
504 * @brief Specific Renderer pointer.
505 * Passed while this class instanced.
506 */
508
509 /**
510 * @brief Handled Sub pass.
511 */
513 };
514
515 /**
516 * @brief This Class is a helper for Building Specific Renderer DescriptorSet.
517 * Only instanced during CreateDescriptorSets().
518 */
520 {
521 public:
522
523 /**
524 * @brief Constructor Function.
525 * @param[in] subPassName Sub pass name.
526 * @param[in] renderer When instanced during CreatePipelineLayoutAndDescriptor(), pass this pointer.
527 */
529 const std::string& subPassName ,
530 Renderer* renderer
531 );
532
533 /**
534 * @brief Destructor Function.
535 */
536 virtual ~DescriptorSetBuilder() = default;
537
538 /**
539 * @brief Set VkPushConstantRange by a specific push constant struct.
540 * @param[in] size push constant size.
541 * @return Returns this reference.
542 */
544
545 /**
546 * @brief Create local buffer object in collection, and add it's set binding to descriptorsetlayout, and sets descriptorwriter using it's buffer info.
547 * @param[in] set Which set this buffer wil use.
548 * @param[in] binding Which binding this buffer will use.
549 * @param[in] size ubo size.
550 * @param[in] stageFlags Which buffer stage this buffer will use.
551 * @return Returns this reference.
552 */
554 uint32_t set ,
555 uint32_t binding ,
556 uint64_t size ,
557 VkShaderStageFlags stageFlags
558 );
559
560 /**
561 * @brief Create local buffer object in collection, and add it's set binding to descriptorsetlayout, and sets descriptorwriter using it's buffer info.
562 * @param[in] set Which set this buffer wil use.
563 * @param[in] binding Which binding this buffer will use.
564 * @param[in] size size of ssbo.
565 * @param[in] stageFlags Which buffer stage this buffer will use.
566 * @return Returns this reference.
567 */
569 uint32_t set ,
570 uint32_t binding ,
571 uint64_t size ,
572 VkShaderStageFlags stageFlags
573 );
574
575 /**
576 * @brief Add buffer object in collection, and add it's set binding to descriptorsetlayout, and sets descriptorwriter using it's buffer info.
577 * @param[in] set Which set this buffer wil use.
578 * @param[in] binding Which binding this buffer will use.
579 * @param[in] stageFlags Which buffer stage this buffer will use.
580 * @param[in] buffer SSBO.
581 * @return Returns this reference.
582 */
584 uint32_t set ,
585 uint32_t binding ,
586 VkShaderStageFlags stageFlags ,
587 std::shared_ptr<VulkanBuffer> buffer
588 );
589
590 /**
591 * @brief Init the BindLess texture set binding to descriptor set layout.
592 * @param[in] set Which set this texture wil use.
593 * @param[in] binding Which binding this texture wil use.
594 * @param[in] stageFlags Which buffer stage this buffer will use.
595 * @param[in] textureNames Texture Debug Name.
596 * @return Returns this reference.
597 */
598 template<typename T>
600 uint32_t set ,
601 uint32_t binding ,
602 VkShaderStageFlags stageFlags ,
603 const std::vector<std::string>& textureNames
604 );
605
606 /**
607 * @brief Add the texture set binding to descriptor set layout.
608 * @tparam T Texture Type.
609 * @param[in] set Which set this texture wil use.
610 * @param[in] binding Which binding this texture wil use.
611 * @param[in] stageFlags Texture shader usage flags.
612 * @param[in] textureNames All Texture's Name.
613 * @return Returns this reference.
614 */
615 template<typename T>
617 uint32_t set,
618 uint32_t binding,
619 VkShaderStageFlags stageFlags,
620 const std::vector<std::string>& textureNames
621 );
622
623 /**
624 * @brief Add the storage texture set binding to descriptor set layout.
625 * @param[in] set Which set this texture wil use.
626 * @param[in] binding Which binding this texture wil use.
627 * @param[in] stageFlags Which buffer stage this buffer will use.
628 * @param[in] textureNames All Texture's Name.
629 * @param[in] format Texture Format, used in init.
630 * @param[in] type Texture's type, used in init.
631 * @return Returns this reference.
632 */
634 uint32_t set ,
635 uint32_t binding ,
636 VkShaderStageFlags stageFlags ,
637 const std::vector<std::string>& textureNames ,
638 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM ,
640 );
641
642 /**
643 * @brief Add the storage texture set binding with mipmap to descriptor set layout.
644 * @param[in] set Which set this texture wil use.
645 * @param[in] binding Which binding this texture wil use.
646 * @param[in] stageFlags Which buffer stage this buffer will use.
647 * @param[in] textureName Texture's Name.
648 * @param[in] format Texture Format, used in init.
649 * @param[in] type Texture's type, used in init.
650 * @param[in] func Function of define specific RendererResourceCreateInfo.
651 * @return Returns this reference.
652 */
654 uint32_t set ,
655 uint32_t binding ,
656 VkShaderStageFlags stageFlags ,
657 const std::string& textureName ,
658 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM ,
660 std::function<void(RendererResourceCreateInfo&)> func = nullptr
661 );
662
663 /**
664 * @brief Add the attachment as texture to descriptor set layout.
665 * @param[in] set Which set this texture wil use.
666 * @param[in] binding Which binding this texture wil use.
667 * @param[in] stageFlags Which buffer stage this buffer will use.
668 * @param[in] textureNames All Texture's Name.
669 * @return Returns this reference.
670 */
672 uint32_t set ,
673 uint32_t binding ,
674 VkShaderStageFlags stageFlags ,
675 const std::vector<std::string>& textureNames
676 );
677
678 /**
679 * @brief Add the texture set binding to descriptor set layout.
680 * @param[in] set Which set this texture wil use.
681 * @param[in] binding Which binding this texture wil use.
682 * @param[in] stageFlags Which buffer stage this buffer will use.
683 * @param[in] inputAttachmentNames All Input Texture's Name..
684 * @return Returns this reference.
685 */
687 uint32_t set ,
688 uint32_t binding ,
689 VkShaderStageFlags stageFlags ,
690 const std::vector<std::string>& inputAttachmentNames
691 );
692
693 /**
694 * @brief Add the Acceleration Structure set binding to descriptor set layout.
695 * @param[in] set Which set this Acceleration Structure wil use.
696 * @param[in] binding Which binding this Acceleration Structure wil use.
697 * @param[in] stageFlags Which buffer stage this Acceleration Structure will use.
698 * @return Returns this reference.
699 */
701 uint32_t set ,
702 uint32_t binding ,
703 VkShaderStageFlags stageFlags
704 );
705
706 /**
707 * @brief Create all buffer type descriptor set.
708 * Create pipeline layout.
709 * @param[in] accel AccelerationStructure. Pass it if call AddAccelerationStructure before.
710 * @attention Texture type descriptor set is not created here, but in Material::BuildMaterial().
711 */
712 void Build(const VkAccelerationStructureKHR& accel = VK_NULL_HANDLE);
713
714 public:
715
716 /**
717 * @brief Specific Renderer pointer.
718 * Passed while this class instanced.
719 */
721
722 /**
723 * @brief Handled Sub pass.
724 */
726
727 /**
728 * @brief The Descriptor Set Manager ID descriptorSet belongs to.
729 */
731
732 /**
733 * @brief DescriptorSet Buffer type binging info.
734 * [set] - [binding] - [info]
735 */
737
738 /**
739 * @brief DescriptorSet Image type binging info.
740 * [set] - [binding] - [info]
741 */
743 };
744
745 /**
746 * @brief This Class is a helper for Building Specific Renderer Pipeline.
747 * Only instanced during CreatePipeline().
748 */
750 {
751 public:
752
753 /**
754 * @brief Constructor Function.
755 * @param[in] subPass The RendererSubPass.
756 * @param[in] material Referenced Material.
757 * @param[in] renderer The Owner, pass this pointer.
758 */
760 std::shared_ptr<RendererSubPass> subPass ,
761 std::shared_ptr<Material> material,
762 Renderer* renderer
763 );
764
765 /**
766 * @brief Destructor Function.
767 */
768 virtual ~PipelineBuilder() = default;
769
770 /**
771 * @brief Set PipelineConfigInfo to default value.
772 * @return Returns this reference.
773 */
775
776 /**
777 * @brief Set bindingDescriptions to NULL.
778 * @return Returns this reference.
779 */
781
782 /**
783 * @brief Set attributeDescriptions to NULL.
784 * @return Returns this reference.
785 */
787
788 /**
789 * @brief Set bindingDescriptions.
790 * @param[in] inputs Vector of VkVertexInputBindingDescription.
791 * @return Returns this reference.
792 */
794 const std::vector<VkVertexInputBindingDescription>& inputs
795 );
796
797 /**
798 * @brief Set attributeDescriptions.
799 * @param[in] inputs Vector of VkVertexInputBindingDescription.
800 * @return Returns this reference.
801 */
803 const std::vector<VkVertexInputAttributeDescription>& inputs
804 );
805
806 /**
807 * @brief Set renderPass to correct value..
808 * @return Returns this reference.
809 */
811
812 /**
813 * @brief Set subpass to correct value.
814 * @return Returns this reference.
815 */
817
818 /**
819 * @brief Set pipelineLayout to given value.
820 * @param[in] layout VkPipelineLayout.
821 * @return Returns this reference.
822 */
823 PipelineBuilder& SetPipelineLayout(VkPipelineLayout& layout);
824
825 /**
826 * @brief Set cullMode to given value.
827 * @param[in] cullMode VkCullModeFlags.
828 * @return Returns this reference.
829 */
830 PipelineBuilder& SetCullMode(VkCullModeFlags cullMode);
831
832 /**
833 * @brief Set pAttachments to correct value.
834 * @return Returns this reference.
835 */
837
838 /**
839 * @brief Build Pipeline.
840 */
841 void Build();
842
843 /**
844 * @brief Build Mesh Pipeline.
845 */
846 void BuildMesh();
847
848 /**
849 * @brief Build Compute Pipeline.
850 */
851 void BuildCompute();
852
853 /**
854 * @brief Build Raytracing Pipeline.
855 * @param[in] hitGroups scene hit shader groups.
856 */
857 void BuildRayTracing(const std::unordered_map<std::string, uint32_t>& hitGroups);
858
859 /**
860 * @brief Build Raytracing Pipeline.
861 * @param[in] pipelineName pipeline's name.
862 * @param[in] materialName material's name.
863 * @param[in] indirectPtr VulkanDeviceGeneratedCommandsNV.
864 */
865 void BuildDeviceGeneratedCommand(const std::string& pipelineName, const std::string& materialName, VulkanDeviceGeneratedCommandsNV* indirectPtr);
866
867 private:
868
869 /**
870 * @brief Specific Renderer pointer.
871 * Passed while this class instanced.
872 */
874
875 /**
876 * @brief Referenced Material.
877 */
878 std::shared_ptr<Material> m_Material;
879
880 /**
881 * @brief Handled Sub pass.
882 */
884
885 /**
886 * @brief PipelineConfigInfo for create Pipeline.
887 */
889 };
890
891 /**
892 * @brief This Class is a helper for Building GDC Layout.
893 * Only instanced during CreateDeviceGeneratedCommandsLayout().
894 */
896 {
897 public:
898
899 /**
900 * @brief Constructor Function.
901 * @param[in] subPassName Sub pass name.
902 * @param[in] renderer When instanced during CreatePipelineLayoutAndDescriptor(), pass this pointer.
903 */
905 const std::string& subPassName ,
906 Renderer* renderer
907 );
908
909 /**
910 * @brief Destructor Function.
911 */
912 virtual ~DGCLayoutBuilder() = default;
913
914 /**
915 * @brief Add Binding Shader Group Command to Input.
916 * @return Returns this reference.
917 */
919
920 /**
921 * @brief Add Binding Vertex Buffer to Input.
922 * @return Returns this reference.
923 */
925
926 /**
927 * @brief Add Binding Index Buffer to Input.
928 * @return Returns this reference.
929 */
931
932 /**
933 * @brief Add Binding PushConstant Command to Input.
934 * @return Returns this reference.
935 */
937
938 /**
939 * @brief Add Draw Indexed Command to Input.
940 * @return Returns this reference.
941 */
943
944 /**
945 * @brief Add Draw Mesh Task Command to Input.
946 * @return Returns this reference.
947 */
949
950 /**
951 * @brief Create GDC Layout.
952 */
953 void Build() const;
954
955 private:
956
957 /**
958 * @brief Specific Renderer pointer.
959 * Passed while this class instanced.
960 */
962
963 /**
964 * @brief Specific SubPass Name.
965 * Passed while this class instanced.
966 */
967 std::string m_SubPassName;
968
969 /**
970 * @brief Stores command inputs.
971 */
973
974 /**
975 * @brief Current SubPass DGC Data.
976 */
978 };
979
980 /**
981 * @brief This class helps to bind pipeline and bind buffer.
982 * Only instanced during Render().
983 */
985 {
986 public:
987
988 /**
989 * @brief Constructor Function.
990 * Bind pipeline and all buffer type descriptor set.
991 * @param[in] renderer When instanced during CreatePipelineLayoutAndDescriptor(), pass this pointer.
992 * @param[in] currentFrame Passed from FrameInfo.
993 * @param[in] currentImage Passed from FrameInfo.
994 */
996 Renderer* renderer ,
997 uint32_t currentFrame ,
998 uint32_t currentImage
999 );
1000
1001 /**
1002 * @brief Destructor Function.
1003 */
1004 virtual ~RenderBehaveBuilder() = default;
1005
1006 /**
1007 * @brief Get RenderPass in statistics.
1008 * @reutrn Return RenderPass.
1009 */
1010 virtual std::shared_ptr<RendererSubPass>& GetStatisticsRendererPass();
1011
1012 /**
1013 * @brief Recording all this behaves does.
1014 * @param[in] caption Recording Name
1015 */
1016 void Recording(const std::string& caption) const;
1017
1018 /**
1019 * @brief End recording all this behaveS does.
1020 */
1021 void EndRecording() const;
1022
1023 /**
1024 * @brief Async Commands.
1025 * @param[in] func In Function Pointer.
1026 * @return Returns future VkCommandBuffer.
1027 */
1029
1030 /**
1031 * @brief Await Async Commands.
1032 * @param[in] func In Function Pointer.
1033 */
1034 void Await(std::function<void(const VkCommandBuffer& cmdBuffer)> func) const;
1035
1036 /**
1037 * @brief Wait for merge secondary commandBuffers.
1038 * @param[in] futureCmdBuffer secondary commandBuffer.
1039 */
1040 void Wait(std::future<VkCommandBuffer>& futureCmdBuffer) const;
1041
1042 /**
1043 * @brief Wait for merge secondary commandBuffer.
1044 * @param[in] futureCmdBuffers secondary commandBuffer.
1045 */
1046 void Wait(std::vector<std::future<VkCommandBuffer>>& futureCmdBuffers) const;
1047
1048 /**
1049 * @brief Bind the pipeline created by CreatePipeline().
1050 * Called on RenderBehaveBuilder instanced.
1051 * @param[in] materialName also pipelineName.
1052 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1053 * @param[in] bindPoint VkPipelineBindPoint.
1054 */
1055 virtual void BindPipeline(
1056 const std::string& materialName ,
1057 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE,
1058 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1059 );
1060
1061 /**
1062 * @brief Bind the pipeline created by CreatePipeline().
1063 * Called on RenderBehaveBuilder instanced.
1064 * @param[in] pipeline VkPipeline.
1065 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1066 * @param[in] bindPoint VkPipelineBindPoint.
1067 */
1068 virtual void BindPipeline(
1069 VkPipeline pipeline ,
1070 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE,
1071 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1072 );
1073
1074 /**
1075 * @brief Bind the pipeline created by CreatePipeline() Async.
1076 * Called on RenderBehaveBuilder instanced.
1077 * @param[in] materialName also pipelineName.
1078 * @param[in] bindPoint VkPipelineBindPoint.
1079 */
1080 virtual void BindPipelineAsync(
1081 const std::string& materialName ,
1082 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1083 );
1084
1085 /**
1086 * @brief DynamicState Set Viewport and Scissor.
1087 * @param[in] cmdBuffer VkCommandBuffer
1088 */
1089 void SetViewPort(const VkCommandBuffer& cmdBuffer = VK_NULL_HANDLE) const;
1090
1091 /**
1092 * @brief DynamicState Set Viewport and Scissor Async.
1093 */
1094 void SetViewPortAsync() const;
1095
1096 /**
1097 * @brief Binding DescriptorSet with DescriptorSetInfo.
1098 * For Binding a Renderer DescriptorSet.
1099 * @param[in] infos DescriptorSetInfo.
1100 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1101 * @param[in] bindPoint VkPipelineBindPoint.
1102 */
1103 virtual void BindDescriptorSet(
1104 const DescriptorSetInfo& infos ,
1105 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE,
1106 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1107 );
1108
1109 /**
1110 * @brief Binding DescriptorSet with DescriptorSetInfo and name.
1111 * For Binding a Material DescriptorSet.
1112 * @param[in] infos DescriptorSetInfo.
1113 * @param[in] name The material name.
1114 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1115 * @param[in] bindPoint VkPipelineBindPoint.
1116 */
1117 virtual void BindDescriptorSet(
1118 const DescriptorSetInfo& infos ,
1119 const std::string& name ,
1120 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE ,
1121 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1122 );
1123
1124 /**
1125 * @brief Binding DescriptorSet with DescriptorSetInfo Async.
1126 * For Binding a Renderer DescriptorSet.
1127 * @param[in] infos DescriptorSetInfo.
1128 * @param[in] bindPoint VkPipelineBindPoint.
1129 */
1130 virtual void BindDescriptorSetAsync(
1131 const DescriptorSetInfo& infos ,
1132 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1133 );
1134
1135 /**
1136 * @brief Binding DescriptorSet with DescriptorSetInfo and name Async.
1137 * For Binding a Material DescriptorSet.
1138 * @param[in] infos DescriptorSetInfo.
1139 * @param[in] name The material name.
1140 * @param[in] bindPoint VkPipelineBindPoint.
1141 */
1142 virtual void BindDescriptorSetAsync(
1143 const DescriptorSetInfo& infos ,
1144 const std::string& name ,
1145 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS
1146 );
1147
1148 /**
1149 * @brief Run DGC Buffer.
1150 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1151 */
1152 void RunDGC(VkCommandBuffer cmdBuffer = VK_NULL_HANDLE) const;
1153
1154 /**
1155 * @brief Run DGC Buffer Async.
1156 */
1157 void RunDGCAsync() const;
1158
1159 /**
1160 * @brief Preprocess Device Generated CommandsBuffer.
1161 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1162 */
1163 void PreprocessDGC_NV(VkCommandBuffer cmdBuffer = VK_NULL_HANDLE) const;
1164
1165 /**
1166 * @brief Preprocess Device Generated CommandsBuffer Async.
1167 */
1168 void PreprocessDGCAsync_NV() const;
1169
1170 /**
1171 * @brief Execute Device Generated CommandsBuffer.
1172 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1173 */
1174 void ExecuteDGC_NV(const VkCommandBuffer& cmdBuffer = VK_NULL_HANDLE) const;
1175
1176 /**
1177 * @brief Execute Device Generated CommandsBuffer Async.
1178 */
1179 void ExecuteDGCAsync_NV() const;
1180
1181 /**
1182 * @brief Draw a Triangle full screen.
1183 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1184 */
1185 void DrawFullScreenTriangle(const VkCommandBuffer& cmdBuffer = VK_NULL_HANDLE) const;
1186
1187 /**
1188 * @brief Draw a Triangle full screen Async.
1189 */
1190 void DrawFullScreenTriangleAsync() const;
1191
1192 /******************************Update By Value**********************************************************/
1193
1194 /**
1195 * @brief Update local push constant buffer.
1196 * @tparam T Specific push constant struct Type.
1197 * @param[in] func A function pointer, which defines what data inside the buffer.
1198 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1199 */
1200 template<typename T, typename F>
1201 void UpdatePushConstant(F func, VkCommandBuffer cmdBuffer = VK_NULL_HANDLE);
1202
1203 /**
1204 * @brief Update local push constant buffer Async.
1205 * @tparam T Specific push constant struct Type.
1206 * @param[in] func A function pointer, which defines what data inside the buffer.
1207 */
1208 template<typename T, typename F>
1209 void UpdatePushConstantAsync(F func);
1210
1211 /**
1212 * @brief Update a local buffer.
1213 * @tparam T Specific buffer struct Type.
1214 * @param[in] func A function pointer, which defines what data inside the buffer.
1215 * @param[in] set Which set the descriptor will use.
1216 * @param[in] binding Which binding the descriptor will use.
1217 */
1218 template<typename T, typename F>
1219 void UpdateUniformBuffer(uint32_t set, uint32_t binding, F func);
1220
1221 /**
1222 * @brief Update a local buffer.
1223 * @tparam T Specific buffer struct Type.
1224 * @param[in] func A function pointer, which defines what data inside the buffer.
1225 * @param[in] set Which set the descriptor will use.
1226 * @param[in] binding Which binding the descriptor will use.
1227 */
1228 template<typename T, typename F>
1229 void UpdateStorageBuffer(uint32_t set, uint32_t binding, F func);
1230
1231 /*******************************************************************************************************/
1232
1233 /**
1234 * @brief Update local push constant buffer.
1235 * @tparam T Specific push constant struct Type.
1236 * @param[in] data push constant data pointer.
1237 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1238 */
1239 template<typename T>
1240 void UpdatePushConstant(void* data, VkCommandBuffer cmdBuffer = VK_NULL_HANDLE) const;
1241
1242 /**
1243 * @brief Update local push constant buffer Async.
1244 * @tparam T Specific push constant struct Type.
1245 * @param[in] data push constant data pointer.
1246 */
1247 template<typename T>
1248 void UpdatePushConstantAsync(void* data) const;
1249
1250 /**
1251 * @brief Update a local buffer.
1252 * @param[in] set Which set the descriptor will use.
1253 * @param[in] binding Which binding the descriptor will use.
1254 * @param[in] data ubo data pointer.
1255 */
1256 void UpdateUniformBuffer(uint32_t set, uint32_t binding, void* data) const;
1257
1258 /**
1259 * @brief Update a local buffer.
1260 * @param[in] set Which set the descriptor will use.
1261 * @param[in] binding Which binding the descriptor will use.
1262 * @param[in] data ssbo data pointer.
1263 * @param[in] size data size.
1264 * @param[in] offset data size.
1265 */
1267 uint32_t set ,
1268 uint32_t binding ,
1269 void* data ,
1270 uint64_t size = VK_WHOLE_SIZE ,
1271 uint64_t offset = 0
1272 ) const;
1273
1274 /**
1275 * @brief Update a local buffer.
1276 * @param[in] set Which set the descriptor will use.
1277 * @param[in] binding Which binding the descriptor will use.
1278 * @param[in] buffer Specific VulkanBuffer.
1279 */
1281 uint32_t set ,
1282 uint32_t binding ,
1283 std::shared_ptr<VulkanBuffer> buffer
1284 ) const;
1285
1286 /**
1287 * @brief Update AccelerationStructure in descriptorSet.
1288 * @param[in] set descriptorSet index.
1289 * @param[in] binding descriptorSet binding.
1290 * @param[in] accel VkAccelerationStructureKHR.
1291 */
1293 uint32_t set ,
1294 uint32_t binding ,
1295 const VkAccelerationStructureKHR& accel
1296 ) const;
1297
1298 /**
1299 * @brief End a preview sub pass and stat next sub pass.
1300 * @param[in] subPassName The name of next sub pass.
1301 */
1302 virtual void BeginNextSubPass(const std::string& subPassName);
1303
1304 /**
1305 * @brief End a preview sub pass and stat next sub pass.
1306 * @param[in] subPassName The name of next sub pass.
1307 */
1308 void BeginNextSubPassAsync(const std::string& subPassName);
1309
1310 /**
1311 * @brief Begin this Renderer's RenderPass.
1312 */
1313 virtual void BeginRenderPass();
1314
1315 /**
1316 * @brief Begin this Renderer's RenderPass Async.
1317 */
1318 void BeginRenderPassAsync();
1319
1320 /**
1321 * @brief End this Renderer's RenderPass.
1322 */
1323 virtual void EndRenderPass();
1324
1325 /****************************************************************************/
1326
1327 /**
1328 * @brief Add a Image Barrier from compute queue to this graphic queue.
1329 * @param[in] image VulkanImage.
1330 * @param[in] srcAccessMask VkAccessFlags.
1331 * @param[in] dstAccessMask VkAccessFlags.
1332 * @param[in] srcStageMask VkPipelineStageFlags.
1333 * @param[in] dstStageMask VkPipelineStageFlags.
1334 * @param[in] srcQueueFamilyIndex source queue family.
1335 * @param[in] dstQueueFamilyIndex dest queue family.
1336 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1337 */
1338 virtual void AddBarriers(
1339 VulkanImage* image ,
1340 VkAccessFlags srcAccessMask ,
1341 VkAccessFlags dstAccessMask ,
1342 VkPipelineStageFlags srcStageMask ,
1343 VkPipelineStageFlags dstStageMask ,
1344 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1345 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1346 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1347 );
1348
1349 /**
1350 * @brief Add a Image Barrier from this graphic queue to compute queue.
1351 * @param[in] image VulkanImage.
1352 * @param[in] srcAccessMask VkAccessFlags.
1353 * @param[in] dstAccessMask VkAccessFlags.
1354 * @param[in] srcStageMask VkPipelineStageFlags.
1355 * @param[in] dstStageMask VkPipelineStageFlags.
1356 * @param[in] srcQueueFamilyIndex source queue family.
1357 * @param[in] dstQueueFamilyIndex dest queue family.
1358 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1359 */
1360 virtual void ReleaseBarriers(
1361 VulkanImage* image ,
1362 VkAccessFlags srcAccessMask ,
1363 VkAccessFlags dstAccessMask ,
1364 VkPipelineStageFlags srcStageMask ,
1365 VkPipelineStageFlags dstStageMask ,
1366 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1367 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1368 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1369 );
1370
1371 /**
1372 * @brief Add a Image Barrier from this queue to this queue.
1373 * @param[in] image VulkanImage.
1374 * @param[in] srcAccessMask VkAccessFlags.
1375 * @param[in] dstAccessMask VkAccessFlags.
1376 * @param[in] srcStageMask VkPipelineStageFlags.
1377 * @param[in] dstStageMask VkPipelineStageFlags.
1378 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1379 */
1380 virtual void InternalBarriers(
1381 VulkanImage* image ,
1382 VkAccessFlags srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT ,
1383 VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT ,
1384 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT ,
1385 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ,
1386 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1387 );
1388
1389 /****************************************************************************/
1390
1391 /**
1392 * @brief Add a Buffer Barrier from compute queue to this graphic queue.
1393 * @param[in] buffer VulkanImage.
1394 * @param[in] srcAccessMask VkAccessFlags.
1395 * @param[in] dstAccessMask VkAccessFlags.
1396 * @param[in] srcStageMask VkPipelineStageFlags.
1397 * @param[in] dstStageMask VkPipelineStageFlags.
1398 * @param[in] srcQueueFamilyIndex source queue family.
1399 * @param[in] dstQueueFamilyIndex dest queue family.
1400 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1401 */
1402 virtual void AddBarriers(
1403 VkBuffer buffer ,
1404 VkAccessFlags srcAccessMask ,
1405 VkAccessFlags dstAccessMask ,
1406 VkPipelineStageFlags srcStageMask ,
1407 VkPipelineStageFlags dstStageMask ,
1408 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1409 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1410 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1411 );
1412
1413 /**
1414 * @brief Add a Buffer Barrier from this graphic queue to compute queue.
1415 * @param[in] buffer VulkanImage.
1416 * @param[in] srcAccessMask VkAccessFlags.
1417 * @param[in] dstAccessMask VkAccessFlags.
1418 * @param[in] srcStageMask VkPipelineStageFlags.
1419 * @param[in] dstStageMask VkPipelineStageFlags.
1420 * @param[in] srcQueueFamilyIndex source queue family.
1421 * @param[in] dstQueueFamilyIndex dest queue family.
1422 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1423 */
1424 virtual void ReleaseBarriers(
1425 VkBuffer buffer ,
1426 VkAccessFlags srcAccessMask ,
1427 VkAccessFlags dstAccessMask ,
1428 VkPipelineStageFlags srcStageMask ,
1429 VkPipelineStageFlags dstStageMask ,
1430 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1431 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1432 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1433 );
1434
1435 /**
1436 * @brief Add a Buffer Barrier from this queue to this queue.
1437 * @param[in] buffer VulkanImage.
1438 * @param[in] srcAccessMask VkAccessFlags.
1439 * @param[in] dstAccessMask VkAccessFlags.
1440 * @param[in] srcStageMask VkPipelineStageFlags.
1441 * @param[in] dstStageMask VkPipelineStageFlags.
1442 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1443 */
1444 virtual void InternalBarriers(
1445 VkBuffer buffer ,
1446 VkAccessFlags srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT ,
1447 VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT ,
1448 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT ,
1449 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ,
1450 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1451 );
1452
1453 /**
1454 * @brief Add a Memory Barrier from this queue to this queue.
1455 * @param[in] srcAccessMask VkAccessFlags.
1456 * @param[in] dstAccessMask VkAccessFlags.
1457 * @param[in] srcStageMask VkPipelineStageFlags.
1458 * @param[in] dstStageMask VkPipelineStageFlags.
1459 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1460 */
1461 virtual void InternalBarriers(
1462 VkAccessFlags srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT ,
1463 VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT ,
1464 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT ,
1465 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT ,
1466 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1467 );
1468
1469 /**
1470 * @brief Add a memory Barrier.
1471 * @param[in] srcAccessMask VkAccessFlags.
1472 * @param[in] dstAccessMask VkAccessFlags.
1473 * @param[in] srcStageMask VkPipelineStageFlags.
1474 * @param[in] dstStageMask VkPipelineStageFlags.
1475 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1476 */
1478 VkAccessFlags srcAccessMask ,
1479 VkAccessFlags dstAccessMask ,
1480 VkPipelineStageFlags srcStageMask ,
1481 VkPipelineStageFlags dstStageMask ,
1482 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1483 ) const;
1484
1485 /**
1486 * @brief Add a memory Barrier.
1487 * @param[in] srcAccessMask VkAccessFlags.
1488 * @param[in] dstAccessMask VkAccessFlags.
1489 * @param[in] srcStageMask VkPipelineStageFlags.
1490 * @param[in] dstStageMask VkPipelineStageFlags.
1491 */
1493 VkAccessFlags srcAccessMask ,
1494 VkAccessFlags dstAccessMask ,
1495 VkPipelineStageFlags srcStageMask ,
1496 VkPipelineStageFlags dstStageMask
1497 ) const;
1498
1499 /****************************************************************************/
1500
1501 public:
1502
1503 /**
1504 * @brief Get current subPass index in renderPass.
1505 * @return Returns index of subPass.
1506 */
1507 uint32_t GetSubPassIndex() const { return m_SubPassIndex; }
1508
1509 public:
1510
1511 /**
1512 * @brief Specific Renderer pointer.
1513 * Passed while this class instanced.
1514 */
1516
1517 /**
1518 * @brief Current frame index.
1519 * Passed while this class instanced.
1520 * @see FrameInfo.
1521 */
1523
1524 /**
1525 * @brief Current frame index.
1526 * Passed while this class instanced.
1527 * @see FrameInfo.
1528 */
1530
1531 /**
1532 * @brief Current subPass Index.
1533 */
1534 uint32_t m_SubPassIndex = 0;
1535
1536 /**
1537 * @brief Current CommandBuffer.
1538 */
1540
1541 /**
1542 * @brief Handled Sub pass.
1543 */
1545
1546 /**
1547 * @brief Current subPass DGCData.
1548 */
1550 };
1551
1552 /**
1553 * @brief This class helps to bind pipeline and bind buffer.
1554 * Specific for RayTracing Renderer.
1555 * Only instanced during Render().
1556 */
1558 {
1559 public:
1560
1561 /**
1562 * @brief Constructor Function.
1563 * Bind pipeline and all buffer type descriptor set.
1564 * @param[in] renderer When instanced during CreatePipelineLayoutAndDescriptor(), pass this pointer.
1565 * @param[in] rayTracing VulkanRayTracing.
1566 * @param[in] currentFrame Passed from FrameInfo.
1567 * @param[in] currentImage Passed from FrameInfo.
1568 */
1570 Renderer* renderer ,
1571 VulkanRayTracing* rayTracing ,
1572 uint32_t currentFrame ,
1573 uint32_t currentImage
1574 );
1575
1576 /**
1577 * @brief Destructor Function.
1578 */
1579 virtual ~RayTracingRenderBehaveBuilder() override = default;
1580
1581 /**
1582 * @brief Get RenderPass in statistics.
1583 * @reutrn Return RenderPass.
1584 */
1585 virtual std::shared_ptr<RendererSubPass>& GetStatisticsRendererPass() override;
1586
1587 /**
1588 * @brief Begin this Renderer's RenderPass.
1589 */
1590 virtual void BeginRenderPass() override;
1591
1592 /**
1593 * @brief End this Renderer's RenderPass.
1594 */
1595 virtual void EndRenderPass() override;
1596
1597 /**
1598 * @brief End a preview sub pass and stat next sub pass.
1599 * @param[in] subPassName The name of next sub pass.
1600 */
1601 virtual void BeginNextSubPass(const std::string& subPassName) override;
1602
1603 /**
1604 * @brief Bind the pipeline created by CreatePipeline().
1605 * Called on RenderBehaveBuilder instanced.
1606 * @param[in] materialName also pipelineName.
1607 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1608 * @param[in] bindPoint VkPipelineBindPoint.
1609 */
1610 virtual void BindPipeline(
1611 const std::string& materialName ,
1612 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE,
1613 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1614 ) override;
1615
1616 /**
1617 * @brief Bind the pipeline created by CreatePipeline().
1618 * Called on RenderBehaveBuilder instanced.
1619 * @param[in] pipeline VkPipeline.
1620 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1621 * @param[in] bindPoint VkPipelineBindPoint.
1622 */
1623 virtual void BindPipeline(
1624 VkPipeline pipeline ,
1625 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE,
1626 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1627 ) override;
1628
1629 /**
1630 * @brief Bind the pipeline created by CreatePipeline() Async.
1631 * Called on RenderBehaveBuilder instanced.
1632 * @param[in] materialName also pipelineName.
1633 * @param[in] bindPoint VkPipelineBindPoint.
1634 */
1635 virtual void BindPipelineAsync(
1636 const std::string& materialName ,
1637 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1638 ) override;
1639
1640 /**
1641 * @brief Binding DescriptorSet with DescriptorSetInfo.
1642 * For Binding a Renderer DescriptorSet.
1643 * @param[in] infos DescriptorSetInfo.
1644 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1645 * @param[in] bindPoint VkPipelineBindPoint.
1646 */
1647 virtual void BindDescriptorSet(
1648 const DescriptorSetInfo& infos ,
1649 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE ,
1650 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1651 ) override;
1652
1653 /**
1654 * @brief Binding DescriptorSet with DescriptorSetInfo Async.
1655 * For Binding a Renderer DescriptorSet.
1656 * @param[in] infos DescriptorSetInfo.
1657 * @param[in] bindPoint VkPipelineBindPoint.
1658 */
1659 virtual void BindDescriptorSetAsync(
1660 const DescriptorSetInfo& infos,
1661 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1662 ) override;
1663
1664 /**
1665 * @brief Binding DescriptorSet with DescriptorSetInfo and name.
1666 * For Binding a Material DescriptorSet.
1667 * @param[in] infos DescriptorSetInfo.
1668 * @param[in] name The material name.
1669 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1670 * @param[in] bindPoint VkPipelineBindPoint.
1671 */
1672 virtual void BindDescriptorSet(
1673 const DescriptorSetInfo& infos ,
1674 const std::string& name ,
1675 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE ,
1676 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1677 ) override;
1678
1679 /**
1680 * @brief Binding DescriptorSet with DescriptorSetInfo and name Async.
1681 * For Binding a Material DescriptorSet.
1682 * @param[in] infos DescriptorSetInfo.
1683 * @param[in] name The material name.
1684 * @param[in] bindPoint VkPipelineBindPoint.
1685 */
1686 virtual void BindDescriptorSetAsync(
1687 const DescriptorSetInfo& infos ,
1688 const std::string& name ,
1689 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
1690 ) override;
1691
1692 /**
1693 * @brief Call vkCmdTraceRaysKHR here.
1694 */
1695 void TraceRays() const;
1696
1697 /**
1698 * @brief Call vkCmdTraceRaysKHR here.
1699 * @param[in] rgenRegion RayGen Shader Group.
1700 * @param[in] missRegion Miss Shader Group.
1701 * @param[in] hitRegion Hit Shader Group.
1702 * @param[in] callRegion Callable Shader Group.
1703 */
1704 void TraceRays(
1705 const VkStridedDeviceAddressRegionKHR* rgenRegion,
1706 const VkStridedDeviceAddressRegionKHR* missRegion,
1707 const VkStridedDeviceAddressRegionKHR* hitRegion,
1708 const VkStridedDeviceAddressRegionKHR* callRegion
1709 ) const;
1710
1711 /**
1712 * @brief Call vkCmdTraceRaysKHR here Async.
1713 * @param[in] rgenRegion RayGen Shader Group.
1714 * @param[in] missRegion Miss Shader Group.
1715 * @param[in] hitRegion Hit Shader Group.
1716 * @param[in] callRegion Callable Shader Group.
1717 */
1718 void TraceRaysAsync(
1719 const VkStridedDeviceAddressRegionKHR* rgenRegion,
1720 const VkStridedDeviceAddressRegionKHR* missRegion,
1721 const VkStridedDeviceAddressRegionKHR* hitRegion,
1722 const VkStridedDeviceAddressRegionKHR* callRegion
1723 ) const;
1724
1725 private:
1726
1727 /**
1728 * @brief Referenced VulkanRayTracing.
1729 */
1731 };
1732
1733 /**
1734 * @brief This class helps to bind pipeline and bind buffer.
1735 * Specific for pure Compute Renderer.
1736 * Only instanced during Render().
1737 */
1739 {
1740 public:
1741
1742 /**
1743 * @brief Constructor Function.
1744 * Bind pipeline and all buffer type descriptor set.
1745 * @param[in] renderer When instanced during CreatePipelineLayoutAndDescriptor(), pass this pointer.
1746 * @param[in] currentFrame Passed from FrameInfo.
1747 * @param[in] currentImage Passed from FrameInfo.
1748 * @param[in] cmdBuffers Buffers that collect commands.
1749 */
1751 Renderer* renderer ,
1752 uint32_t currentFrame ,
1753 uint32_t currentImage ,
1754 const std::array<VkCommandBuffer, MaxFrameInFlight>& cmdBuffers
1755 );
1756
1757 /**
1758 * @brief Destructor Function.
1759 */
1760 virtual ~ComputeRenderBehaveBuilder() override = default;
1761
1762 /**
1763 * @brief Get RenderPass in statistics.
1764 * @reutrn Return RenderPass.
1765 */
1766 virtual std::shared_ptr<RendererSubPass>& GetStatisticsRendererPass() override;
1767
1768 /**
1769 * @brief Begin this Renderer's RenderPass.
1770 */
1771 virtual void BeginRenderPass() override;
1772
1773 /**
1774 * @brief End this Renderer's RenderPass.
1775 */
1776 virtual void EndRenderPass() override;
1777
1778 /**
1779 * @brief End a preview sub pass and stat next sub pass.
1780 * @param[in] subPassName The name of next sub pass.
1781 */
1782 virtual void BeginNextSubPass(const std::string& subPassName) override;
1783
1784 /**
1785 * @brief Bind the pipeline created by CreatePipeline().
1786 * Called on RenderBehaveBuilder instanced.
1787 * @param[in] materialName also pipelineName.
1788 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1789 * @param[in] bindPoint VkPipelineBindPoint.
1790 */
1791 virtual void BindPipeline(
1792 const std::string& materialName ,
1793 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE ,
1794 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_COMPUTE
1795 ) override;
1796
1797 /**
1798 * @brief Binding DescriptorSet with DescriptorSetInfo.
1799 * For Binding a Renderer DescriptorSet.
1800 * @param[in] infos DescriptorSetInfo.
1801 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1802 * @param[in] bindPoint VkPipelineBindPoint.
1803 */
1804 virtual void BindDescriptorSet(
1805 const DescriptorSetInfo& infos ,
1806 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE ,
1807 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_COMPUTE
1808 ) override;
1809
1810 /**
1811 * @brief Binding DescriptorSet with DescriptorSetInfo and name.
1812 * For Binding a Material DescriptorSet.
1813 * @param[in] infos DescriptorSetInfo.
1814 * @param[in] name The material name.
1815 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1816 * @param[in] bindPoint VkPipelineBindPoint.
1817 */
1818 virtual void BindDescriptorSet(
1819 const DescriptorSetInfo& infos ,
1820 const std::string& name ,
1821 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE ,
1822 VkPipelineBindPoint bindPoint = VK_PIPELINE_BIND_POINT_COMPUTE
1823 ) override;
1824
1825 /**
1826 * @brief Dispatch Compute Shader.
1827 * @param[in] x X group.
1828 * @param[in] y Y group.
1829 * @param[in] z Z group.
1830 */
1831 void Dispatch(uint32_t x, uint32_t y, uint32_t z) const;
1832
1833 /****************************************************************************/
1834
1835 /**
1836 * @brief Add a Image Barrier from graphic queue to this compute queue.
1837 * @param[in] image VulkanImage.
1838 * @param[in] srcAccessMask VkAccessFlags.
1839 * @param[in] dstAccessMask VkAccessFlags.
1840 * @param[in] srcStageMask VkPipelineStageFlags.
1841 * @param[in] dstStageMask VkPipelineStageFlags.
1842 * @param[in] srcQueueFamilyIndex source queue family.
1843 * @param[in] dstQueueFamilyIndex dest queue family.
1844 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1845 */
1846 virtual void AddBarriers(
1847 VulkanImage* image ,
1848 VkAccessFlags srcAccessMask ,
1849 VkAccessFlags dstAccessMask ,
1850 VkPipelineStageFlags srcStageMask ,
1851 VkPipelineStageFlags dstStageMask ,
1852 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1853 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1854 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1855 ) override;
1856
1857 /**
1858 * @brief Add a Image Barrier from this compute queue to graphic queue.
1859 * @param[in] image VulkanImage.
1860 * @param[in] srcAccessMask VkAccessFlags.
1861 * @param[in] dstAccessMask VkAccessFlags.
1862 * @param[in] srcStageMask VkPipelineStageFlags.
1863 * @param[in] dstStageMask VkPipelineStageFlags.
1864 * @param[in] srcQueueFamilyIndex source queue family.
1865 * @param[in] dstQueueFamilyIndex dest queue family.
1866 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1867 */
1868 virtual void ReleaseBarriers(
1869 VulkanImage* image ,
1870 VkAccessFlags srcAccessMask ,
1871 VkAccessFlags dstAccessMask ,
1872 VkPipelineStageFlags srcStageMask ,
1873 VkPipelineStageFlags dstStageMask ,
1874 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1875 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1876 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1877 ) override;
1878
1879 /**
1880 * @brief Add a Image Barrier from this queue to this queue.
1881 * @param[in] image VulkanImage.
1882 * @param[in] srcAccessMask VkAccessFlags.
1883 * @param[in] dstAccessMask VkAccessFlags.
1884 * @param[in] srcStageMask VkPipelineStageFlags.
1885 * @param[in] dstStageMask VkPipelineStageFlags.
1886 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1887 */
1888 virtual void InternalBarriers(
1889 VulkanImage* image ,
1890 VkAccessFlags srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT ,
1891 VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT ,
1892 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ,
1893 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ,
1894 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1895 ) override;
1896
1897 /****************************************************************************/
1898
1899 /**
1900 * @brief Add a Buffer Barrier from graphic queue to this compute queue.
1901 * @param[in] buffer VulkanImage.
1902 * @param[in] srcAccessMask VkAccessFlags.
1903 * @param[in] dstAccessMask VkAccessFlags.
1904 * @param[in] srcStageMask VkPipelineStageFlags.
1905 * @param[in] dstStageMask VkPipelineStageFlags.
1906 * @param[in] srcQueueFamilyIndex source queue family.
1907 * @param[in] dstQueueFamilyIndex dest queue family.
1908 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1909 */
1910 virtual void AddBarriers(
1911 VkBuffer buffer ,
1912 VkAccessFlags srcAccessMask ,
1913 VkAccessFlags dstAccessMask ,
1914 VkPipelineStageFlags srcStageMask ,
1915 VkPipelineStageFlags dstStageMask ,
1916 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1917 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1918 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1919 ) override;
1920
1921 /**
1922 * @brief Add a Buffer Barrier from this compute queue to graphic queue.
1923 * @param[in] buffer VulkanImage.
1924 * @param[in] srcAccessMask VkAccessFlags.
1925 * @param[in] dstAccessMask VkAccessFlags.
1926 * @param[in] srcStageMask VkPipelineStageFlags.
1927 * @param[in] dstStageMask VkPipelineStageFlags.
1928 * @param[in] srcQueueFamilyIndex source queue family.
1929 * @param[in] dstQueueFamilyIndex dest queue family.
1930 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1931 */
1932 virtual void ReleaseBarriers(
1933 VkBuffer buffer ,
1934 VkAccessFlags srcAccessMask ,
1935 VkAccessFlags dstAccessMask ,
1936 VkPipelineStageFlags srcStageMask ,
1937 VkPipelineStageFlags dstStageMask ,
1938 uint32_t srcQueueFamilyIndex = VulkanRenderBackend::GetState().m_ComputeQueueFamily,
1939 uint32_t dstQueueFamilyIndex = VulkanRenderBackend::GetState().m_GraphicQueueFamily,
1940 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1941 ) override;
1942
1943 /**
1944 * @brief Add a Buffer Barrier from this queue to this queue.
1945 * @param[in] buffer VulkanImage.
1946 * @param[in] srcAccessMask VkAccessFlags.
1947 * @param[in] dstAccessMask VkAccessFlags.
1948 * @param[in] srcStageMask VkPipelineStageFlags.
1949 * @param[in] dstStageMask VkPipelineStageFlags.
1950 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1951 */
1952 virtual void InternalBarriers(
1953 VkBuffer buffer ,
1954 VkAccessFlags srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT ,
1955 VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT ,
1956 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ,
1957 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ,
1958 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1959 ) override;
1960
1961 /**
1962 * @brief Add a Memory Barrier from this queue to this queue.
1963 * @param[in] srcAccessMask VkAccessFlags.
1964 * @param[in] dstAccessMask VkAccessFlags.
1965 * @param[in] srcStageMask VkPipelineStageFlags.
1966 * @param[in] dstStageMask VkPipelineStageFlags.
1967 * @param[in] cmdBuffer Input a VkCommandBuffer if needs, otherwise use self variable.
1968 */
1969 virtual void InternalBarriers(
1970 VkAccessFlags srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT ,
1971 VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT ,
1972 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ,
1973 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT ,
1974 VkCommandBuffer cmdBuffer = VK_NULL_HANDLE
1975 ) override;
1976
1977 /****************************************************************************/
1978 };
1979
1980 public:
1981
1982 /**
1983 * @brief Statistics StateList.
1984 */
1986
1987 protected:
1988
1989 /**
1990 * @brief This variable is passed while renderer instanced.
1991 */
1993
1994 /**
1995 * @brief This variable is passed while renderer instanced.
1996 */
1998
1999 /**
2000 * @brief VulkanDevice , Passed by instanced.
2001 */
2002 std::shared_ptr<VulkanDevice> m_Device;
2003
2004 /**
2005 * @brief RendererResourcePool, Passed by instanced.
2006 */
2008
2009 /**
2010 * @brief RendererPass.
2011 */
2012 std::shared_ptr<RendererPass> m_Pass;
2013
2014 /**
2015 * @brief Specific renderer name, Passed by instanced.
2016 */
2017 std::string m_RendererName;
2018
2019 /**
2020 * @brief Renderer stored material pipelines.
2021 */
2022 scl::thread_unordered_map<std::string, std::shared_ptr<VulkanPipeline>> m_Pipelines;
2023
2024 /**
2025 * @brief Combination of DescriptorSet.
2026 */
2028
2029 /**
2030 * @brief Whether should load a default renderer material.
2031 */
2033
2034 /**
2035 * @brief Whether this renderer is active(submit commands in RendererBehaveBuilder).
2036 */
2038
2039 /**
2040 * @brief Data of dgc DGC Draw.
2041 */
2043
2044 /**
2045 * @brief RendererCache.
2046 */
2048
2049 /**
2050 * @brief Allow this class access all data.
2051 */
2054 friend class DGCLayoutBuilder;
2055 };
2056
2057 template<typename T>
2058 inline std::shared_ptr<VulkanDeviceGeneratedCommandsNV> Renderer::FillIndirectRenderData(const std::string& subPassName, std::shared_ptr<std::vector<uint32_t>> view)
2059 {
2061
2062 auto indirectPtr = std::make_shared<VulkanDeviceGeneratedCommandsNV>(m_VulkanState);
2063 auto srcPtr = m_DGCData[subPassName];
2064
2065 /**
2066 * @brief Cache original data.
2067 */
2068 indirectPtr->SetInputStride(srcPtr->GetInputStrides());
2069 indirectPtr->SetStrides(srcPtr->GetStrides());
2070 indirectPtr->SetCommandLayout(srcPtr->GetCommandLayout());
2071 indirectPtr->SetLayoutTokens(srcPtr->GetLayoutTokens());
2072
2073 /**
2074 * @brief Move original to caches.
2075 */
2076 m_RenderCache->PushToCaches(srcPtr);
2077
2078 /**
2079 * @brief Prepare ShaderGroup
2080 */
2081 uint32_t nSequences = 0;
2082 {
2083 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Prepare ShaderGroup");
2084
2085 std::unordered_map<std::string, uint32_t> pipelineMap;
2086
2087 FrameInfo::Get().m_World->ViewComponent<T>(*view, [&](const auto& e, auto& meshComp){
2088
2089 meshComp.GetMesh()->GetPacks().for_each([&](const auto& k, const std::shared_ptr<MeshPack>& v) {
2090
2091 if (pipelineMap.find(v->GetMaterial()->GetName()) == pipelineMap.end())
2092 {
2093 pipelineMap[v->GetMaterial()->GetName()] = pipelineMap.size();
2094 }
2095
2096 v->SetShaderGroupHandle(pipelineMap[v->GetMaterial()->GetName()]);
2097 nSequences++;
2098
2099 return false;
2100 });
2101 });
2102 indirectPtr->SetSequenceCount(nSequences);
2103
2104 indirectPtr->GetPipelineRef().resize(pipelineMap.size(), nullptr);
2105
2106 for (auto& pair : pipelineMap)
2107 {
2108 indirectPtr->GetPipelineRef()[pair.second] = m_Pipelines.Find(pair.first)->GetPipeline();
2109 }
2110 }
2111
2112 /**
2113 * @brief Fill in Input Buffer
2114 */
2115 std::vector<size_t> offset;
2116 std::shared_ptr<VulkanBuffer> inputBuffer = nullptr;
2117 {
2118 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Fill in Input Buffer");
2119
2120 size_t totalSize = 0;
2121 size_t alignSeqIndexMask = m_Device->GetDGCProperties().minSequencesIndexBufferOffsetAlignment - 1;
2122 size_t alignMask = m_Device->GetDGCProperties().minIndirectCommandsBufferOffsetAlignment - 1;
2123
2124 auto& inputStrides = indirectPtr->GetInputStrides();
2125
2126 for (int i = 0; i < inputStrides.size(); i++)
2127 {
2128 offset.push_back(totalSize);
2129 totalSize += ((inputStrides[i] * nSequences + alignMask) & (~alignMask));
2130 }
2131
2132 VulkanBuffer stagingBuffer(
2133 m_VulkanState,
2134 "StagingBuffer",
2135 totalSize,
2136 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
2137 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2138 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
2139 );
2140
2141 auto& layoutTokens = indirectPtr->GetLayoutTokens();
2142
2143 int index = 0;
2144 FrameInfo::Get().m_World->ViewComponent<T>(*view, [&](const auto& e, auto& meshComp){
2145
2146 meshComp.GetMesh()->GetPacks().for_each([&](const auto& k, const std::shared_ptr<MeshPack>& v) {
2147
2148 for (int i = 0; i < layoutTokens.size(); i++)
2149 {
2150 switch (layoutTokens[i].tokenType)
2151 {
2152 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV:
2153 {
2154 VkBindShaderGroupIndirectCommandNV shader;
2155 shader.groupIndex = v->GetShaderGroupHandle() + 1;
2156 stagingBuffer.WriteToBuffer(&shader, inputStrides[i], index * inputStrides[i] + offset[i]);
2157 break;
2158 }
2159 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV:
2160 {
2161 VkBindVertexBufferIndirectCommandNV vbo;
2162 vbo.bufferAddress = v->GetResource().positions.buffer->GetAddress();
2163 vbo.size = sizeof(v->GetResource().positions.attributes);
2164 vbo.stride = sizeof(glm::vec3);
2165 stagingBuffer.WriteToBuffer(&vbo, inputStrides[i], index * inputStrides[i] + offset[i]);
2166 break;
2167 }
2168 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV:
2169 {
2170 VkBindIndexBufferIndirectCommandNV ibo;
2171 ibo.bufferAddress = v->GetResource().primitivePoints.buffer->GetAddress();
2172 ibo.size = sizeof(v->GetResource().primitivePoints.attributes);
2173 ibo.indexType = VK_INDEX_TYPE_UINT32;
2174 stagingBuffer.WriteToBuffer(&ibo, inputStrides[i], index * inputStrides[i] + offset[i]);
2175 break;
2176 }
2177 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV:
2178 {
2179 VkDeviceAddress push;
2180 push = v->GetMeshDesc().GetBufferAddress();
2181 stagingBuffer.WriteToBuffer(&push, inputStrides[i], index * inputStrides[i] + offset[i]);
2182 break;
2183 }
2184 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV:
2185 {
2186 VkDrawIndexedIndirectCommand drawIndexed;
2187 drawIndexed.firstIndex = 0;
2188 drawIndexed.firstInstance = 0;
2189 drawIndexed.indexCount = v->GetResource().primitivePoints.attributes->size();
2190 drawIndexed.instanceCount = 1;
2191 drawIndexed.vertexOffset = 0;
2192 stagingBuffer.WriteToBuffer(&drawIndexed, inputStrides[i], index* inputStrides[i] + offset[i]);
2193 break;
2194 }
2195 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV:
2196 {
2197 VkDrawMeshTasksIndirectCommandNV drawMesh;
2198 drawMesh = v->GetDrawCommand();
2199 stagingBuffer.WriteToBuffer(&drawMesh, inputStrides[i], index * inputStrides[i] + offset[i]);
2200 break;
2201 }
2202 default:
2203 SPICES_CORE_ERROR("Not Supported Token Type.");
2204 break;
2205 }
2206 }
2207
2208 index++;
2209 return false;
2210 });
2211 });
2212 stagingBuffer.Flush();
2213
2214 inputBuffer = indirectPtr->CreateInputBuffer(totalSize);
2215 inputBuffer->CopyBuffer(stagingBuffer.Get(), inputBuffer->Get(), totalSize);
2216 }
2217
2218 /**
2219 * @brief Fill in Streams
2220 */
2221 {
2222 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Fill in Streams");
2223
2224 std::vector<VkIndirectCommandsStreamNV> inputs;
2225 inputs.resize(offset.size());
2226 for (int i = 0; i < offset.size(); i++)
2227 {
2228 inputs[i].buffer = inputBuffer->Get();
2229 inputs[i].offset = offset[i];
2230 }
2231 indirectPtr->SetInputStreams(inputs);
2232 }
2233
2234 /**
2235 * @brief Regenerate dgc pipeline
2236 */
2237 {
2238 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Regenerate dgc pipeline");
2239
2240 CreateDGCMaterial(subPassName, indirectPtr.get());
2241 }
2242
2243 /**
2244 * @brief Create ProcessBuffer.
2245 */
2246 {
2247 SPICES_PROFILE_ZONEN("FillIndirectRenderData:: Create ProcessBuffer");
2248
2249 indirectPtr->CreatePreprocessBuffer();
2250 }
2251
2252 return indirectPtr;
2253 }
2254
2255 template<typename T>
2257 {
2259
2260 auto entities = std::make_shared<std::vector<uint32_t>>();
2261
2262 world->ViewComponent<MeshComponent>([&](auto entityID, auto& tComp) {
2263
2264 entities->push_back(static_cast<uint32_t>(entityID));
2265 return false;
2266
2267 });
2268
2269 return entities;
2270 }
2271
2272 template<typename F>
2274 {
2276
2277 return AsyncRHITask(ThreadPoolEnum::RHI, [=](VkCommandBuffer cmdBuffer) {
2278
2279 VkCommandBufferInheritanceInfo inheritanceInfo {};
2280 inheritanceInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
2281 inheritanceInfo.renderPass = m_Pass->Get();
2282 inheritanceInfo.subpass = subPass;
2283 inheritanceInfo.framebuffer = m_Pass->GetFramebuffer(FrameInfo::Get().m_ImageIndex);
2284 inheritanceInfo.occlusionQueryEnable = VK_TRUE;
2285
2286#ifdef SPICES_DEBUG
2287
2288 inheritanceInfo.pipelineStatistics = static_cast<VkQueryPipelineStatisticFlags>(PipelineStatisticEnum::ALL);
2289
2290#endif
2291
2292 VkCommandBufferBeginInfo cmdBufferBeginInfo {};
2293 cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2294 cmdBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
2295 cmdBufferBeginInfo.pInheritanceInfo = &inheritanceInfo;
2296
2297 VK_CHECK(vkBeginCommandBuffer(cmdBuffer, &cmdBufferBeginInfo))
2298
2299 func(cmdBuffer);
2300
2301 VK_CHECK(vkEndCommandBuffer(cmdBuffer))
2302
2303 return cmdBuffer;
2304 });
2305 }
2306
2307 template<typename T, typename F>
2308 inline void Renderer::IterWorldComp(FrameInfo& frameInfo, F func)
2309 {
2311
2312 /**
2313 * @brief Iter use view, not group.
2314 * @attention Group result nullptr here.
2315 */
2316 frameInfo.m_World->ViewComponent<T>([&](auto e, auto& tComp) {
2317 auto& transComp = frameInfo.m_World->GetRegistry().get<TransformComponent>(e);
2318
2319 /**
2320 * @brief This function defined how we use these components.
2321 * @param[in] e entityid.
2322 * @param[in] transComp TransformComponent.
2323 * @param[in] tComp TComponent.
2324 */
2325 func(static_cast<int>(e), transComp, tComp);
2326
2327 return false;
2328 });
2329 }
2330
2331 template<typename T, typename F>
2333 {
2335
2336 /**
2337 * @brief Iter use view, not group.
2338 * @attention Group result nullptr here.
2339 */
2340 frameInfo.m_World->ViewComponent<T>([&](auto e, auto& tComp) {
2341 auto& transComp = frameInfo.m_World->GetRegistry().get<TransformComponent>(e);
2342
2343 /**
2344 * @brief This function defined how we use these components.
2345 * @param[in] e entityid.
2346 * @param[in] transComp TransformComponent.
2347 * @param[in] tComp TComponent.
2348 * @return Returns true if need break for for loop.
2349 */
2350 return func(static_cast<int>(e), transComp, tComp);
2351 });
2352 }
2353
2354 template<typename T, typename F>
2355 inline void Renderer::IterWorldCompWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, F func)
2356 {
2358
2359 /**
2360 * @brief Iter use view, not group.
2361 * @attention Group result nullptr here.
2362 */
2363 frameInfo.m_World->ViewComponent<T>(ranges, [&](auto e, auto& tComp) {
2364 auto& transComp = frameInfo.m_World->GetRegistry().get<TransformComponent>(e);
2365
2366 /**
2367 * @brief This function defined how we use these components.
2368 * @param[in] e entityid.
2369 * @param[in] transComp TransformComponent.
2370 * @param[in] tComp TComponent.
2371 * @return Returns true if need break for for loop.
2372 */
2373 func(static_cast<int>(e), transComp, tComp);
2374
2375 return false;
2376 });
2377 }
2378
2379 template<typename T, typename F>
2380 inline void Renderer::IterWorldCompWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, uint32_t floor, uint32_t ceil, F func)
2381 {
2383
2384 /**
2385 * @brief Iter use view, not group.
2386 * @attention Group result nullptr here.
2387 */
2388 frameInfo.m_World->ViewComponent<T>(ranges, floor, ceil, [&](auto e, auto& tComp) {
2389 auto& transComp = frameInfo.m_World->GetRegistry().get<TransformComponent>(e);
2390
2391 /**
2392 * @brief This function defined how we use these components.
2393 * @param[in] e entityid.
2394 * @param[in] transComp TransformComponent.
2395 * @param[in] tComp TComponent.
2396 * @return Returns true if need break for for loop.
2397 */
2398 func(static_cast<int>(e), transComp, tComp);
2399
2400 return false;
2401 });
2402 }
2403
2404 template<typename T, typename F>
2405 inline void Renderer::IterWorldCompWithBreakWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, F func)
2406 {
2408
2409 /**
2410 * @brief Iter use view, not group.
2411 * @attention Group result nullptr here.
2412 */
2413 frameInfo.m_World->ViewComponent<T>(ranges, [&](auto e, auto& tComp) {
2414 auto& transComp = frameInfo.m_World->GetRegistry().get<TransformComponent>(e);
2415
2416 /**
2417 * @brief This function defined how we use these components.
2418 * @param[in] e entityid.
2419 * @param[in] transComp TransformComponent.
2420 * @param[in] tComp TComponent.
2421 * @return Returns true if need break for for loop.
2422 */
2423 return func(static_cast<int>(e), transComp, tComp);
2424 });
2425 }
2426
2427 template<typename T, typename F>
2428 inline void Renderer::IterWorldCompWithBreakWithRange(FrameInfo& frameInfo, const std::vector<uint32_t>& ranges, uint32_t floor, uint32_t ceil, F func)
2429 {
2431
2432 /**
2433 * @brief Iter use view, not group.
2434 * @attention Group result nullptr here.
2435 */
2436 frameInfo.m_World->ViewComponent<T>(ranges, floor, ceil, [&](auto e, auto& tComp) {
2437 auto& transComp = frameInfo.m_World->GetRegistry().get<TransformComponent>(e);
2438
2439 /**
2440 * @brief This function defined how we use these components.
2441 * @param[in] e entityid.
2442 * @param[in] transComp TransformComponent.
2443 * @param[in] tComp TComponent.
2444 * @return Returns true if need break for for loop.
2445 */
2446 return func(static_cast<int>(e), transComp, tComp);
2447 });
2448 }
2449
2450 template<typename F>
2451 inline void Renderer::IterStatistics(F&& func)
2452 {
2454
2455 if (!m_IsActive) return;
2456
2457 /**
2458 * @brief Iter valid statistics in rendererPass.
2459 */
2460 m_Pass->GetSubPasses()->for_each([&](const std::string& name, const std::shared_ptr<RendererSubPass>& subPass) {
2461
2462 const auto& ptr = subPass->GetStatistics();
2463
2464 if (!ptr) return false;
2465
2466 return func(name, ptr);
2467 });
2468 }
2469
2470 template<typename T, typename F>
2471 void Renderer::RenderBehaveBuilder::UpdatePushConstant(F func, VkCommandBuffer cmdBuffer)
2472 {
2474
2475 /**
2476 * @breif Create pushconstant object.
2477 */
2478 T push{};
2479
2480 /**
2481 * @breif Write in data
2482 * @param[in] push pushconstant object.
2483 */
2484 func(push);
2485
2486 std::stringstream ss;
2487 ss << m_Renderer->m_RendererName << "." << m_HandledSubPass->GetName() << ".Default";
2488
2489 /**
2490 * @breif Update PushConstants
2491 */
2492 vkCmdPushConstants(
2493 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2494 m_Renderer->m_Pipelines.Find(ss.str())->GetPipelineLayout(),
2495 VK_SHADER_STAGE_ALL,
2496 0,
2497 sizeof(T),
2498 &push
2499 );
2500 }
2501
2502 template<typename T, typename F>
2504 {
2506
2507 /**
2508 * @breif Create pushconstant object.
2509 */
2510 T push{};
2511
2512 /**
2513 * @breif Write in data
2514 * @param[in] push pushconstant object.
2515 */
2516 func(push);
2517
2518 std::stringstream ss;
2519 ss << m_Renderer->m_RendererName << "." << m_HandledSubPass->GetName() << ".Default";
2520
2521 /**
2522 * @breif Update PushConstants
2523 */
2524 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
2525 vkCmdPushConstants(
2526 cmdBuffer,
2527 m_Renderer->m_Pipelines[ss.str()]->GetPipelineLayout(),
2528 VK_SHADER_STAGE_ALL,
2529 0,
2530 sizeof(T),
2531 &push
2532 );
2533 });
2534 }
2535
2536 template<typename T, typename F>
2537 void Renderer::RenderBehaveBuilder::UpdateUniformBuffer(uint32_t set, uint32_t binding, F func)
2538 {
2540
2541 /**
2542 * @breif Create uniform buffer object
2543 */
2544 T ubo{};
2545
2546 /**
2547 * @breif Write in data
2548 * @param[in] uniform buffer object.
2549 */
2550 func(ubo);
2551
2552 /**
2553 * @breif Update uniform buffer.
2554 */
2555 m_HandledSubPass->SetBuffer({ set, binding }, &ubo);
2556 }
2557
2558 template<typename T, typename F>
2559 void Renderer::RenderBehaveBuilder::UpdateStorageBuffer(uint32_t set, uint32_t binding, F func)
2560 {
2562
2563 /**
2564 * @breif Create uniform buffer object
2565 */
2566 T ssbo{};
2567
2568 /**
2569 * @breif Write in data
2570 * @param[in] uniform buffer object.
2571 */
2572 func(ssbo);
2573
2574 /**
2575 * @breif Update uniform buffer.
2576 */
2577 m_HandledSubPass->SetBuffer({ set, binding }, &ssbo);
2578 }
2579
2580 template<typename T>
2581 void Renderer::RenderBehaveBuilder::UpdatePushConstant(void* data, VkCommandBuffer cmdBuffer) const
2582 {
2584
2585 std::stringstream ss;
2586 ss << m_Renderer->m_RendererName << "." << m_HandledSubPass->GetName() << ".Default";
2587
2588 /**
2589 * @breif Update PushConstants
2590 */
2591 vkCmdPushConstants(
2592 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2593 m_Renderer->m_Pipelines[ss.str()]->GetPipelineLayout(),
2594 VK_SHADER_STAGE_ALL,
2595 0,
2596 sizeof(T),
2597 data
2598 );
2599 }
2600
2601 template<typename T>
2603 {
2605
2606 std::stringstream ss;
2607 ss << m_Renderer->m_RendererName << "." << m_HandledSubPass->GetName() << ".Default";
2608
2609 /**
2610 * @breif Update PushConstants
2611 */
2612 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, [&](const VkCommandBuffer& cmdBuffer) {
2613 vkCmdPushConstants(
2614 cmdBuffer,
2615 m_Renderer->m_Pipelines[ss.str()]->GetPipelineLayout(),
2616 VK_SHADER_STAGE_ALL,
2617 0,
2618 sizeof(T),
2619 data
2620 );
2621 });
2622 }
2623
2624 inline void Renderer::RenderBehaveBuilder::UpdateUniformBuffer(uint32_t set, uint32_t binding, void* data) const
2625 {
2627
2628 /**
2629 * @breif Update uniform buffer.
2630 */
2631 m_HandledSubPass->SetBuffer({ set, binding }, data);
2632 }
2633
2635 uint32_t set ,
2636 uint32_t binding ,
2637 void* data ,
2638 uint64_t size ,
2639 uint64_t offset
2640 ) const
2641 {
2643
2644 /**
2645 * @breif Update uniform buffer.
2646 */
2647 m_HandledSubPass->SetBuffer({ set, binding }, data, size, offset);
2648 }
2649
2651 uint32_t set ,
2652 uint32_t binding ,
2653 std::shared_ptr<VulkanBuffer> buffer
2654 ) const
2655 {
2657
2658 const String2 m_DescriptorSetId = { m_Renderer->m_Pass->GetName(), m_HandledSubPass->GetName() };
2659
2660 const auto& descriptorSets = DescriptorSetManager::GetByName(m_DescriptorSetId);
2661
2662 descriptorSets.find(set)->second->UpdateDescriptorSet(binding, buffer);
2663 }
2664
2666 uint32_t set ,
2667 uint32_t binding ,
2668 const VkAccelerationStructureKHR& accel
2669 ) const
2670 {
2672
2673 const String2 m_DescriptorSetId = { m_Renderer->m_Pass->GetName(), m_HandledSubPass->GetName() };
2674
2675 const auto& descriptorSets = DescriptorSetManager::GetByName(m_DescriptorSetId);
2676
2677 descriptorSets.find(set)->second->UpdateDescriptorSet(binding, accel);
2678 }
2679
2680 template<typename T>
2682 uint32_t set ,
2683 uint32_t binding ,
2684 VkShaderStageFlags stageFlags ,
2685 const std::vector<std::string>& textureNames
2686 )
2687 {
2689
2690 /**
2691 * @brief fill in imageInfos.
2692 */
2693 for (int i = 0; i < textureNames.size(); i++)
2694 {
2695 const std::shared_ptr<Texture> texture = ResourcePool<Texture>::Load<T>(textureNames[i], textureNames[i]);
2696 m_ImageInfos[set][binding].push_back(*texture->GetResource<VulkanImage>()->GetImageInfo());
2697 }
2698
2699 /**
2700 * @brief Registy descriptor and add binging to it.
2701 */
2702 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
2703 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stageFlags, SpicesShader::BINDLESS_TEXTURE_MAXNUM);
2704
2705 return *this;
2706 }
2707
2708 template<typename T>
2710 uint32_t set ,
2711 uint32_t binding ,
2712 VkShaderStageFlags stageFlags,
2713 const std::vector<std::string>& textureNames
2714 )
2715 {
2717
2718 /**
2719 * @brief fill in imageInfos.
2720 */
2721 for (int i = 0; i < textureNames.size(); i++)
2722 {
2723 const std::shared_ptr<Texture> texture = ResourcePool<Texture>::Load<T>(textureNames[i], textureNames[i]);
2724 m_ImageInfos[set][binding].push_back(*texture->GetResource<VulkanImage>()->GetImageInfo());
2725 }
2726
2727 /**
2728 * @brief Registy descriptor and add binging to it.
2729 */
2730 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
2731 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stageFlags, static_cast<uint32_t>(textureNames.size()));
2732
2733 return *this;
2734 }
2735
2736 template<typename T>
2738 {
2740
2741 /**
2742 * @brief Instance a VkAttachmentDescription.
2743 */
2744 VkAttachmentDescription attachmentDescription{};
2745 attachmentDescription.format = m_Renderer->m_Device->GetSwapChainSupport().format.format;
2746 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
2747 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
2748 attachmentDescription.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
2749 attachmentDescription.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
2750 attachmentDescription.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
2751 attachmentDescription.initialLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
2752 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
2753
2754 /**
2755 * @breif Write in data
2756 * @param[in] attachmentDescription VkAttachmentDescription.
2757 */
2758 func(attachmentDescription);
2759
2760 /**
2761 * @brief Instance a VkClearValue.
2762 */
2763 VkClearValue clearValue{};
2764 clearValue.color = { 0.0f, 0.0f, 0.0f, 1.0f };
2765
2766 /**
2767 * @brief Instance a VkPipelineColorBlendAttachmentState.
2768 */
2769 VkPipelineColorBlendAttachmentState colorBlend{};
2770 colorBlend.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
2771 VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
2772 colorBlend.blendEnable = VK_FALSE;
2773 colorBlend.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
2774 colorBlend.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO;
2775 colorBlend.colorBlendOp = VK_BLEND_OP_ADD;
2776 colorBlend.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
2777 colorBlend.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
2778 colorBlend.alphaBlendOp = VK_BLEND_OP_ADD;
2779
2780 const uint32_t index = m_Renderer->m_Pass->AddAttachment("SwapChainImage", attachmentDescription, 1, clearValue);
2781
2782 /**
2783 * @brief Instance a VkAttachmentReference.
2784 */
2785 VkAttachmentReference attachmentRef{};
2786 attachmentRef.attachment = index;
2787 attachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2788
2789 m_HandledRendererSubPass->AddColorAttachmentReference(attachmentRef, colorBlend);
2790
2791 return *this;
2792 }
2793
2794 template<typename T>
2796 const std::string& attachmentName ,
2797 const TextureType& type ,
2798 T func
2799 )
2800 {
2802
2803 /**
2804 * @brief Instance a VkAttachmentDescription.
2805 */
2806 VkAttachmentDescription attachmentDescription{};
2807 attachmentDescription.format = m_Renderer->m_Device->GetSwapChainSupport().format.format;
2808 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
2809 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
2810 attachmentDescription.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
2811 attachmentDescription.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
2812 attachmentDescription.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
2813 attachmentDescription.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2814 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2815
2816 /**
2817 * @brief Write in data.
2818 * @param[in] isEnableBlend True if This Attachment can be blend.
2819 * @param[in attachmentDescription VkAttachmentDescription.
2820 */
2821 bool isEnableBlend = false;
2822 func(isEnableBlend, attachmentDescription);
2823
2824 /**
2825 * @brief Instance a VkClearValue.
2826 */
2827 VkClearValue clearValue{};
2828 clearValue.color = { 0.0f, 0.0f, 0.0f, 1.0f };
2829
2830 /**
2831 * @brief Instance a VkPipelineColorBlendAttachmentState.
2832 */
2833 VkPipelineColorBlendAttachmentState colorBlend{};
2834 colorBlend.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
2835 VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
2836 if (!isEnableBlend)
2837 {
2838 colorBlend.blendEnable = VK_FALSE;
2839 colorBlend.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
2840 colorBlend.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO;
2841 colorBlend.colorBlendOp = VK_BLEND_OP_ADD;
2842 colorBlend.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
2843 colorBlend.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
2844 colorBlend.alphaBlendOp = VK_BLEND_OP_ADD;
2845 }
2846 else
2847 {
2848 colorBlend.blendEnable = VK_TRUE;
2849 colorBlend.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
2850 colorBlend.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
2851 colorBlend.colorBlendOp = VK_BLEND_OP_ADD;
2852 colorBlend.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
2853 colorBlend.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE; // Stable alpha channel to 1, for ImGui::Image will rendering background wrongly.
2854 colorBlend.alphaBlendOp = VK_BLEND_OP_ADD;
2855 }
2856
2857 /**
2858 * @brief Instance a RendererResourceCreateInfo.
2859 */
2861 Info.name = attachmentName;
2862 Info.type = type;
2863 Info.description = attachmentDescription;
2864 Info.width = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width;
2865 Info.height = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height;
2866
2867 VkImageView& view = m_Renderer->m_RendererResourcePool->AccessResource(Info)->imageView;
2868
2869 /**
2870 * @brief Get layers.
2871 */
2872 uint32_t layers = 1;
2873 switch (type)
2874 {
2876 layers = m_Renderer->m_RendererResourcePool->AccessRowResource(Info.name)->GetLayers();
2877 break;
2879 layers = 6;
2880 break;
2881 default:
2882 break;
2883 }
2884
2885 uint32_t index = m_Renderer->m_Pass->AddAttachment(attachmentName, attachmentDescription, clearValue, layers, view);
2886
2887 /**
2888 * @brief Instance a VkAttachmentReference.
2889 */
2890 VkAttachmentReference attachmentRef{};
2891 attachmentRef.attachment = index;
2892 attachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2893
2894 m_HandledRendererSubPass->AddColorAttachmentReference(attachmentRef, colorBlend);
2895
2896 return *this;
2897 }
2898
2899 template<typename T>
2901 const std::string& attachmentName ,
2902 const TextureType& type ,
2903 T func
2904 )
2905 {
2907
2908 /**
2909 * @brief Instance a VkAttachmentDescription.
2910 */
2911 VkAttachmentDescription depthAttachment{};
2912 depthAttachment.format = VulkanSwapChain::FindDepthFormat(m_Renderer->m_VulkanState.m_PhysicalDevice);
2913 depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
2914 depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
2915 depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
2916 depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
2917 depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
2918 depthAttachment.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
2919 depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
2920
2921 /**
2922 * @brief Write in data.
2923 * @param[in attachmentDescription VkAttachmentDescription.
2924 */
2925 func(depthAttachment);
2926
2927 /**
2928 * @brief Instance a VkClearValue.
2929 * Though we reverse z depth, clear buffer with 0.0f here.
2930 */
2931 VkClearValue clearValue{};
2932 clearValue.depthStencil = { 0.0f, 0 };
2933
2934 /**
2935 * @brief Instance a RendererResourceCreateInfo.
2936 */
2938 Info.name = attachmentName;
2939 Info.type = type;
2940 Info.description = depthAttachment;
2941 Info.width = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width;
2942 Info.height = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height;
2943 Info.isDepthResource = true;
2944
2945 const VkImageView& view = m_Renderer->m_RendererResourcePool->AccessResource(Info)->imageView;
2946
2947 /**
2948 * @brief Get layers.
2949 */
2950 uint32_t layers = 1;
2951 switch (type)
2952 {
2954 layers = m_Renderer->m_RendererResourcePool->AccessRowResource(Info.name)->GetLayers();
2955 break;
2957 layers = 6;
2958 break;
2959 default:
2960 break;
2961 }
2962
2963 const uint32_t index = m_Renderer->m_Pass->AddAttachment(attachmentName, depthAttachment, clearValue, layers, view);
2964
2965 /**
2966 * @brief Instance a VkAttachmentReference.
2967 */
2968 VkAttachmentReference depthAttachmentRef{};
2969 depthAttachmentRef.attachment = index;
2970 depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
2971
2972 m_HandledRendererSubPass->AddDepthAttachmentReference(depthAttachmentRef);
2973
2974 return *this;
2975 }
2976
2977 template<typename T>
2979 const std::string& attachmentName ,
2980 const TextureType& type ,
2981 T func
2982 )
2983 {
2985
2986 /**
2987 * @brief Instance a VkAttachmentDescription.
2988 */
2989 VkAttachmentDescription attachmentDescription{};
2990 attachmentDescription.format = m_Renderer->m_Device->GetSwapChainSupport().format.format;
2991 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
2992 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
2993 attachmentDescription.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
2994 attachmentDescription.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
2995 attachmentDescription.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
2996 attachmentDescription.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2997 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2998
2999 /**
3000 * @brief Write in data.
3001 * @param[in attachmentDescription VkAttachmentDescription.
3002 */
3003 func(attachmentDescription);
3004
3005 /**
3006 * @brief Instance a VkClearValue.
3007 */
3008 VkClearValue clearValue{};
3009 clearValue.color = { 0.0f, 0.0f, 0.0f, 1.0f };
3010
3011 /**
3012 * @brief Instance a RendererResourceCreateInfo.
3013 */
3015 Info.name = attachmentName;
3016 Info.type = type;
3017 Info.description = attachmentDescription;
3018 Info.width = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width;
3019 Info.height = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height;
3020
3021 const VkImageView& view = m_Renderer->m_RendererResourcePool->AccessResource(Info)->imageView;
3022
3023 const uint32_t index = m_Renderer->m_Pass->AddAttachment(attachmentName, attachmentDescription, clearValue, 1, view); /*todo: layer config */
3024
3025 /**
3026 * @brief Instance a VkAttachmentReference.
3027 */
3028 VkAttachmentReference attachmentRef{};
3029 attachmentRef.attachment = index;
3030 attachmentRef.layout = attachmentDescription.finalLayout;
3031
3032 m_HandledRendererSubPass->AddInputAttachmentReference(attachmentRef);
3033
3034 return *this;
3035 }
3036}
#define EVENT_CLASS_TYPE(type)
Defines Event type.
Definition Event.h:74
#define EVENT_CLASS_CATEGORY(category)
Defines Event category.
Definition Event.h:82
static constexpr uint32_t MAX_DIRECTIONALLIGHT_NUM
Definition Renderer.h:46
static constexpr uint32_t MAX_POINTLIGHT_MUN
Definition Renderer.h:47
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
#define SPICES_PROFILE_VK_ZONE(cmdbuf, name)
#define SPICES_PROFILE_FRAME
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
virtual ~Application()
Destructor Function.
Application()
Constructor Function.
static void Run()
Run Our World.
Application Class. Our Engine Start here.
Definition Application.h:20
Console Entity Class.
Definition Console.h:82
This Class manages all descriptor sets this project.
Entity Class. This class defines the specific behaves of Entity.
Definition Entity.h:20
This Class is the basic Event Class. Inherit from it and create specific event class.
Definition Event.h:96
uint32_t m_PickMaterial
Identify of selected material.
Definition FrameInfo.h:89
FrameInfo(const FrameInfo &)=delete
Copy Constructor Function.
uint32_t m_FrameIndex
FrameIndex, varying during 0 - (MaxFrameInFlight - 1). Used almost anywhere.
Definition FrameInfo.h:69
FrameInfo & operator=(const FrameInfo &)=delete
Copy Assignment Operation.
virtual ~FrameInfo()=default
Destructor Function.
static FrameInfo & Get()
Get FrameInfo.
Definition FrameInfo.cpp:14
std::shared_ptr< World > m_World
The shared pointer of specific world.
Definition FrameInfo.h:94
scl::linked_unordered_map< int, std::string > m_PickEntityID
Definition FrameInfo.h:82
RendererType m_RendererType
The renderer type of current world.
Definition FrameInfo.h:99
FrameInfo()=default
Constructor Function.
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 DrawTreeTitle(const std::string &treeName, std::function< void()> optionFunc, std::function< void()> treeFunc)
Draw a stylized tree title bar.
The ImGuiH Class. This class defines helper function for slate render.
Definition ImguiHelper.h:61
std::shared_ptr< Console > m_Console
The shared pointer of Console.
virtual ~ImguiConsole() override=default
Destructor Function.
bool m_EnableCmdInput
The boolean of enable Cmd Input.
ImguiConsole(const std::string &panelName, FrameInfo &frameInfo, std::shared_ptr< Console > console)
Constructor Function.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
ImGuiTextFilter m_Filter
The Filter of console.
int m_Level
The information level that console show.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
static int TextEditCallbackStub(ImGuiInputTextCallbackData *data)
Input Text Call back function.
The ImguiConsole Class. This class defines how to render a Console.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
ImguiContentBrowser(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
virtual ~ImguiContentBrowser() override=default
Destructor Function.
The ImguiContentBrowser Class. This class defines how to render a Content Browser.
The ImguiCreateEntity Class. This class defines how to render a Create.
The ImguiEdit Class. This class defines how to render a edit menu.
Definition ImguiEdit.h:23
The ImguiFile Class. This class defines how to render a file menu.
Definition ImguiFile.h:18
virtual void OnRender() override
This interface is called On SlateRenderer Render.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
bool OnKeyPressed(KeyPressedEvent &e)
Event Dispatcher target. Registry on Key Resized.
virtual ~ImguiGizmos() override=default
Destructor Function.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
Definition ImguiGizmos.h:45
int m_GizmoType
Gizmo Type, Transpose, rotate, scale, universal.
Definition ImguiGizmos.h:84
ImguiSlate * m_Owner
The owner, usually is a ImguiViewport class.
Definition ImguiGizmos.h:79
bool bEnableGizmo
Is Enable Gizmo.
Definition ImguiGizmos.h:89
ImguiGizmos(const std::string &panelName, FrameInfo &frameInfo, ImguiSlate *owner)
Constructor Function.
Definition ImguiGizmos.h:27
bool IsOver() const
Is mouse is over gizmo.
Definition ImguiGizmos.h:63
The ImguiGizmos Class. This class defines how to render a viewport gizmo.
Definition ImguiGizmos.h:18
The ImguiHelp Class. This class defines how to render a Help.
Definition ImguiHelp.h:23
ImguiInfoBar(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
scl::linked_unordered_map< std::string, std::shared_ptr< SlateInfoBar > > m_InfoBars
InfoBar instances.
std::shared_ptr< SlateInfoBar > m_SelectedInfoBar
Selected InfoBar.
void Push(std::shared_ptr< SlateInfoBar > instance)
Add a InfoBar instance to this.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
virtual ~ImguiInfoBar() override=default
Destructor Function.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
The ImguiInfoBar Class. This class defines how to render a Operation Panel.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
std::shared_ptr< ImguiCreateEntity > m_Create
std::shared_ptr< ImguiWindow > m_Window
std::shared_ptr< ImguiEdit > m_Edit
The shared pointer of ImguiEdit.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
ImguiMainMenu(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
std::shared_ptr< ImguiHelp > m_Help
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
std::shared_ptr< ImguiFile > m_File
The shared pointer of ImguiFile.
virtual ~ImguiMainMenu() override=default
Destructor Function.
The ImguiMainMenu Class. This class defines how to render a main menu.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
ImguiMaterialPanel(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
virtual ~ImguiMaterialPanel() override=default
Destructor Function.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
The ImguiMaterialPanel Class. This class defines how to render a Material Property.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
virtual ~ImguiOperation() override=default
Destructor Function.
ImguiOperation(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
The ImguiOperation Class. This class defines how to render a Operation Panel.
static void DrawComponent(const std::string &name, Entity entity)
Draw Entity Component on Property Panel.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
ImguiProperty(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
virtual void OnRender() override
This interface is called On SlateRenderer Render.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
virtual ~ImguiProperty() override=default
Destructor Function.
The ImguiProperty Class. This class defines how to render a Property.
bool m_IsHovered
True if Hovered.
Definition ImguiUtils.h:176
ImVec2 & GetPanelSize()
Get Panel Size.
Definition ImguiUtils.h:114
virtual ~ImguiSlate()=default
Destructor Function.
void Begin(float alpha=1.0f, ImGuiWindowFlags flags=0)
Begin a common slate.
void SetWindowState(bool isSlateOn)
Set Slate is render able or not.
Definition ImguiUtils.h:106
void Begin(const std::string &panelName, float alpha=1.0f, ImGuiWindowFlags flags=0)
Begin a common slate with name.
virtual void OnUpdate(TimeStep &ts)=0
This interface is called on SlateSystem Update.
bool IsHovered() const
Get is IsHovered.
Definition ImguiUtils.h:132
ImVec2 m_PanelPos
This slate's position in desktop.
Definition ImguiUtils.h:156
FrameInfo & m_FrameInfo
The FrameData reference.
Definition ImguiUtils.h:166
void End()
End a slate.
ImVec2 & GetPanelPos()
Get Panel Pos.
Definition ImguiUtils.h:120
ImGuiWindowFlags m_WindowFlags
Flags of this window slate.
Definition ImguiUtils.h:191
ImVec2 m_PanelSize
This slate's size.
Definition ImguiUtils.h:151
virtual void QueryIsResizedThisFrame(const ImVec2 &thisFrameSize)
Query whether viewport is resized this frame.
bool IsResizedThisFrame() const
Get boolean of whether resized this frame.
Definition ImguiUtils.h:138
virtual void OnEvent(Event &event)=0
This interface is called on global event function pointer execute.
ImguiSlate(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function. Init with Slate's name.
Definition ImguiUtils.h:35
virtual void OnRender()=0
This interface is called on SlateRenderer Render.
void LoadSlateIcon(ImTextureID &id, const std::string &iconFile)
Load a Texture from ResourcePool.
bool m_IsResized
Boolean of whether resized this frame.
Definition ImguiUtils.h:186
std::string m_PanelName
This slate's name.
Definition ImguiUtils.h:161
const std::string & GetName() const
Get this panel Name.
Definition ImguiUtils.h:144
bool IsFocused() const
Get is IsFocused.
Definition ImguiUtils.h:126
bool m_IsFocused
True if Focus.
Definition ImguiUtils.h:171
This Class defines the basic behaves of specific slate. When we add an new Slate, we need inherit fro...
Definition ImguiUtils.h:27
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
Definition ImguiStage.h:50
virtual void OnRender() override
This interface is called On SlateRenderer Render.
virtual ~ImguiStage() override=default
Destructor Function.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
Definition ImguiStage.h:40
ImguiStage(const std::string &panelName, FrameInfo &frameInfo)
Constructor Function.
The ImguiStage Class. This class defines how to render a Stage.
Definition ImguiStage.h:18
uint32_t m_Index
This viewport index.
std::shared_ptr< ImguiViewportToolBar > m_ToolBar
The shared pointer of ImguiGizmos.
std::shared_ptr< ImguiGizmos > m_Gizmos
The shared pointer of ImguiGizmos.
bool OnWindowResizeOver(WindowResizeOverEvent &event) const
Event Dispatcher target. Registry on Windows Resized.
virtual ~ImguiViewport() override=default
Destructor Function.
std::shared_ptr< scl::behave_state_list< void > > m_ToggleStateList
Toggle behave state list.
bool m_IsToggled
True if this slate toggled this frame.
void Toggle() const
Toggle viewport.
bool OnToggleSlate(KeyPressedEvent &event) const
Toggle focused slate.
ImguiViewport(const std::string &panelName, FrameInfo &frameInfo, uint32_t index=0)
Constructor Function.
bool OnSlateResize(SlateResizeEvent &event) const
Event Dispatcher target. Registry on Slate(Viewport) Resized.
virtual void QueryIsResizedThisFrame(const ImVec2 &thisFrameSize) override
Query whether viewport is resized this frame. Clamp min m_panelsize value to 1 here,...
virtual void OnRender() override
This interface is called On SlateRenderer Render.
std::shared_ptr< ImguiFloatingInfo > m_FloatingInfo
The shared pointer of ImguiFloatingInfo.
std::pair< uint32_t, uint32_t > GetMousePosInViewport() const
Get Mouse Position Relative Viewport(Might be negative value).
std::shared_ptr< ImguiGizmos > GetGizmo()
Get Gizmo Shared Pointer.
virtual void OnUpdate(TimeStep &ts) override
This interface is called On SlateSystem Update.
std::shared_ptr< SlateImage > m_ViewportContext
SlateImage of SceneColor.
virtual void OnEvent(Event &event) override
This interface is called On Global Event Function Pointer is called.
The ImguiViewport Class. This class defines how to render a viewport.
The ImguiWindow Class. This class defines how to render a window menu.
Definition ImguiWindow.h:33
This Class is inherited from KeyEvent Class.
Definition KeyEvent.h:57
static void Init()
Init Log.
Definition Log.cpp:24
static void ShutDown()
Shutdown Log.
Definition Log.cpp:82
Material Class. This class contains a branch of parameter and shader, also descriptor.
Definition Material.h:62
virtual std::string ToString() const override
Serialize this Event Class to string.
Definition WorldEvent.h:60
MeshAddedWorldEvent()=default
Constructor Function.
virtual ~MeshAddedWorldEvent() override=default
Destructor Function.
This Class is inherited from Event Class.
Definition WorldEvent.h:43
MeshComponent Class. This class defines the specific behaves of MeshComponent.
NativeScriptSystem Class. This class defines the specific behaves of NativeScriptSystem.
uint32_t StatisticsFlags
Definition Querier.h:32
Basic interface of Queries.
Definition Querier.h:17
RenderFrontend(const RenderFrontend &)=delete
RenderFrontend & operator=(const RenderFrontend &)=delete
std::unique_ptr< VulkanRenderBackend > m_RenderBackend
void RenderFrame(TimeStep &ts, FrameInfo &frameInfo)
virtual ~RenderFrontend()=default
void BeginFrame(FrameInfo &frameInfo)
void EndFrame(FrameInfo &frameInfo)
void OnEvent(Event &event)
virtual void OnSystemInitialize() override
This interface defines the behave on specific system initialized. Called when system Pushed to System...
RenderSystem(const std::string &systemName)
Constructor Function. Init class variable. Usually call it.
virtual void OnSystemUpdate(TimeStep &ts) override
This interface defines the behave on specific system updated every frame.
virtual void OnEvent(Event &event) override
This interface defines the behave on global event function pointer is called.
virtual void OnSystemShutDown() override
This interface defines the behave on specific system shutdown. Called when system poped from SystemMa...
virtual ~RenderSystem() override
Destructor Function.
std::unique_ptr< RenderFrontend > m_RenderFrontend
The RenderFrontend shared pointer.
ResourceSystem Class. This class defines the specific behaves of RenderSystem.
Caches of Renderer data. This class treats all stored caches as garbage and actively cleans them up.
This class is a wrapper of VulkanRenderPass. Used during Renderer.
std::unordered_map< std::string, std::unique_ptr< RendererResource > > m_RendererResource
The hashmap of all RendererResource.
RendererResourcePool(const RendererResourcePool &)=delete
Copy Constructor Function.
VkDescriptorImageInfo * AccessResource(const RendererResourceCreateInfo &info=RendererResourceCreateInfo{}, uint32_t mipLevel=0)
Get Resource with specific name, create it if it have not been created.
void OnSlateResize(uint32_t width, uint32_t height) const
Event Called on Slate resize.
RendererResourcePool()=default
Constructor Function.
RendererResourcePool & operator=(const RendererResourcePool &)=delete
Copy Assignment Operation.
std::shared_ptr< VulkanImage > AccessRowResource(const std::string &name)
Get Row Resource with specific name.
virtual ~RendererResourcePool()=default
Destructor Function.
RendererResourcePool Class. This class is a pool of all framebuffer's attachment.
std::unique_ptr< Texture2D > m_Texture
The texture this class Wrapped.
RendererResourceCreateInfo m_Info
The information of this resource.
RendererResource(const RendererResourceCreateInfo &info)
Constructor Function. Init member variables.
std::unique_ptr< Texture2D > & GetTexture()
Get Texture this class wrapped.
bool IsResizeable() const
Get isResizeable variable.
void OnResized(uint32_t width, uint32_t height)
Called On SwapChain Resized. Event received from VulkanRenderBackEnd.
virtual ~RendererResource()=default
Destructor Function.
bool m_IsResizeable
True if this resource can resize.
RendererResource Class. This class is a wrapper of framebuffer attachment.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.
virtual void InternalBarriers(VkBuffer buffer, VkAccessFlags srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT, VkAccessFlags dstAccessMask=VK_ACCESS_SHADER_READ_BIT, VkPipelineStageFlags srcStageMask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkPipelineStageFlags dstStageMask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Buffer Barrier from this queue to this queue.
virtual std::shared_ptr< RendererSubPass > & GetStatisticsRendererPass() override
Get RenderPass in statistics. @reutrn Return RenderPass.
Definition Renderer.cpp:893
ComputeRenderBehaveBuilder(Renderer *renderer, uint32_t currentFrame, uint32_t currentImage, const std::array< VkCommandBuffer, MaxFrameInFlight > &cmdBuffers)
Constructor Function. Bind pipeline and all buffer type descriptor set.
virtual void AddBarriers(VkBuffer buffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Buffer Barrier from graphic queue to this compute queue.
virtual void BindDescriptorSet(const DescriptorSetInfo &infos, const std::string &name, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_COMPUTE) override
Binding DescriptorSet with DescriptorSetInfo and name. For Binding a Material DescriptorSet.
virtual void InternalBarriers(VulkanImage *image, VkAccessFlags srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT, VkAccessFlags dstAccessMask=VK_ACCESS_SHADER_READ_BIT, VkPipelineStageFlags srcStageMask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkPipelineStageFlags dstStageMask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Image Barrier from this queue to this queue.
void Dispatch(uint32_t x, uint32_t y, uint32_t z) const
Dispatch Compute Shader.
virtual void ReleaseBarriers(VulkanImage *image, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Image Barrier from this compute queue to graphic queue.
virtual void InternalBarriers(VkAccessFlags srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT, VkAccessFlags dstAccessMask=VK_ACCESS_SHADER_READ_BIT, VkPipelineStageFlags srcStageMask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkPipelineStageFlags dstStageMask=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Memory Barrier from this queue to this queue.
virtual void BeginRenderPass() override
Begin this Renderer's RenderPass.
Definition Renderer.cpp:900
virtual ~ComputeRenderBehaveBuilder() override=default
Destructor Function.
virtual void BindPipeline(const std::string &materialName, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_COMPUTE) override
Bind the pipeline created by CreatePipeline(). Called on RenderBehaveBuilder instanced.
virtual void BindDescriptorSet(const DescriptorSetInfo &infos, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_COMPUTE) override
Binding DescriptorSet with DescriptorSetInfo. For Binding a Renderer DescriptorSet.
virtual void BeginNextSubPass(const std::string &subPassName) override
End a preview sub pass and stat next sub pass.
Definition Renderer.cpp:787
virtual void AddBarriers(VulkanImage *image, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Image Barrier from graphic queue to this compute queue.
virtual void ReleaseBarriers(VkBuffer buffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) override
Add a Buffer Barrier from this compute queue to graphic queue.
virtual void EndRenderPass() override
End this Renderer's RenderPass.
This class helps to bind pipeline and bind buffer. Specific for pure Compute Renderer....
Definition Renderer.h:1739
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
Definition Renderer.h:961
DGCLayoutBuilder & AddDrawMeshTaskInput()
Add Draw Mesh Task Command to Input.
DGCLayoutBuilder & AddVertexBufferInput()
Add Binding Vertex Buffer to Input.
std::string m_SubPassName
Specific SubPass Name. Passed while this class instanced.
Definition Renderer.h:967
DGCLayoutBuilder(const std::string &subPassName, Renderer *renderer)
Constructor Function.
std::vector< VkIndirectCommandsLayoutTokenNV > m_InputInfos
Stores command inputs.
Definition Renderer.h:972
DGCLayoutBuilder & AddShaderGroupInput()
Add Binding Shader Group Command to Input.
DGCLayoutBuilder & AddIndexBufferInput()
Add Binding Index Buffer to Input.
DGCLayoutBuilder & AddDrawIndexedInput()
Add Draw Indexed Command to Input.
void Build() const
Create GDC Layout.
virtual ~DGCLayoutBuilder()=default
Destructor Function.
DGCLayoutBuilder & AddPushConstantInput()
Add Binding PushConstant Command to Input.
std::shared_ptr< VulkanDeviceGeneratedCommandsNV > m_HandledDGCData
Current SubPass DGC Data.
Definition Renderer.h:977
This Class is a helper for Building GDC Layout. Only instanced during CreateDeviceGeneratedCommandsLa...
Definition Renderer.h:896
DescriptorSetBuilder & AddAccelerationStructure(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags)
Add the Acceleration Structure set binding to descriptor set layout.
DescriptorSetBuilder & AddBindLessTexture(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, const std::vector< std::string > &textureNames)
Init the BindLess texture set binding to descriptor set layout.
DescriptorSetBuilder & AddTexture(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, const std::vector< std::string > &textureNames)
Add the texture set binding to descriptor set layout.
void Build(const VkAccelerationStructureKHR &accel=VK_NULL_HANDLE)
Create all buffer type descriptor set. Create pipeline layout.
std::unordered_map< uint32_t, std::unordered_map< uint32_t, std::vector< VkDescriptorImageInfo > > > m_ImageInfos
DescriptorSet Image type binging info. [set] - [binding] - [info].
Definition Renderer.h:742
String2 m_DescriptorSetId
The Descriptor Set Manager ID descriptorSet belongs to.
Definition Renderer.h:730
std::unordered_map< uint32_t, std::unordered_map< uint32_t, VkDescriptorBufferInfo > > m_BufferInfos
DescriptorSet Buffer type binging info. [set] - [binding] - [info].
Definition Renderer.h:736
virtual ~DescriptorSetBuilder()=default
Destructor Function.
DescriptorSetBuilder & AddStorageBuffer(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, std::shared_ptr< VulkanBuffer > buffer)
Add buffer object in collection, and add it's set binding to descriptorsetlayout, and sets descriptor...
DescriptorSetBuilder & AddStorageBuffer(uint32_t set, uint32_t binding, uint64_t size, VkShaderStageFlags stageFlags)
Create local buffer object in collection, and add it's set binding to descriptorsetlayout,...
DescriptorSetBuilder & AddStorageTexture(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, const std::vector< std::string > &textureNames, VkFormat format=VK_FORMAT_R8G8B8A8_UNORM, TextureType type=TextureType::Texture2D)
Add the storage texture set binding to descriptor set layout.
DescriptorSetBuilder & AddStorageTextureMipmaps(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, const std::string &textureName, VkFormat format=VK_FORMAT_R8G8B8A8_UNORM, TextureType type=TextureType::Texture2D, std::function< void(RendererResourceCreateInfo &)> func=nullptr)
Add the storage texture set binding with mipmap to descriptor set layout.
DescriptorSetBuilder & AddUniformBuffer(uint32_t set, uint32_t binding, uint64_t size, VkShaderStageFlags stageFlags)
Create local buffer object in collection, and add it's set binding to descriptorsetlayout,...
DescriptorSetBuilder(const std::string &subPassName, Renderer *renderer)
Constructor Function.
std::shared_ptr< RendererSubPass > m_HandledSubPass
Handled Sub pass.
Definition Renderer.h:725
DescriptorSetBuilder & AddPushConstant(uint32_t size)
Set VkPushConstantRange by a specific push constant struct.
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
Definition Renderer.h:720
DescriptorSetBuilder & AddInput(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, const std::vector< std::string > &inputAttachmentNames)
Add the texture set binding to descriptor set layout.
DescriptorSetBuilder & AddAttachmentTexture(uint32_t set, uint32_t binding, VkShaderStageFlags stageFlags, const std::vector< std::string > &textureNames)
Add the attachment as texture to descriptor set layout.
This Class is a helper for Building Specific Renderer DescriptorSet. Only instanced during CreateDesc...
Definition Renderer.h:520
PipelineBuilder & SetBindingDescriptions(const std::vector< VkVertexInputBindingDescription > &inputs)
Set bindingDescriptions.
PipelineBuilder & NullAttributeDescriptions()
Set attributeDescriptions to NULL.
std::shared_ptr< RendererSubPass > m_HandledSubPass
Handled Sub pass.
Definition Renderer.h:883
std::shared_ptr< Material > m_Material
Referenced Material.
Definition Renderer.h:878
PipelineBuilder & SetPipelineLayout(VkPipelineLayout &layout)
Set pipelineLayout to given value.
void Build()
Build Pipeline.
PipelineBuilder & SetDefault()
Set PipelineConfigInfo to default value.
PipelineBuilder(std::shared_ptr< RendererSubPass > subPass, std::shared_ptr< Material > material, Renderer *renderer)
Constructor Function.
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
Definition Renderer.h:873
PipelineBuilder & SetAttributeDescriptions(const std::vector< VkVertexInputAttributeDescription > &inputs)
Set attributeDescriptions.
void BuildDeviceGeneratedCommand(const std::string &pipelineName, const std::string &materialName, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Build Raytracing Pipeline.
PipelineBuilder & NullBindingDescriptions()
Set bindingDescriptions to NULL.
PipelineConfigInfo m_pipelineConfig
PipelineConfigInfo for create Pipeline.
Definition Renderer.h:888
virtual ~PipelineBuilder()=default
Destructor Function.
PipelineBuilder & SetColorAttachments()
Set pAttachments to correct value.
void BuildCompute()
Build Compute Pipeline.
PipelineBuilder & SetCullMode(VkCullModeFlags cullMode)
Set cullMode to given value.
PipelineBuilder & SetSubPassIndex()
Set subpass to correct value.
void BuildRayTracing(const std::unordered_map< std::string, uint32_t > &hitGroups)
Build Raytracing Pipeline.
void BuildMesh()
Build Mesh Pipeline.
PipelineBuilder & SetRenderPass()
Set renderPass to correct value..
This Class is a helper for Building Specific Renderer Pipeline. Only instanced during CreatePipeline(...
Definition Renderer.h:750
VulkanRayTracing * m_VulkanRayTracing
Referenced VulkanRayTracing.
Definition Renderer.h:1730
virtual std::shared_ptr< RendererSubPass > & GetStatisticsRendererPass() override
Get RenderPass in statistics. @reutrn Return RenderPass.
virtual void BindDescriptorSetAsync(const DescriptorSetInfo &infos, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Binding DescriptorSet with DescriptorSetInfo Async. For Binding a Renderer DescriptorSet.
void TraceRays(const VkStridedDeviceAddressRegionKHR *rgenRegion, const VkStridedDeviceAddressRegionKHR *missRegion, const VkStridedDeviceAddressRegionKHR *hitRegion, const VkStridedDeviceAddressRegionKHR *callRegion) const
Call vkCmdTraceRaysKHR here.
virtual void EndRenderPass() override
End this Renderer's RenderPass.
virtual void BindDescriptorSet(const DescriptorSetInfo &infos, const std::string &name, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Binding DescriptorSet with DescriptorSetInfo and name. For Binding a Material DescriptorSet.
RayTracingRenderBehaveBuilder(Renderer *renderer, VulkanRayTracing *rayTracing, uint32_t currentFrame, uint32_t currentImage)
Constructor Function. Bind pipeline and all buffer type descriptor set.
void TraceRays() const
Call vkCmdTraceRaysKHR here.
virtual void BindPipeline(VkPipeline pipeline, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Bind the pipeline created by CreatePipeline(). Called on RenderBehaveBuilder instanced.
virtual void BindPipelineAsync(const std::string &materialName, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Bind the pipeline created by CreatePipeline() Async. Called on RenderBehaveBuilder instanced.
void TraceRaysAsync(const VkStridedDeviceAddressRegionKHR *rgenRegion, const VkStridedDeviceAddressRegionKHR *missRegion, const VkStridedDeviceAddressRegionKHR *hitRegion, const VkStridedDeviceAddressRegionKHR *callRegion) const
Call vkCmdTraceRaysKHR here Async.
virtual void BeginRenderPass() override
Begin this Renderer's RenderPass.
virtual void BeginNextSubPass(const std::string &subPassName) override
End a preview sub pass and stat next sub pass.
virtual void BindPipeline(const std::string &materialName, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Bind the pipeline created by CreatePipeline(). Called on RenderBehaveBuilder instanced.
virtual void BindDescriptorSet(const DescriptorSetInfo &infos, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Binding DescriptorSet with DescriptorSetInfo. For Binding a Renderer DescriptorSet.
virtual ~RayTracingRenderBehaveBuilder() override=default
Destructor Function.
virtual void BindDescriptorSetAsync(const DescriptorSetInfo &infos, const std::string &name, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) override
Binding DescriptorSet with DescriptorSetInfo and name Async. For Binding a Material DescriptorSet.
This class helps to bind pipeline and bind buffer. Specific for RayTracing Renderer....
Definition Renderer.h:1558
virtual void InternalBarriers(VkAccessFlags srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT, VkAccessFlags dstAccessMask=VK_ACCESS_SHADER_READ_BIT, VkPipelineStageFlags srcStageMask=VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VkPipelineStageFlags dstStageMask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Memory Barrier from this queue to this queue.
std::shared_ptr< VulkanDeviceGeneratedCommandsNV > m_HandledDGCData
Current subPass DGCData.
Definition Renderer.h:1549
virtual void AddBarriers(VkBuffer buffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Buffer Barrier from compute queue to this graphic queue.
virtual ~RenderBehaveBuilder()=default
Destructor Function.
virtual void BindDescriptorSetAsync(const DescriptorSetInfo &infos, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Binding DescriptorSet with DescriptorSetInfo Async. For Binding a Renderer DescriptorSet.
uint32_t m_CurrentFrame
Current frame index. Passed while this class instanced.
Definition Renderer.h:1522
virtual void ReleaseBarriers(VulkanImage *image, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Image Barrier from this graphic queue to compute queue.
virtual void BindDescriptorSet(const DescriptorSetInfo &infos, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Binding DescriptorSet with DescriptorSetInfo. For Binding a Renderer DescriptorSet.
virtual std::shared_ptr< RendererSubPass > & GetStatisticsRendererPass()
Get RenderPass in statistics. @reutrn Return RenderPass.
Definition Renderer.cpp:544
void BeginNextSubPassAsync(const std::string &subPassName)
End a preview sub pass and stat next sub pass.
Definition Renderer.cpp:818
uint32_t GetSubPassIndex() const
Get current subPass index in renderPass.
Definition Renderer.h:1507
virtual void BindPipeline(const std::string &materialName, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Bind the pipeline created by CreatePipeline(). Called on RenderBehaveBuilder instanced.
Definition Renderer.cpp:629
virtual void BindDescriptorSet(const DescriptorSetInfo &infos, const std::string &name, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Binding DescriptorSet with DescriptorSetInfo and name. For Binding a Material DescriptorSet.
virtual void InternalBarriers(VulkanImage *image, VkAccessFlags srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT, VkAccessFlags dstAccessMask=VK_ACCESS_SHADER_READ_BIT, VkPipelineStageFlags srcStageMask=VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VkPipelineStageFlags dstStageMask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Image Barrier from this queue to this queue.
virtual void BindDescriptorSetAsync(const DescriptorSetInfo &infos, const std::string &name, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Binding DescriptorSet with DescriptorSetInfo and name Async. For Binding a Material DescriptorSet.
void DrawFullScreenTriangleAsync() const
Draw a Triangle full screen Async.
void UpdatePushConstantAsync(void *data) const
Update local push constant buffer Async.
Definition Renderer.h:2602
std::shared_ptr< RendererSubPass > m_HandledSubPass
Handled Sub pass.
Definition Renderer.h:1544
virtual void BeginNextSubPass(const std::string &subPassName)
End a preview sub pass and stat next sub pass.
Definition Renderer.cpp:765
virtual void InternalBarriers(VkBuffer buffer, VkAccessFlags srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT, VkAccessFlags dstAccessMask=VK_ACCESS_SHADER_READ_BIT, VkPipelineStageFlags srcStageMask=VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VkPipelineStageFlags dstStageMask=VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Buffer Barrier from this queue to this queue.
void UpdatePushConstantAsync(F func)
Update local push constant buffer Async.
Definition Renderer.h:2503
void UpdateUniformBuffer(uint32_t set, uint32_t binding, void *data) const
Update a local buffer.
Definition Renderer.h:2624
void EndRecording() const
End recording all this behaveS does.
Definition Renderer.cpp:561
virtual void BindPipelineAsync(const std::string &materialName, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Bind the pipeline created by CreatePipeline() Async. Called on RenderBehaveBuilder instanced.
Definition Renderer.cpp:651
virtual void ReleaseBarriers(VkBuffer buffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Buffer Barrier from this graphic queue to compute queue.
uint32_t m_CurrentImage
Current frame index. Passed while this class instanced.
Definition Renderer.h:1529
void UpdateStorageBuffer(uint32_t set, uint32_t binding, void *data, uint64_t size=VK_WHOLE_SIZE, uint64_t offset=0) const
Update a local buffer.
Definition Renderer.h:2634
void UpdatePushConstant(void *data, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) const
Update local push constant buffer.
Definition Renderer.h:2581
void InternalRegionBarrier(VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) const
Add a memory Barrier.
uint32_t m_SubPassIndex
Current subPass Index.
Definition Renderer.h:1534
void PreprocessDGCAsync_NV() const
Preprocess Device Generated CommandsBuffer Async.
void InternalRegionBarrierAsync(VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask) const
Add a memory Barrier.
void DrawFullScreenTriangle(const VkCommandBuffer &cmdBuffer=VK_NULL_HANDLE) const
Draw a Triangle full screen.
void SetViewPortAsync() const
DynamicState Set Viewport and Scissor Async.
Definition Renderer.cpp:715
void Recording(const std::string &caption) const
Recording all this behaves does.
Definition Renderer.cpp:551
void UpdateStorageBuffer(uint32_t set, uint32_t binding, std::shared_ptr< VulkanBuffer > buffer) const
Update a local buffer.
Definition Renderer.h:2650
void UpdateAccelerationStructure(uint32_t set, uint32_t binding, const VkAccelerationStructureKHR &accel) const
Update AccelerationStructure in descriptorSet.
Definition Renderer.h:2665
void RunDGC(VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) const
Run DGC Buffer.
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
Definition Renderer.h:1515
virtual void BeginRenderPass()
Begin this Renderer's RenderPass.
Definition Renderer.cpp:840
void Await(std::function< void(const VkCommandBuffer &cmdBuffer)> func) const
Await Async Commands.
Definition Renderer.cpp:583
void Wait(std::future< VkCommandBuffer > &futureCmdBuffer) const
Wait for merge secondary commandBuffers.
Definition Renderer.cpp:600
void RunDGCAsync() const
Run DGC Buffer Async.
RenderBehaveBuilder(Renderer *renderer, uint32_t currentFrame, uint32_t currentImage)
Constructor Function. Bind pipeline and all buffer type descriptor set.
Definition Renderer.cpp:476
void ExecuteDGCAsync_NV() const
Execute Device Generated CommandsBuffer Async.
void UpdatePushConstant(F func, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Update local push constant buffer.
Definition Renderer.h:2471
void UpdateStorageBuffer(uint32_t set, uint32_t binding, F func)
Update a local buffer.
Definition Renderer.h:2559
VkCommandBuffer m_CommandBuffer
Current CommandBuffer.
Definition Renderer.h:1539
std::future< VkCommandBuffer > Async(std::function< void(const VkCommandBuffer &cmdBuffer)> func) const
Async Commands.
Definition Renderer.cpp:571
void BeginRenderPassAsync()
Begin this Renderer's RenderPass Async.
Definition Renderer.cpp:925
void SetViewPort(const VkCommandBuffer &cmdBuffer=VK_NULL_HANDLE) const
DynamicState Set Viewport and Scissor.
Definition Renderer.cpp:668
virtual void EndRenderPass()
End this Renderer's RenderPass.
Definition Renderer.cpp:981
void UpdateUniformBuffer(uint32_t set, uint32_t binding, F func)
Update a local buffer.
Definition Renderer.h:2537
void PreprocessDGC_NV(VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) const
Preprocess Device Generated CommandsBuffer.
virtual void BindPipeline(VkPipeline pipeline, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE, VkPipelineBindPoint bindPoint=VK_PIPELINE_BIND_POINT_GRAPHICS)
Bind the pipeline created by CreatePipeline(). Called on RenderBehaveBuilder instanced.
Definition Renderer.cpp:640
virtual void AddBarriers(VulkanImage *image, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex=VulkanRenderBackend::GetState().m_ComputeQueueFamily, uint32_t dstQueueFamilyIndex=VulkanRenderBackend::GetState().m_GraphicQueueFamily, VkCommandBuffer cmdBuffer=VK_NULL_HANDLE)
Add a Image Barrier from compute queue to this graphic queue.
void ExecuteDGC_NV(const VkCommandBuffer &cmdBuffer=VK_NULL_HANDLE) const
Execute Device Generated CommandsBuffer.
This class helps to bind pipeline and bind buffer. Only instanced during Render().
Definition Renderer.h:985
RendererPassBuilder & EndSubPass()
End recording a sub pass.
std::shared_ptr< RendererSubPass > m_HandledRendererSubPass
Handled Sub pass.
Definition Renderer.h:512
RendererPassBuilder & AddInputAttachment(const std::string &attachmentName, const TextureType &type, T func)
Add a input attachment.
virtual ~RendererPassBuilder()=default
Destructor Function.
void Build() const
Build the RendererPass.
RendererPassBuilder & AddColorAttachment(const std::string &attachmentName, const TextureType &type, T func)
Add a color attachment.
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
Definition Renderer.h:507
RendererPassBuilder & AddSubPass(const std::string &subPassName, Querier::StatisticsFlags flags=Querier::ALL)
Add a new SubPass to Renderer Pass.
RendererPassBuilder(const std::string &rendererPassName, Renderer *renderer)
Constructor Function.
std::string m_RendererPassName
RendererPass Name.
Definition Renderer.h:501
RendererPassBuilder & AddDepthAttachment(const std::string &attachmentName, const TextureType &type, T func)
Add a depth attachment.
RendererPassBuilder & AddSelfDependency(VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask)
Add subPass Self Dependency.
RendererPassBuilder & AddSwapChainAttachment(T func)
Add a swapchain image attachment.
This Class is a helper for Building RendererPass. Only instanced during CreateRendererPass().
Definition Renderer.h:392
std::string m_RendererName
Specific renderer name, Passed by instanced.
Definition Renderer.h:2017
void RegistryDGCPipeline(const std::string &materialName, const std::string &subPassName, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Registry dgc pipeline to Specific Renderer.
Definition Renderer.cpp:162
virtual void CreateRendererPass()=0
The interface is called during OnSystemInitialize(). Create specific render pass.
std::shared_ptr< VulkanDeviceGeneratedCommandsNV > FillIndirectRenderData(const std::string &subPassName, std::shared_ptr< std::vector< uint32_t > > view)
Fill in World RenderAble data to IndirectBuffer.
Definition Renderer.h:2058
void IterStatistics(F &&func)
Iterator the specific RenderPass Statistics in Renderer.
Definition Renderer.h:2451
std::shared_ptr< RendererPass > m_Pass
RendererPass.
Definition Renderer.h:2012
std::shared_ptr< VulkanDescriptorPool > m_DescriptorPool
This variable is passed while renderer instanced.
Definition Renderer.h:1997
virtual void CreateDeviceGeneratedCommandsLayout()
This interface is called during OnSystemInitialize(). Create Device Generated Commands Layout.
Definition Renderer.h:226
void RegistryMaterial(const std::string &materialName, const std::string &subPassName)
Registry material to Specific Renderer.
Definition Renderer.cpp:96
std::shared_ptr< RendererPass > & GetPasses()
Get RendererPass.
Definition Renderer.h:187
bool m_IsActive
Whether this renderer is active(submit commands in RendererBehaveBuilder).
Definition Renderer.h:2037
virtual void OnSlateResize()
Definition Renderer.cpp:66
virtual void Render(TimeStep &ts, FrameInfo &frameInfo)=0
The interface is called every frame. Defines what data needs to be renderer and how to render.
virtual ~Renderer()=default
Destructor Function. We destroy pipeline layout and free descriptors that holed by this renderer here...
virtual void OnMeshAddedWorld()
Definition Renderer.cpp:86
std::shared_ptr< Material > GetDefaultMaterial(const std::string &subPassName) const
Get default material using sub pass Name.
Definition Renderer.cpp:220
std::future< VkCommandBuffer > SubmitCmdsParallel(VkCommandBuffer primaryCmdBuffer, uint32_t subPass, F &&func)
Submit a group of commands to secondary command buffer, and execute all of them.
Definition Renderer.h:2273
scl::thread_unordered_map< std::string, std::shared_ptr< VulkanPipeline > > m_Pipelines
Renderer stored material pipelines.
Definition Renderer.h:2022
void GetDirectionalLightMatrix(FrameInfo &frameInfo, std::array< glm::mat4, MAX_DIRECTIONALLIGHT_NUM > &directionalLight)
Definition Renderer.cpp:400
void CreateDefaultMaterial()
Create Specific Renderer Default Material.
Definition Renderer.cpp:233
VkPipelineLayout CreatePipelineLayout(const std::vector< VkDescriptorSetLayout > &rowSetLayouts, const std::shared_ptr< RendererSubPass > &subPass) const
Create Pipeline Layout with material's descriptorset and renderer's descriptor set.
Definition Renderer.cpp:271
void IterWorldCompWithBreak(FrameInfo &frameInfo, F func)
Iterator the specific Component in World With break.
Definition Renderer.h:2332
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
void IterWorldCompWithRange(FrameInfo &frameInfo, const std::vector< uint32_t > &ranges, uint32_t floor, uint32_t ceil, F func)
Iterator the specific Component in World With range.
Definition Renderer.h:2380
bool m_IsLoadDefaultMaterial
Whether should load a default renderer material.
Definition Renderer.h:2032
std::shared_ptr< std::vector< uint32_t > > GetEntityWithComponent(World *world)
Get entities with component in world.
Definition Renderer.h:2256
std::shared_ptr< RendererCache > m_RenderCache
RendererCache.
Definition Renderer.h:2047
virtual void CreateDescriptorSet()=0
This interface is called during OnSystemInitialize(). Create all sub pass descriptorSet.
void IterWorldComp(FrameInfo &frameInfo, F func)
Iterator the specific Component in World.
Definition Renderer.h:2308
void IterWorldCompWithRange(FrameInfo &frameInfo, const std::vector< uint32_t > &ranges, F func)
Iterator the specific Component in World With range.
Definition Renderer.h:2355
std::shared_ptr< RendererResourcePool > m_RendererResourcePool
RendererResourcePool, Passed by instanced.
Definition Renderer.h:2007
void IterWorldCompWithBreakWithRange(FrameInfo &frameInfo, const std::vector< uint32_t > &ranges, uint32_t floor, uint32_t ceil, F func)
Iterator the specific Component in World With break With range.
Definition Renderer.h:2428
static std::shared_ptr< scl::behave_state_list< void, Renderer::RenderBehaveBuilder *, VkCommandBuffer > > m_StatisticsStateList
Statistics StateList.
Definition Renderer.h:1985
virtual void OnWindowResizeOver()
This interface is called on Window resized over (registry by swapchain). If the specific renderer use...
Definition Renderer.h:128
virtual void CreateDeviceGeneratedCommandsPipeline(const std::string &pipelineName, const std::string &materialName, VkPipelineLayout &layout, std::shared_ptr< RendererSubPass > subPass, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Create device generated command Pipeline.
Definition Renderer.h:270
DescriptorSetManager::DescriptorSetCombineFlags m_DescriptorSetCombine
Combination of DescriptorSet.
Definition Renderer.h:2027
Renderer(const Renderer &)=delete
Copy Constructor Function.
virtual void CreatePipeline(std::shared_ptr< Material > material, VkPipelineLayout &layout, std::shared_ptr< RendererSubPass > subPass)=0
Create Specific Material Pipeline.
std::tuple< glm::mat4, glm::mat4, unsigned int, float > GetActiveCameraMatrix(FrameInfo &frameInfo)
Get The activated camera entity's view matrix and projection matrix.
Definition Renderer.cpp:304
virtual void OnSystemInitialize()
This interface is called on render system is registered. Initialize the specific renderer's pipeline,...
Definition Renderer.cpp:38
std::shared_ptr< VulkanDevice > m_Device
VulkanDevice , Passed by instanced.
Definition Renderer.h:2002
void ResetRendererState()
Reset Renderer State to disActive.
Definition Renderer.h:206
void IterWorldCompWithBreakWithRange(FrameInfo &frameInfo, const std::vector< uint32_t > &ranges, F func)
Iterator the specific Component in World With break With range.
Definition Renderer.h:2405
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
Definition Renderer.h:1992
std::unordered_map< std::string, std::shared_ptr< VulkanDeviceGeneratedCommandsNV > > m_DGCData
Data of dgc DGC Draw.
Definition Renderer.h:2042
void GetDirectionalLight(FrameInfo &frameInfo, std::array< SpicesShader::DirectionalLight, SpicesShader::DIRECTIONALLIGHT_BUFFER_MAXNUM > &dLightBuffer)
Get DirectionalLightComponent's render data in World.
Definition Renderer.cpp:371
void GetPointLight(FrameInfo &frameInfo, std::array< SpicesShader::PointLight, SpicesShader::POINTLIGHT_BUFFER_MAXNUM > &pLightBuffer)
Get PointLightComponent's render data in World.
Definition Renderer.cpp:445
void CreateDGCMaterial(const std::string &subPass, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Create Specific Renderer DGC Material.
Definition Renderer.cpp:258
Renderer & operator=(const Renderer &)=delete
Copy Assignment Operation.
Renderer Class. This class defines the basic behaves of renderer. When we add an new Renderer,...
Definition Renderer.h:57
ResourceSystem Class. Handles resource load/unload event.
SlateImage(const std::string &textureName, const std::string &materialName)
Constructor Function.
void ReBuildMaterial()
Rebuild this Material.
std::shared_ptr< Material > m_Material
This Slate image draw material.
Definition SlateImage.h:65
virtual ~SlateImage()
Destructor Function.
std::string m_TextureName
Texture name.
Definition SlateImage.h:70
std::shared_ptr< Material > GetMaterial()
Get this Material.
Definition SlateImage.h:53
ImTextureID GetTextureID()
Get this TextureID.
Definition SlateImage.h:47
void ReBuildTextureID()
Rebuild this ImTextureID.
ImTextureID m_TextureID
ImTextureID.
Definition SlateImage.h:60
std::string m_MaterialName
Material name.
Definition SlateImage.h:75
Slate image draw context.
Definition SlateImage.h:18
This Class defines InfoBar instance.
std::shared_ptr< ImguiSlate > GetSlate(const std::string &name)
Get Slate by name.
std::unordered_map< std::string, std::shared_ptr< ImguiSlate > > m_SlatesRenderContainer
The container of all slate handle.
std::shared_ptr< ImguiViewport > GetViewPort()
virtual ~SlateRegister()=default
Destructor Function.
void OnEvent(Event &event)
This function will be called on global Event function pointer is called.
std::unordered_map< std::string, std::shared_ptr< ImguiSlate > > m_SlatesEventContainer
The container of all slate handle.
void OnRender() const
This function is called on SlateRenderer::Render.
void OnUpdate(TimeStep &ts) const
SlateRegister & operator=(const SlateRegister &)=delete
Copy Assignment Operation.
SlateRegister()=default
Constructor Function.
std::shared_ptr< T > Register(bool isPrimary, const std::string &panelName, Args &&... args)
This function registry slate instance.
SlateRegister(const SlateRegister &)=delete
Copy Constructor Function.
This Class is the manager of all slate, it keeps all slate handle.
This Class is inherited from Event Class. Called by Viewport Resize.
Definition SlateEvent.h:18
virtual ~SlateSystem() override
Destructor Function.
static std::shared_ptr< SlateRegister > m_SlateRegister
The slate register.
Definition SlateSystem.h:74
static std::shared_ptr< SlateRegister > GetRegister()
Get slate register.
Definition SlateSystem.h:67
virtual void OnSystemInitialize() override
This interface defines the behaves on specific system initialized. Called when system Pushed to Syste...
SlateSystem(const std::string &systemName)
Constructor Function. Init class variable. Usually call it.
Definition SlateSystem.h:30
virtual void OnSystemShutDown() override
This interface defines the behaves on specific system shutdown. Called when system popped from System...
virtual void OnEvent(Event &event) override
This interface defines the behaves on global event function pointer is called.
virtual void OnSystemUpdate(TimeStep &ts) override
This interface defines the behaves on specific system updated every frame.
SlateSystem Class. This class defines the specific behaves of SlateSystem.
Definition SlateSystem.h:21
SystemManager()
Constructor Function.
static SystemManager & Get()
Get Static SystemManager.
SystemManager & PopSystem(const std::string &systemName)
Push a system to this manager.
SystemManager Class. This class defines the behave of SystemManager.
System(const std::string &systemName)
Constructor Function. Init class variable. Usually call it.
System Class. This class defines the basic behaves of System. When we create an new System,...
Texture2DArray(const RendererResourceCreateInfo &info)
Constructor Function. Used for create render resource.
virtual ~Texture2DArray() override=default
Destructor Function.
Texture2DArray(const std::string &path)
Constructor Function. Init class variable, load date immediately. Usually call it.
Texture2DArray()
Constructor Function.
Texture2D Class. This class defines the basic behaves of Texture2DArray.
virtual ~Texture2DCube() override=default
Destructor Function.
Texture2DCube(const RendererResourceCreateInfo &info)
Constructor Function. Used for create render resource.
Texture2DCube(const std::string &path)
Constructor Function. Init class variable, load date immediately. Usually call it.
Texture2DCube()
Constructor Function.
Texture2DCube Class. This class defines the basic behaves of Texture2DCube.
Texture2D Class. This class defines the basic behaves of texture2D.
Definition Texture2D.h:20
TextureLoader Class. This class only defines static function for load data from image file.
void Flush()
Refresh time in each engine loop.
Definition TimeStep.cpp:26
const uint64_t & fs() const
Get frames count.
Definition TimeStep.h:63
This Class handles our engine time step during frames. Global Unique.
Definition TimeStep.h:22
Transcoder of Texture Container format and Transform format and GPU compress format.
Definition Transcoder.h:17
TransformComponent Class. This class defines the specific behaves of TransformComponent.
This Class is a Wrapper of VulkanBuffer.
virtual ~VulkanCommandBuffer() override=default
Destructor Function. VkCommandBuffer is created by VkCommandPool, we do not need destroy it here manu...
VulkanCommandBuffer(VulkanState &vulkanState)
Constructor Function. Create VkCommandBuffer.
static void CustomGraphicCmd(VulkanState &vulkanState, T func)
Create a new command buffer and record custom cmd, submit to graphic queue, execute it immediately.
VulkanCommandBuffer Class. This class defines the VulkanCommandBuffer behaves. This class is just a w...
int m_GraphicThreadId
Thread Unique Graphic ThreadId.
int m_ComputeThreadId
Thread Unique Compute ThreadId.
static VulkanCommandPoolThreadWrapper & GetInst()
Get this instance.
virtual ~VulkanCommandPoolThreadWrapper()
Destructor Function.
VulkanCommandPoolThreadWrapper()
Constructor Function.
Wrapper of Instance/Delete VkCommandPool in thread.
static std::vector< VkCommandPool > m_ThreadGraphicCommandPool
Thread Graphic VkCommandPool map.
static VkCommandPool & GetThreadComputeCommandPool()
Get Thread Compute VkCommandPool by thread id.
static bool m_IsPoolActive
True if this Pool is actived.
VulkanCommandPool(VulkanState &vulkanState)
Constructor Function. Create VkCommandPool.
virtual ~VulkanCommandPool() override
Destructor Function.
static std::mutex m_ComputeCommandPoolMutex
Mutex for GraphicCommandPool.
static VkCommandPool & GetThreadGraphicCommandPool()
Get Thread Graphic VkCommandPool by thread id.
static std::mutex m_GraphicCommandPoolMutex
Mutex for GraphicCommandPool.
static std::vector< VkCommandPool > m_ThreadComputeCommandPool
Thread Compute VkCommandPool map.
VulkanCommandPool Class. This class defines the VulkanCommandPool behaves. This class is just a wrapp...
VulkanDescriptorPool Class. This class is the wrapper of VkDescriptorPool.
VulkanDeviceGeneratedCommandsNV Class. This class defines the VulkanDeviceGeneratedCommandsNV behaves...
VkSampleCountFlagBits GetMaxUsableSampleCount() const
Get device's max usable sample count.
bool IsQueueMeetDemand(const VkPhysicalDevice &device, const VkSurfaceKHR &surface)
Check all Queue we need meet;.
static SwapChainSupportDetails QuerySwapChainSupport(const VkPhysicalDevice &device, const VkSurfaceKHR &surface, GLFWwindow *window)
Query physical device's SwapChainSupport.
const SwapChainSupportDetails & GetSwapChainSupport()
Get SwapChain Utils.
static VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV & GetDGCProperties()
Get DeviceGeneratedCommandsPropertiesNV.
QueueHelper m_QueueHelper
QueueHelper.
static VkPhysicalDeviceFeatures m_DeviceFeatures
Selected Physical Device Features.
static VkPhysicalDeviceProperties & GetDeviceProperties()
Get VkPhysicalDeviceProperties.
virtual ~VulkanDevice() override
Destructor Function.
static VkPhysicalDeviceRayTracingPipelinePropertiesKHR m_RayTracingProperties
Device RayTracing Properties.
static VkPhysicalDeviceFeatures & GetDeviceFeatures()
Get VkPhysicalDeviceFeatures.
bool IsPropertyMeetDemand(const VkPhysicalDevice &device)
Check all Property we need meet.
static VkPhysicalDeviceRayTracingPipelinePropertiesKHR & GetRTPipelineProperties()
Get RayTracingPipelineProperties.
bool IsFeatureMeetDemand(const VkPhysicalDevice &device)
Check all Feature we need meet.
void GetExtensionRequirements()
Get all physical device extension requirements our engine needed. Source 1 : user Setting.
static VkPhysicalDeviceProperties m_DeviceProperties
Selected Physical Device Properties.
static VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV m_DGCProperties
Device DGC Properties.
VulkanDevice(VulkanState &vulkanState)
Constructor Function. Create vkDevice.
bool SelectPhysicalDevice(const VkInstance &instance, const VkSurfaceKHR &surface, GLFWwindow *window)
select a suitable physical device.
SwapChainSupportDetails m_SwapChainSupportDetails
SwapChainSupportDetails.
bool IsExtensionMeetDemand(const VkPhysicalDevice &device)
Check all Extension we need meet;.
std::vector< const char * > m_ExtensionProperties
Device Extension Properties.
void RequerySwapChainSupport()
Requery device's SwapChainSupportDetails. Mainly VkExtent2D.
const QueueHelper & GetQueueHelper() const
Get QueueHelper variable.
VulkanInstance Class. This class defines the VulkanDevice behave. This class is just a wrapper of vkd...
VkImage & GetImage()
Definition VulkanImage.h:86
VkImageType m_ImageType
Image Type.
void CopyImageToMemoryHost(const std::vector< VkImageToMemoryCopyEXT > &copies) const
int m_Width
Image width.
VkFormat m_Format
The image format.
bool IsHostCopyable() const
Check if this image format can copy from host to gpu directly.
static bool IsHostCopyable(VulkanState &state, VkFormat format)
Check if this image format can copy from host to gpu directly.
uint32_t GetWidth() const
Get this Width.
VkDescriptorSet & GetDescriptorSet()
Get VkDescriptorSet.
void CreateDescriptorSet(uint32_t binding)
Create DescriptorSet with single image.
VmaAllocation m_Alloc
VMA allocation.
void CopyImageToMemoryHost(void *data) const
VkDescriptorImageInfo * GetImageInfo(VkImageLayout imageLayout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, uint32_t mipLevel=0)
void CopyMemoryToImageHost(const void *data) const
Copy the Memory's data to this VkImage.
void CreateSampler()
Create a Sampler.
void CopyImageToBuffer(VkBuffer dstBuffer, const std::vector< VkBufferImageCopy > &regions)
void CopyImageTexelToBuffer(uint32_t x, uint32_t y, void *out_rgba)
VkDescriptorSetLayout m_DescriptorSetLayout
VkDescriptorSetLayout.
void CreateImage(VulkanState &vulkanState, const std::string &name, VkImageType type, uint32_t width, uint32_t height, uint32_t layers, VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkMemoryPropertyFlags properties, uint32_t mipLevels)
void DestroyDescriptorSetLayout() const
Destroy the DescriptorSetLayout if Created a DescriptorSet.
VkDeviceMemory m_ImageMemory
The image video memory.
void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height, const std::vector< VkBufferImageCopy > &regions) const
Copy the Buffer's data to this VkImage. Used to create image data (include mipmaps),...
uint32_t GetMipLevels() const
Get this MipLevels.
void CopyMemoryToImageHost(const std::vector< VkMemoryToImageCopyEXT > &copies) const
Copy the Memory's data to this VkImage. Used to create image data (include mipmaps),...
VkSampler m_TextureSampler
The image sampler.
bool m_IsCreateSet
True if Called Create DescriptorSet.
virtual ~VulkanImage() override
Destructor Function.
VulkanImage(VulkanState &vulkanState, const std::string &name, VkImageType type, uint32_t width, uint32_t height, uint32_t layers, VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkMemoryPropertyFlags properties, uint32_t mipLevels)
uint32_t m_MipLevels
Image mipmaps num.
void CreateImageView(VkFormat format, VkImageViewType viewType, VkImageAspectFlags aspectFlags, bool isCreateMipmapView=false)
Create Image View.
int m_Height
Image height.
void Barrier(VkCommandBuffer commandBuffer, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t srcQueueFamilyIndex, uint32_t dstQueueFamilyIndex) const
Wrapper of Call vkCmdImageBarrier.
VkDescriptorImageInfo m_ImageInfo
VkDescriptorImageInfo.
VkDescriptorSet m_DescriptorSet
VkDescriptorSet.
void TransitionImageLayout(VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout)
void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height) const
Copy the Buffer's data to this VkImage.
VkImageView & GetView(uint32_t mipLevel=0)
Definition VulkanImage.h:80
uint32_t GetLayers() const
Get this Layers.
Definition VulkanImage.h:92
std::vector< VkImageView > m_ImageViews
The image view.
VulkanImage(VulkanState &vulkanState)
Constructor Function. Init class variable. Init a empty VulkanImage, used in TextureLoad.
Definition VulkanImage.h:29
uint32_t GetHeight() const
Get this Height.
Definition VulkanImage.h:98
VkImage m_Image
The VkImage this Class Wrapped.
uint32_t m_Layers
Image layer(texture cube: 6).
VkFormat GetFormat() const
Get this Format.
void GenerateMipmaps(VkFormat imageFormat, int32_t texWidth, int32_t texHeight) const
Generate mipmaps with the VkImage.
void SetVulkanDebugCallbackFuncPointer()
Set Vulkan's debug message callback function pointer. Working with DEBUG mode.
virtual ~VulkanInstance() override
Destructor Function.
VkDebugUtilsMessengerCreateInfoEXT m_DebugMessengerCreateInfo
Debug Utils Messages used to execute message callback function. Also debug vkInstance create.
void CreateVulkanSurface() const
Create a Surface Object.
std::vector< const char * > m_LayerProperties
Instance Layer Properties.
VulkanInstance(VulkanState &vulkanState, const std::string &name, const std::string &engineName)
Constructor Function. Create vkInstance and vkSurface.
std::vector< const char * > m_ExtensionProperties
Instance Extension Properties.
bool CheckExtensionRequirementsSatisfied()
Iter all our extensions, check whether all satisfied or not.
VkDebugUtilsMessengerEXT m_DebugMessenger
Parameter for Create/Destroy DebugUtilsMessengerEXT.
void FillDebugMessengerCreateInfo()
Set m_DebugMessengerCreateInfo variable.
void GetExtensionRequirements()
Get all instance extension requirements our engine needed. Source 1 : glfw requirements....
bool ChecklayerRequirementsSatisfied()
Iter all our layers, check whether all satisfied or not.
void GetLayerRequirements()
Get all instance layer requirements our engine needed. Source 1 : user Setting.
VulkanInstance Class. This class defines the VulkanInstance behaves. This class is just a wrapper of ...
virtual ~VulkanMemoryAllocator() override
Destructor Function.
VulkanMemoryAllocator(VulkanState &vulkanState)
Constructor Function. Create Specific ThreadPool.
VulkanObject(VulkanState &vulkanState)
Constructor Function. Init member variables.
VulkanObject Class. This class defines the basic behaves of VulkanObject. When we create an new Vulka...
This class is a wrapper of VkPipelineLayout and VkPipeline.
void EndFrame(FrameInfo &frameInfo)
End record the frame with vulkan render backend.
void RecreateSwapChain()
Called OnSlateResize.
std::shared_ptr< VulkanMemoryAllocator > m_VmaAllocator
VulkanMemoryAllocator.
std::unique_ptr< VulkanSwapChain > m_VulkanSwapChain
VulkanSwapChain.
virtual ~VulkanRenderBackend()
Destructor Function.
std::unique_ptr< VulkanCommandPool > m_VulkanCommandPool
VulkanCommandPool.
VulkanRenderBackend()
Constructor Function.
static std::shared_ptr< VulkanDescriptorPool > GetDescriptorPool()
Get DescriptorPool in use.
static VulkanState m_VulkanState
The VulkanState in use.
std::unique_ptr< VulkanCommandBuffer > m_VulkanCommandBuffer
VulkanCommandBuffer.
bool isWindowClosed()
Determine whether window is closed.
static std::shared_ptr< VulkanDescriptorPool > m_VulkanDescriptorPool
The VulkanDescriptorPool in use.
static std::shared_ptr< RendererResourcePool > m_RendererResourcePool
The RendererResourcePool in use.
static VulkanState & GetState()
Get VulkanState in use.
std::unique_ptr< VulkanWindows > m_VulkanWindows
VulkanWindows.
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.
static std::shared_ptr< RendererResourcePool > GetRendererResourcePool()
Get RendererResourcePool in use.
void BeginFrame(FrameInfo &frameInfo)
Start record a new frame with vulkan render backend.
VulkanRenderBackend & operator=(const VulkanRenderBackend &)=delete
Copy Assignment Operation.
bool OnWindowResizeOver(WindowResizeOverEvent &event)
This function is called on window is resized over.
std::shared_ptr< VulkanDevice > m_VulkanDevice
VulkanDevice.
std::unique_ptr< VulkanInstance > m_VulkanInstance
VulkanInstance.
bool OnSlateResize(SlateResizeEvent &event)
This function is called on viewport is resized.
VulkanRenderBackend(const VulkanRenderBackend &)=delete
Copy Constructor Function.
This class defines the render backend behaves of Vulkan.
virtual ~VulkanRenderPass() override
Destructor Function.
VkRenderPass m_RenderPass
The RenderPass this class mainly manage.
VulkanRenderPass(VulkanState &vulkanState, const std::string &passName, std::shared_ptr< VulkanDevice > vulkanDevice, VkRenderPassCreateInfo &createInfo, std::vector< VkImageView > &imageViews, uint32_t layers, bool isUseSwapChianImage)
Constructor Function. Create VkRenderPass and VkFramebuffer.
VkFramebuffer & GetFramebuffer(uint32_t index)
Get Framebuffer by index.
std::array< VkFramebuffer, MaxFrameInFlight > m_SwapChainFramebuffers
The FrameBuffers.
std::shared_ptr< VulkanDevice > m_VulkanDevice
The shared pointer of VulkanDevice.
VkRenderPass & Get()
Get VkRenderPass.
VulkanRenderPass Class. This class defines the VulkanRenderPass behaves. This class is just a wrapper...
VulkanSwapChain(VulkanState &vulkanState, std::shared_ptr< VulkanDevice > vulkanDevice)
Constructor Function. Create vkInstance and vkSurface.
void DestroySyncObjects() const
Destroy Sync Objects.
static VkFormat FindDepthFormat(const VkPhysicalDevice &physicalDevice)
Check whether Depth Image's Format is supported by physical device.
void Destroy() const
Destroy this.
std::shared_ptr< VulkanDevice > m_VulkanDevice
The shared pointer of VulkanDevice.
void Create() const
Create this.
static VkFormat findSupportedFormat(const VkPhysicalDevice &physicalDevice, const std::vector< VkFormat > &candidates, VkImageTiling tiling, VkFormatFeatureFlags features)
Check whether specific formats is supported by physical device.
virtual ~VulkanSwapChain() override
Destructor Function.
void CreateSyncObjects() const
Create Sync Objects.
VulkanSwapChain Class. This class defines the VulkanSwapChain behaves. This class is just a wrapper o...
static void Destroy()
Destroy all ThreadQueue.
static scl::thread_queue< std::shared_ptr< VulkanThreadQueue > > m_ComputeQueues
Compute VulkanThreadQueue.
static void CreateGraphic(VulkanState &vulkanState, VkQueue queue)
Create Graphic VulkanThreadQueue.
VkQueue m_Queue
This Thread VkQueue.
void Submit(VkCommandBuffer commandBuffer) const
Submit the CommandBuffer in this Queue.
void Wait() const
Wait for queue execute.
static void PushToGraphic(std::shared_ptr< VulkanThreadQueue > &queue)
Push queue to Graphic ThreadQueue.
static std::shared_ptr< VulkanThreadQueue > FetchGraphicQueue()
Fetch valid Graphic Queue.
static std::shared_ptr< VulkanThreadQueue > FetchComputeQueue()
Fetch valid Compute Queue.
static void CreateCompute(VulkanState &vulkanState, VkQueue queue)
Create Compute VulkanThreadQueue.
virtual ~VulkanThreadQueue() override
Destructor Function.
static void PushToCompute(std::shared_ptr< VulkanThreadQueue > &queue)
Push queue to Compute ThreadQueue.
static scl::thread_queue< std::shared_ptr< VulkanThreadQueue > > m_GraphicQueues
Graphic VulkanThreadQueue.
VulkanThreadQueue(VulkanState &vulkanState, VkQueue queue)
Constructor Function.
VulkanThreadQueue Class. This class is a wrapper of Thread VkQueue.
VulkanWindows(VulkanState &vulkanState, const WindowInfo &initInfo)
Constructor Function. Create Windows.
bool m_WindowsResized
True if viewPort is resized.
virtual ~VulkanWindows() override
Destructor Function.
void SetInternalCallBack() const
Set all needed GLFW events call back.
void SetResized(bool isResized)
Set m_WindowsResized variable.
WindowInfo m_WindowInfo
Window's info. not viewport's info.
bool IsResized() const
Get m_WindowsResized variable.
VulkanWindows Class. This class defines the windows behaves.
virtual ~WorldEvent() override=default
Destructor Function.
WorldEvent()=default
Constructor Function.
This Class is inherited from Event Class. Inherit from it and create specific KeyEvent class....
Definition WorldEvent.h:20
World Class. This class defines the basic behaves of World. When we create an new world,...
Definition World.h:41
behave_state_node< Ret, Args... > * AddNode()
Add a empty node to this list.
virtual ~behave_state_list()=default
Destructor Function.
behave_state_list()
Constructor Function.
uint32_t m_CurrentState
current state.
void SetState(uint32_t state)
Set Current State.
std::vector< std::unique_ptr< behave_state_node< Ret, Args... > > > m_List
Linear Node list.
behave_state_node< Ret, Args... > * GetState() const
Get current state node.
void IncreateState()
Current State move forward.
void ResetState()
Current State move to start.
behave_state_list. wrapper of combing all state behaves.
std::unordered_map< std::string, std::function< Ret(Args...)> > m_Behavies
Function behaves map.
void ExecuteBehave(const std::string &name, Args... args)
Execute a behave in this state.
behave_state_node()=default
Constructor Function.
virtual ~behave_state_node()=default
Destructor Function.
void PushBehave(const std::string &name, const std::function< Ret(Args...)> &fn)
Push a behave to this state.
behave_state_list single node. defines behaves in single state.
The container combines hashmap and list together. Used in the case that we want iter a hashmap in ord...
void Push(T &&item)
Push a item to this queue.
Definition ThreadQueue.h:77
std::mutex m_Mutex
Mutex of this queue.
Definition ThreadQueue.h:58
thread_queue()
Constructor Function.
Definition ThreadQueue.h:23
T Pop()
Pop a item from this queue.
Definition ThreadQueue.h:88
void Clear()
Clear this queue.
std::atomic_int m_Count
Count of tasks.
Definition ThreadQueue.h:68
std::condition_variable m_NotEmpty
Not empty condition.
Definition ThreadQueue.h:63
bool IsEmpty() const
Is this queue is empty. @reutrn Returns true if empty.
Definition ThreadQueue.h:46
virtual ~thread_queue()=default
Destructor Function.
std::queue< T > m_Queue
This wrapped queue.
Definition ThreadQueue.h:73
Thread safe Queue.
Definition ThreadQueue.h:17
Thread safe unordered_map.
TextureType
The enum of all Texture Type.
Definition Texture.h:20
VMAMemoryPropertyFlagExtendBits
Map to VmaAllocationCreateFlagBits while use VMA for memory create.
@ VMA_MEMORY_PROPERTY_DEDICATED_MEMORY_BIT
VkMemoryPropertyFlagBits.
@ EventCategoryWorld
Definition Event.h:68
@ MeshAdded
World Event.
static constexpr int NThreadQueue
Thread Queue Count.
RendererType
Definition FrameInfo.h:22
This struct included all infos usd to create a VkPipeline.
std::optional< uint32_t > graphicqueuefamily
The graphic queue's in used identify.
std::optional< uint32_t > presentqueuefamily
The present queue's in used identify.
std::optional< uint32_t > transferqueuefamily
The transfer queue's in used identify.
std::optional< uint32_t > computequeuefamily
The compute queue's in used identify.
bool isComplete() const
Whether all queues that we need is valid.
This struct contains all queues's identify we need.
virtual ~RendererResourceCreateInfo()=default
Destructor Function.
uint32_t height
Texture' height..
uint32_t mipLevel
Texture's mipmap level.
RendererResourceCreateInfo()=default
Constructor Function.
uint32_t layer
Texture's layer(1 for Texture2D, 6 for TextureCube, any for TextureArray).
VkAttachmentDescription description
Texture's description info.
bool isDepthResource
True if this resource is a DepthResource.
TextureType type
Texture's Class Type.
RendererResourceCreateInfo(const std::string &name)
Constructor Function.
float sizeScale
Texture's size scale.
VkImageUsageFlagBits usage
Image Usage.
bool isResizeable
True if this resource needs resize(sync with viewport's size).
std::string name
Texture's name.
This struct defines the data used to create a texture2d. From render pass.
double string
Definition Math.h:63
VkExtent2D surfaceSize
The VkSurface Size.
std::vector< VkSurfaceFormatKHR > formats
All supported VkSurfaceFormatKHR.
VkSurfaceFormatKHR format
The selected VkSurfaceFormatKHR.
VkSurfaceCapabilitiesKHR capabilities
VkSurfaceCapabilitiesKHR.
VkPresentModeKHR presentMode
The selected VkPresentModeKHR.
VkExtent2D viewPortSize
The ViewPort Size. Init value. Reset by resize event.
std::vector< VkPresentModeKHR > presentModes
All supported VkPresentModeKHR.
SwapChain Utils. Queried from device.
uint32_t m_ComputeQueueFamily
uint32_t m_GraphicQueueFamily
This struct contains all Vulkan object in used global.
Definition VulkanUtils.h:74
GLFWimage image
GLFWimage.
WindowIcon(const std::string &iconPath)
Constructor Function. Load the icon file immediately.
virtual ~WindowIcon()
Destructor Function.
This struct helps load the icon of window.
std::shared_ptr< WindowIcon > icon
Window's icon.
std::string name
Window's name.
int width
Window's width.
int height
Window's height.
This struct defines the basic information of window.