SpiecsEngine
 
Loading...
Searching...
No Matches
Renderer.cpp
Go to the documentation of this file.
1/**
2* @file Renderer.cpp
3* @brief The Renderer Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
8#include "Renderer.h"
9#include "Systems/SlateSystem.h"
10#include "Resources/ResourcePool/ResourcePool.h"
11#include "Render/Vulkan/VulkanRenderBackend.h"
12
13namespace Spices {
14
16 (
17 const std::string& rendererName ,
18 VulkanState& vulkanState ,
19 const std::shared_ptr<VulkanDescriptorPool>& DescriptorPool ,
20 const std::shared_ptr<VulkanDevice>& device ,
21 const std::shared_ptr<RendererResourcePool>& rendererResourcePool ,
22 bool isLoadDefaultMaterial
23 )
24 : m_VulkanState (vulkanState )
26 , m_Device (device )
28 , m_RendererName (rendererName )
29 , m_IsLoadDefaultMaterial (isLoadDefaultMaterial )
30 , m_IsActive (false)
32 {
34
35 m_RenderCache = std::make_shared<RendererCache>();
36 }
37
39 {
41
42 /**
43 * @brief Create renderpass.
44 */
46
47 /**
48 * @brief Create specific renderer descriptorset.
49 */
51
52 /**
53 * @brief Create specific renderer default material.
54 */
56 {
58 }
59
60 /**
61 * @brief Create Device Generated Commands Layout.
62 */
64 }
65
67 {
69
70 /**
71 * @brief Clear unused caches.
72 */
73 m_RenderCache->ClearCaches();
74
75 /**
76 * @brief Recreate RenderPass.
77 */
79
80 /**
81 * @brief Create descriptorSet again.
82 */
84 }
85
87 {
89
90 /**
91 * @brief Clear unused caches.
92 */
93 m_RenderCache->ClearCaches();
94 }
95
96 void Renderer::RegistryMaterial(const std::string& materialName, const std::string& subPassName)
97 {
99
100 /**
101 * @brief Instance a temp empty map for VkDescriptorSetLayout.
102 * Before turn it to a continus container, sorted is required.
103 */
104 std::map<uint32_t, VkDescriptorSetLayout> sortedRowSetLayouts;
105
106 /**
107 * @brief PreRenderer's DescriptorSetInfo.
108 */
110 {
111 const auto preRendererSetInfo = DescriptorSetManager::GetByName("PreRenderer");
112 for (auto& pair : preRendererSetInfo)
113 {
114 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
115 }
116 }
117
118 /**
119 * @brief SpecificRenderer's DescriptorSetInfo.
120 */
122 {
123 const auto specificRendererSetInfo = DescriptorSetManager::GetByName({ m_Pass->GetName(), subPassName });
124 for (auto& pair : specificRendererSetInfo)
125 {
126 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
127 }
128 }
129
130 /**
131 * @brief Material's DescriptorSetInfo.
132 * @note remove for material use bindless descriptorset.
133 */
134 const auto material = ResourcePool<Material>::Load<Material>(materialName, materialName);
136 {
137 // Not Implementated.
138 }
139
140 /**
141 * @brief Instance a temp empty vector for VkDescriptorSetLayout.
142 */
143 std::vector<VkDescriptorSetLayout> rowSetLayouts;
144
145 for (auto& pair : sortedRowSetLayouts)
146 {
147 rowSetLayouts.push_back(pair.second);
148 }
149
150 /**
151 * @breif Create PipelineLayout.
152 */
153 const auto subPass = *m_Pass->GetSubPasses()->find_value(subPassName);
154 VkPipelineLayout pipelineLayout = CreatePipelineLayout(rowSetLayouts, subPass);
155
156 /**
157 * @brief Create Pipeline.
158 */
159 CreatePipeline(material, pipelineLayout, subPass);
160 }
161
162 void Renderer::RegistryDGCPipeline(const std::string& materialName, const std::string& subPassName, VulkanDeviceGeneratedCommandsNV* indirectPtr)
163 {
165
166 /**
167 * @brief Instance a temp empty map for VkDescriptorSetLayout.
168 * Before turn it to a continus container, sorted is required.
169 */
170 std::map<uint32_t, VkDescriptorSetLayout> sortedRowSetLayouts;
171
172 /**
173 * @brief PreRenderer's DescriptorSetInfo.
174 */
175 const auto preRendererSetInfo = DescriptorSetManager::GetByName("PreRenderer");
176 for (auto& pair : preRendererSetInfo)
177 {
178 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
179 }
180
181 /**
182 * @brief SpecificRenderer's DescriptorSetInfo.
183 */
184 const auto specificRendererSetInfo = DescriptorSetManager::GetByName({ m_Pass->GetName(), subPassName});
185 for (auto& pair : specificRendererSetInfo)
186 {
187 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
188 }
189
190 /**
191 * @brief Material's DescriptorSetInfo.
192 * @note remove for material use bindless descriptorset.
193 */
194 const auto material = ResourcePool<Material>::Load<Material>(materialName, materialName);
195
196 /**
197 * @brief Instance a temp empty vector for VkDescriptorSetLayout.
198 */
199 std::vector<VkDescriptorSetLayout> rowSetLayouts;
200
201 for (auto& pair : sortedRowSetLayouts)
202 {
203 rowSetLayouts.push_back(pair.second);
204 }
205
206 /**
207 * @breif Create PipelineLayout.
208 */
209 const auto& subPass = *m_Pass->GetSubPasses()->find_value(subPassName);
210 VkPipelineLayout pipelineLayout = CreatePipelineLayout(rowSetLayouts, subPass);
211
212 /**
213 * @brief Create Pipeline.
214 */
215 std::stringstream ss;
216 ss << materialName << ".DGC";
217 CreateDeviceGeneratedCommandsPipeline(ss.str(), materialName, pipelineLayout, subPass, indirectPtr);
218 }
219
220 std::shared_ptr<Material> Renderer::GetDefaultMaterial(const std::string& subPassName) const
221 {
223
224 std::stringstream ss;
225 ss << m_RendererName << "." << subPassName << ".Default";
226
227 /**
228 * @brief Real Material.
229 */
230 return ResourcePool<Material>::Load<Material>(ss.str(), ss.str());
231 }
232
234 {
236
237 /**
238 * @brief Iter all subpass.
239 */
240 m_Pass->GetSubPasses()->for_each([&](const auto& K, const auto& V) {
241
242 std::stringstream ss;
243 ss << m_RendererName << "." << K << ".Default";
244
245 /**
246 * @brief Registry Real Material.
247 */
248 auto material = GetDefaultMaterial(K);
249 material->BuildMaterial();
250
251 /**
252 * @brief Not break loop.
253 */
254 return false;
255 });
256 }
257
258 void Renderer::CreateDGCMaterial(const std::string& subPass, VulkanDeviceGeneratedCommandsNV* indirectPtr)
259 {
261
262 std::stringstream ss;
263 ss << m_RendererName << "." << subPass << ".Default";
264
265 /**
266 * @brief Registry DGC Pipeline.
267 */
268 RegistryDGCPipeline(ss.str(), subPass, indirectPtr);
269 }
270
274 ) const
275 {
277
278 /**
279 * @brief Instance a VkPipelineLayoutCreateInfo.
280 */
281 VkPipelineLayoutCreateInfo pipelineLayoutInfo{};
282 pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
283 pipelineLayoutInfo.setLayoutCount = static_cast<uint32_t>(rowSetLayouts.size());
284 pipelineLayoutInfo.pSetLayouts = rowSetLayouts.data();
285 pipelineLayoutInfo.pushConstantRangeCount = 0;
286 pipelineLayoutInfo.pPushConstantRanges = nullptr;
287
288 if (subPass->IsUsePushConstant())
289 {
290 pipelineLayoutInfo.pushConstantRangeCount = 1;
291 pipelineLayoutInfo.pPushConstantRanges = &subPass->GetPushConstant();
292 }
293
294 /**
295 * @brief Create a VkPipelineLayout.
296 */
297 VkPipelineLayout pipelineLayout;
298 VK_CHECK(vkCreatePipelineLayout(m_VulkanState.m_Device, &pipelineLayoutInfo, nullptr, &pipelineLayout))
299 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_PIPELINE_LAYOUT, reinterpret_cast<uint64_t>(pipelineLayout), m_VulkanState.m_Device, "PipelineLayout")
300
301 return pipelineLayout;
302 }
303
305 {
307
308 /**
309 * @brief Init viewmatrix and projectionmatrix.
310 */
311 glm::mat4 invViewMat = glm::mat4(1.0f);
312 glm::mat4 projectionMat = glm::mat4(1.0f);
313 unsigned int stableFrames = 0;
314 float fov = 0.0f;
315
316 bool find = false;
317
318 /**
319 * @brief Iter CameraComponent, finding a active camera.
320 */
321 IterWorldCompWithBreak<CameraComponent>(
322 frameInfo,
323 [&](
324 int entityId ,
325 TransformComponent& transComp ,
326 CameraComponent& camComp
327 ){
328
329 if (camComp.IsActive())
330 {
331 /**
332 * @brief Viewmaterix is the inverse of camera's modelmatrix.
333 */
334 invViewMat = transComp.GetModelMatrix();
335 projectionMat = camComp.GetCamera()->GetPMatrixReverseZ();
336 stableFrames = camComp.GetCamera()->GetStableFrames();
337 fov = glm::radians(camComp.GetCamera()->GetPerspectiveParam().fov);
338
339 /**
340 * @brief Since we enable Negative viewport, we do not need reverse y axis here.
341 */
342 //projectionMat[1][1] *= -1;
343
344 /**
345 * @brief Break if finded.
346 */
347 find = true;
348 return find;
349 }
350
351 /**
352 * @brief Continue if not finded.
353 */
354 return false;
355 });
356
357 /**
358 * @brief Throwout a warning if not a active camera.
359 */
360 if (!find)
361 {
362 std::stringstream ss;
363 ss << m_RendererName << ": " << "not find a active camera in world, please check again";
364
365 SPICES_CORE_WARN(ss.str())
366 }
367
368 return std::make_tuple(invViewMat, projectionMat, stableFrames, fov);
369 }
370
371 void Renderer::GetDirectionalLight(FrameInfo& frameInfo, std::array<SpicesShader::DirectionalLight, SpicesShader::DIRECTIONALLIGHT_BUFFER_MAXNUM>& dLightBuffer)
372 {
374
375 /**
376 * @breif Iter DirectionalLightComponent, and just use the first one.
377 */
378 int index = 0;
379 IterWorldCompWithBreak<DirectionalLightComponent>(
380 frameInfo,
381 [&](
382 int entityId,
383 const TransformComponent& tranComp,
384 DirectionalLightComponent& dirlightComp
385 ) {
386
387 SpicesShader::DirectionalLight directionalLight = dirlightComp.GetLight();
388 directionalLight.rotationMatrix = tranComp.GetRotateMatrix();
389 dLightBuffer[index] = directionalLight;
390 index++;
391 return false;
392 });
393
394 /**
395 * @brief End of DirectionalLightBuffer.
396 */
397 dLightBuffer[index].intensity = -1000.0f;
398 }
399
400 void Renderer::GetDirectionalLightMatrix(FrameInfo& frameInfo, std::array<glm::mat4, MAX_DIRECTIONALLIGHT_NUM>& directionalLight)
401 {
403
404 for (uint32_t i = 0; i < MAX_DIRECTIONALLIGHT_NUM; i++)
405 {
406 directionalLight[i] = glm::mat4(1.0f);
407 }
408
409 TransformComponent camTranComp;
410 float ratio;
411
412 IterWorldCompWithBreak<CameraComponent>(
413 frameInfo,
414 [&](
415 int entityId,
416 TransformComponent& tranComp,
417 CameraComponent& camComp
418 ) {
419 camTranComp = tranComp;
420 ratio = camComp.GetCamera()->GetAspectRatio();
421 return true;
422 });
423
424 int index = 0;
425 IterWorldCompWithBreak<DirectionalLightComponent>(
426 frameInfo,
427 [&](
428 int entityId ,
429 TransformComponent& tranComp ,
430 DirectionalLightComponent& dirlightComp
431 ) {
432 TransformComponent tempComp;
433 tempComp.SetPosition(camTranComp.GetPosition());
434 tempComp.SetRotation(camTranComp.GetRotation());
435
436 const glm::mat4 view = tempComp.GetModelMatrix();
437 const glm::mat4 projection = OtrhographicMatrix(-ratio * 30, ratio * 30, -1.0f * 30, 1.0f * 30, -100000.0f, 100000.0f);
438
439 directionalLight[index] = projection * glm::inverse(view);
440 index++;
441 return false;
442 });
443 }
444
445 void Renderer::GetPointLight(FrameInfo& frameInfo, std::array<SpicesShader::PointLight, SpicesShader::POINTLIGHT_BUFFER_MAXNUM>& pLightBuffer)
446 {
448
449 /**
450 * @brief Iter PointLightComponent.
451 */
452 int index = 0;
453 IterWorldCompWithBreak<PointLightComponent>(
454 frameInfo,
455 [&](
456 int entityId,
457 TransformComponent& tranComp,
458 PointLightComponent& plightComp
459 ) {
460
461 SpicesShader::PointLight pointLight = plightComp.GetLight();
462 pointLight.position = tranComp.GetPosition();
463 pLightBuffer[index] = pointLight;
464 index++;
465 return false;
466 });
467
468 /**
469 * @brief End of PointLightBuffer.
470 */
471 pLightBuffer[index].intensity = -1000.0f;
472 }
473
475
476 Renderer::RenderBehaveBuilder::RenderBehaveBuilder(Renderer* renderer, uint32_t currentFrame, uint32_t currentImage)
477 : m_Renderer(renderer)
478 , m_CurrentFrame(currentFrame)
479 , m_CurrentImage(currentImage)
480 {
482
484 m_CommandBuffer = m_Renderer->m_VulkanState.m_GraphicCommandBuffer[currentFrame];
485
486 /**
487 * @brief Create Statistics state list.
488 */
489 if (!m_Renderer->m_StatisticsStateList)
490 {
491 m_Renderer->m_StatisticsStateList = std::make_shared<scl::behave_state_list<void, RenderBehaveBuilder*, VkCommandBuffer>>();
492
493 // Do nothing.
494 {
495 const auto state = m_Renderer->m_StatisticsStateList->AddNode();
496
497 state->PushBehave("EndRenderer", nullptr);
498 state->PushBehave("BeginStatistics", nullptr);
499 state->PushBehave("EndStatistics", nullptr);
500 }
501
502 // Query Statistics item.
503 {
504 for(int i = 0; i < Querier::Max; i++)
505 {
506 const auto state = m_Renderer->m_StatisticsStateList->AddNode();
507
508 state->PushBehave("EndRenderer", nullptr);
509 state->PushBehave("BeginStatistics", [=](RenderBehaveBuilder* builder, VkCommandBuffer commandBuffer) {
510 builder->GetStatisticsRendererPass()->BeginStatistics(commandBuffer, static_cast<Querier::StatisticsBits>(1 << i));
511 });
512 state->PushBehave("EndStatistics", [=](RenderBehaveBuilder* builder, VkCommandBuffer commandBuffer) {
513 builder->GetStatisticsRendererPass()->EndStatistics(commandBuffer, static_cast<Querier::StatisticsBits>(1 << i));
514 });
515 }
516 }
517
518 // Submit store task to threadPool.
519 {
520 const auto state = m_Renderer->m_StatisticsStateList->AddNode();
521
522 state->PushBehave("EndRenderer", [](RenderBehaveBuilder* builder, VkCommandBuffer commandBuffer) {
523 AsyncTask(ThreadPoolEnum::Custom, [&](std::shared_ptr<RendererSubPass> subPass) {
524 subPass->StoreStatistics();
525 }, builder->GetStatisticsRendererPass());
526 });
527 state->PushBehave("BeginStatistics", nullptr);
528 state->PushBehave("EndStatistics", nullptr);
529 }
530
531 // Do nothing.
532 {
533 const auto state = m_Renderer->m_StatisticsStateList->AddNode();
534
535 state->PushBehave("EndRenderer", nullptr);
536 state->PushBehave("BeginStatistics", nullptr);
537 state->PushBehave("EndStatistics", nullptr);
538 }
539
540 m_Renderer->m_StatisticsStateList->SetState(Querier::Max + 2);
541 }
542 }
543
545 {
547
548 return *m_Renderer->m_Pass->GetSubPasses()->first();
549 }
550
551 void Renderer::RenderBehaveBuilder::Recording(const std::string& caption) const
552 {
554
555 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, caption)
556 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, caption, 1, m_CurrentFrame)
557 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, caption)
558 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter Pass:" + caption)
559 }
560
562 {
564
565 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
566 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
567 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
568 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Leave Pass")
569 }
570
572 {
574
575 /**
576 * @brief Submit Cmds to Thread Pool.
577 */
578 return m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [=](const VkCommandBuffer& cmdBuffer) {
579 func(cmdBuffer);
580 });
581 }
582
583 void Renderer::RenderBehaveBuilder::Await(std::function<void(const VkCommandBuffer& cmdBuffer)> func) const
584 {
586
587 /**
588 * @brief Submit Cmds to Thread Pool.
589 */
590 std::future<VkCommandBuffer> futureCmdBuffer = m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
591 func(cmdBuffer);
592 });
593
594 /**
595 * @brief Wait for merge.
596 */
597 Wait(futureCmdBuffer);
598 }
599
600 void Renderer::RenderBehaveBuilder::Wait(std::future<VkCommandBuffer>& futureCmdBuffer) const
601 {
603
604 const VkCommandBuffer buffers = futureCmdBuffer.get();
605
606 /**
607 * @brief Merge secondary commandbuffer to main commandbuffer.
608 */
609 vkCmdExecuteCommands(m_CommandBuffer, 1, &buffers);
610 }
611
612 void Renderer::RenderBehaveBuilder::Wait(std::vector<std::future<VkCommandBuffer>>& futureCmdBuffers) const
613 {
615
616 std::vector<VkCommandBuffer> buffers(futureCmdBuffers.size());
617
618 for (size_t i = 0; i < buffers.size(); i++)
619 {
620 buffers[i] = futureCmdBuffers[i].get();
621 }
622
623 /**
624 * @brief Merge secondary commandbuffer to main commandbuffer.
625 */
626 vkCmdExecuteCommands(m_CommandBuffer, buffers.size(), buffers.data());
627 }
628
629 void Renderer::RenderBehaveBuilder::BindPipeline(const std::string& materialName, VkCommandBuffer cmdBuffer, VkPipelineBindPoint bindPoint)
630 {
632
633 vkCmdBindPipeline(
634 cmdBuffer ? cmdBuffer : m_CommandBuffer,
635 bindPoint,
636 m_Renderer->m_Pipelines.Find(materialName)->GetPipeline()
637 );
638 }
639
640 void Renderer::RenderBehaveBuilder::BindPipeline(VkPipeline pipeline, VkCommandBuffer cmdBuffer, VkPipelineBindPoint bindPoint)
641 {
643
644 vkCmdBindPipeline(
645 cmdBuffer ? cmdBuffer : m_CommandBuffer,
646 bindPoint,
647 pipeline
648 );
649 }
650
651 void Renderer::RenderBehaveBuilder::BindPipelineAsync(const std::string& materialName, VkPipelineBindPoint bindPoint)
652 {
654
655 m_Renderer->SubmitCmdsParallel(
656 m_CommandBuffer,
657 m_SubPassIndex,
658 [&](const VkCommandBuffer& cmdBuffer)
659 {
660 vkCmdBindPipeline(
661 cmdBuffer,
662 bindPoint,
663 m_Renderer->m_Pipelines.Find(materialName)->GetPipeline()
664 );
665 });
666 }
667
668 void Renderer::RenderBehaveBuilder::SetViewPort(const VkCommandBuffer& cmdBuffer) const
669 {
671
672 /**
673 * @brief Use Negative Viewport height filp here to handle axis difference.
674 * Remember enable device extension (VK_KHR_MAINTENANCE1)
675 */
676 VkViewport viewport {};
677 viewport.x = 0.0f;
678 viewport.y = static_cast<float>(m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height);
679 viewport.width = static_cast<float>(m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width);
680 viewport.height = -static_cast<float>(m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height);
681 viewport.minDepth = 0.0f;
682 viewport.maxDepth = 1.0f;
683
684 /**
685 * @brief Though we draw world to viewport but not surface,
686 * Set Correct viewport here is necessary.
687 */
688 if (SlateSystem::GetRegister())
689 {
690 const ImVec2 viewPortSize = SlateSystem::GetRegister()->GetViewPort()->GetPanelSize();
691
692 viewport.y = viewPortSize.y;
693 viewport.width = viewPortSize.x;
694 viewport.height = -viewPortSize.y;
695 }
696
697 /**
698 * @brief Instance a VkRect2D.
699 */
700 VkRect2D scissor{};
701 scissor.offset = { 0, 0 };
702 scissor.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
703
704 /**
705 * @brief Set VkViewport with viewport slate.
706 */
707 vkCmdSetViewport(cmdBuffer ? cmdBuffer : m_CommandBuffer, 0, 1, &viewport);
708
709 /**
710 * @brief Set VkRect2D.
711 */
712 vkCmdSetScissor(cmdBuffer ? cmdBuffer : m_CommandBuffer, 0, 1, &scissor);
713 }
714
716 {
718
719 /**
720 * @brief Use Negative Viewport height filp here to handle axis difference.
721 * Remember enable device extension (VK_KHR_MAINTENANCE1)
722 */
723 VkViewport viewport {};
724 viewport.x = 0.0f;
725 viewport.y = static_cast<float>(m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height);
726 viewport.width = static_cast<float>(m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width);
727 viewport.height = -static_cast<float>(m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height);
728 viewport.minDepth = 0.0f;
729 viewport.maxDepth = 1.0f;
730
731 /**
732 * @brief Though we draw world to viewport but not surface,
733 * Set Correct viewport here is necessary.
734 */
735 if (SlateSystem::GetRegister())
736 {
737 const ImVec2 viewPortSize = SlateSystem::GetRegister()->GetViewPort()->GetPanelSize();
738
739 viewport.y = viewPortSize.y;
740 viewport.width = viewPortSize.x;
741 viewport.height = -viewPortSize.y;
742 }
743
744 /**
745 * @brief Instance a VkRect2D
746 */
747 VkRect2D scissor{};
748 scissor.offset = { 0, 0 };
749 scissor.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
750
751 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
752
753 /**
754 * @brief Set VkViewport with viewport slate.
755 */
756 vkCmdSetViewport(cmdBuffer, 0, 1, &viewport);
757
758 /**
759 * @brief Set VkRect2D.
760 */
761 vkCmdSetScissor(cmdBuffer, 0, 1, &scissor);
762 });
763 }
764
765 void Renderer::RenderBehaveBuilder::BeginNextSubPass(const std::string& subPassName)
766 {
768
769 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
771 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
772
773 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
774 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
775
776 //NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
777 //NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
778
779 //DEBUGUTILS_ENDLABEL(m_CommandBuffer)
780 //DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
781
782 //NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter SubPass:" + m_HandledSubPass->GetName())
783
784 vkCmdNextSubpass(m_CommandBuffer, VK_SUBPASS_CONTENTS_INLINE);
785 }
786
787 void Renderer::ComputeRenderBehaveBuilder::BeginNextSubPass(const std::string& subPassName)
788 {
790
791 /**
792 * @brief End RenderPass Statistics.
793 */
794 RENDERPASS_STATISTICS_ENDSTATISTICS(this, m_CommandBuffer)
795 RENDERPASS_STATISTICS_ENDRENDERER(this)
796
797 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
799 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
800
801 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
802 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
803
804 //NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
805 //NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
806
807 //DEBUGUTILS_ENDLABEL(m_CommandBuffer)
808 //DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
809
810 //NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter SubPass:" + m_HandledSubPass->GetName())
811
812 /**
813 * @brief Begin RenderPass Statistics.
814 */
815 RENDERPASS_STATISTICS_BEGINSTATISTICS(this, m_CommandBuffer)
816 }
817
818 void Renderer::RenderBehaveBuilder::BeginNextSubPassAsync(const std::string& subPassName)
819 {
821
822 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
824 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
825
826 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
827 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
828
829 //NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
830 //NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
831
832 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
833 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
834
835 //NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter SubPass:" + m_HandledSubPass->GetName())
836
837 vkCmdNextSubpass(m_CommandBuffer, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
838 }
839
841 {
843
844 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
845 m_SubPassIndex = 0;
846 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
847
848 /**
849 * @brief Instance a VkRenderPassBeginInfo.
850 */
851 VkRenderPassBeginInfo renderPassInfo{};
852 renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
853 renderPassInfo.renderPass = m_Renderer->m_Pass->Get();
854 renderPassInfo.framebuffer = m_Renderer->m_Pass->GetFramebuffer(m_CurrentImage);
855 renderPassInfo.renderArea.offset = { 0, 0 };
856
857 /**
858 * @brief In the first frame, we use window size rather than viewport size.
859 */
860 if (m_Renderer->m_Pass->IsUseSwapChain() || !SlateSystem::GetRegister())
861 {
862 renderPassInfo.renderArea.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
863 }
864 else
865 {
866 const ImVec2 size = SlateSystem::GetRegister()->GetViewPort()->GetPanelSize();
867 const VkExtent2D extent = { static_cast<uint32_t>(size.x) , static_cast<uint32_t>(size.y) };
868 renderPassInfo.renderArea.extent = extent;
869 }
870
871 renderPassInfo.clearValueCount = static_cast<uint32_t>(m_Renderer->m_Pass->GetClearValues().size());
872 renderPassInfo.pClearValues = m_Renderer->m_Pass->GetClearValues().data();
873
874 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
875 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
876
877 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName(), 1, m_CurrentFrame)
878 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
879
880 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
881 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
882
883 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter Pass:" + m_Renderer->m_Pass->GetName())
884
885 /**
886 * @brief Begin RenderPass Statistics.
887 */
888 RENDERPASS_STATISTICS_BEGINSTATISTICS(this, m_CommandBuffer)
889
890 vkCmdBeginRenderPass(m_CommandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
891 }
892
894 {
896
897 return m_HandledSubPass;
898 }
899
901 {
903
904 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
905 m_SubPassIndex = 0;
906 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
907
908 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
909 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
910
911 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName(), 1, m_CurrentFrame)
912 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
913
914 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
915 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
916
917 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter Pass:" + m_Renderer->m_Pass->GetName())
918
919 /**
920 * @brief Begin RenderPass Statistics.
921 */
922 RENDERPASS_STATISTICS_BEGINSTATISTICS(this, m_CommandBuffer)
923 }
924
926 {
928
929 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
930 m_SubPassIndex = 0;
931 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
932
933 /**
934 * @brief Instance a VkRenderPassBeginInfo.
935 */
936 VkRenderPassBeginInfo renderPassInfo{};
937 renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
938 renderPassInfo.renderPass = m_Renderer->m_Pass->Get();
939 renderPassInfo.framebuffer = m_Renderer->m_Pass->GetFramebuffer(m_CurrentImage);
940 renderPassInfo.renderArea.offset = { 0, 0 };
941
942 /**
943 * @brief In the first frame, we use window size rather than viewport size.
944 */
945 if (m_Renderer->m_Pass->IsUseSwapChain() || !SlateSystem::GetRegister())
946 {
947 renderPassInfo.renderArea.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
948 }
949 else
950 {
951 const ImVec2 size = SlateSystem::GetRegister()->GetViewPort()->GetPanelSize();
952 const VkExtent2D extent = { static_cast<uint32_t>(size.x) , static_cast<uint32_t>(size.y) };
953 renderPassInfo.renderArea.extent = extent;
954 }
955
956 renderPassInfo.clearValueCount = static_cast<uint32_t>(m_Renderer->m_Pass->GetClearValues().size());
957 renderPassInfo.pClearValues = m_Renderer->m_Pass->GetClearValues().data();
958
959 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
960 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
961
962 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName(), 1, m_CurrentFrame)
963 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
964
965 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
966 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
967
968 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter Pass:" + m_Renderer->m_Pass->GetName())
969
970 /**
971 * @brief Begin RenderPass Statistics.
972 */
973 RENDERPASS_STATISTICS_BEGINSTATISTICS(this, m_CommandBuffer)
974
975 /**
976 * @brief This command not allow async.
977 */
978 vkCmdBeginRenderPass(m_CommandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
979 }
980
982 {
984
985 vkCmdEndRenderPass(m_CommandBuffer);
986
987 /**
988 * @brief End RenderPass Statistics.
989 */
990 RENDERPASS_STATISTICS_ENDSTATISTICS(this, m_CommandBuffer)
991 RENDERPASS_STATISTICS_ENDRENDERER(this)
992
993 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Leave Pass:" + m_Renderer->m_Pass->GetName())
994
995 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
996 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
997
998 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
999 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
1000
1001 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1002 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1003 }
1004
1006 {
1008
1009 /**
1010 * @brief End RenderPass Statistics.
1011 */
1012 RENDERPASS_STATISTICS_ENDSTATISTICS(this, m_CommandBuffer)
1013 RENDERPASS_STATISTICS_ENDRENDERER(this)
1014
1015 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Leave Pass:" + m_Renderer->m_Pass->GetName())
1016
1017 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1018 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1019
1020 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
1021 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
1022
1023 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1024 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1025 }
1026
1028 Renderer* renderer ,
1029 VulkanRayTracing* rayTracing ,
1030 uint32_t currentFrame ,
1031 uint32_t currentImage
1032 )
1033 : RenderBehaveBuilder(renderer, currentFrame, currentImage)
1035 {
1037
1038 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
1039 }
1040
1042 {
1044
1045 return m_HandledSubPass;
1046 }
1047
1049 {
1051
1052 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
1053 m_SubPassIndex = 0;
1054 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
1055
1056 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
1057 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
1058
1059 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName(), 1, m_CurrentFrame)
1060 NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
1061
1062 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
1063 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
1064
1065 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter Pass:" + m_Renderer->m_Pass->GetName())
1066
1067 /**
1068 * @brief Begin RenderPass Statistics.
1069 */
1070 RENDERPASS_STATISTICS_BEGINSTATISTICS(this, m_CommandBuffer)
1071 }
1072
1074 {
1075 /**
1076 * @brief End RenderPass Statistics.
1077 */
1078 RENDERPASS_STATISTICS_ENDSTATISTICS(this, m_CommandBuffer)
1079 RENDERPASS_STATISTICS_ENDRENDERER(this)
1080
1081 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Leave Pass:" + m_Renderer->m_Pass->GetName())
1082
1083 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1084 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1085
1086 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
1087 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
1088
1089 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1090 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1091 }
1092
1093 void Renderer::RayTracingRenderBehaveBuilder::BeginNextSubPass(const std::string& subPassName)
1094 {
1096
1097 /**
1098 * @brief End RenderPass Statistics.
1099 */
1100 RENDERPASS_STATISTICS_ENDSTATISTICS(this, m_CommandBuffer)
1101 RENDERPASS_STATISTICS_ENDRENDERER(this)
1102
1103 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
1105 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
1106
1107 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1108 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
1109
1110 //NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
1111 //NSIGHTPERF_GPUPROFILERONESHOT_BEGINRANGE(m_CommandBuffer, m_HandledSubPass->GetName(), 2, m_CurrentFrame)
1112
1113 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1114 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
1115
1116 //NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc, "Enter SubPass:" + m_HandledSubPass->GetName())
1117
1118 /**
1119 * @brief Begin RenderPass Statistics.
1120 */
1121 RENDERPASS_STATISTICS_BEGINSTATISTICS(this, m_CommandBuffer)
1122 }
1123
1125 const std::string& materialName ,
1126 VkCommandBuffer cmdBuffer ,
1127 VkPipelineBindPoint bindPoint
1128 )
1129 {
1131
1132 RenderBehaveBuilder::BindPipeline(materialName, cmdBuffer, bindPoint);
1133 }
1134
1136 VkPipeline pipeline ,
1137 VkCommandBuffer cmdBuffer,
1138 VkPipelineBindPoint bindPoint
1139 )
1140 {
1142
1143 RenderBehaveBuilder::BindPipeline(pipeline, cmdBuffer, bindPoint);
1144 }
1145
1147 const std::string& materialName ,
1148 VkPipelineBindPoint bindPoint
1149 )
1150 {
1152
1153 RenderBehaveBuilder::BindPipelineAsync(materialName, bindPoint);
1154 }
1155
1157 const DescriptorSetInfo& infos ,
1158 VkCommandBuffer cmdBuffer ,
1159 VkPipelineBindPoint bindPoint
1160 )
1161 {
1163
1164 RenderBehaveBuilder::BindDescriptorSet(infos, cmdBuffer, bindPoint);
1165 }
1166
1168 const DescriptorSetInfo& infos ,
1169 VkPipelineBindPoint bindPoint
1170 )
1171 {
1173
1174 RenderBehaveBuilder::BindDescriptorSetAsync(infos, bindPoint);
1175 }
1176
1178 const DescriptorSetInfo& infos ,
1179 const std::string& name ,
1180 VkCommandBuffer cmdBuffer ,
1181 VkPipelineBindPoint bindPoint
1182 )
1183 {
1185
1186 RenderBehaveBuilder::BindDescriptorSet(infos, name, cmdBuffer, bindPoint);
1187 }
1188
1190 const DescriptorSetInfo& infos ,
1191 const std::string& name ,
1192 VkPipelineBindPoint bindPoint
1193 )
1194 {
1196
1197 RenderBehaveBuilder::BindDescriptorSetAsync(infos, name, bindPoint);
1198 }
1199
1201 {
1203
1204 const uint32_t width = static_cast<uint32_t>(SlateSystem::GetRegister()->GetViewPort()->GetPanelSize().x);
1205 const uint32_t height = static_cast<uint32_t>(SlateSystem::GetRegister()->GetViewPort()->GetPanelSize().y);
1206
1207 /*
1208 * @attention Vulkan not allow dynamic state in mixing raytracing pipeline and custom graphic pipeline.
1209 * @see https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/8038.
1210 */
1211 m_Renderer->m_VulkanState.m_VkFunc.vkCmdTraceRaysKHR(
1212 m_CommandBuffer ,
1213 &m_VulkanRayTracing->GetRgenRegion() ,
1214 &m_VulkanRayTracing->GetMissRegion() ,
1215 &m_VulkanRayTracing->GetHitRegion() ,
1216 &m_VulkanRayTracing->GetCallRegion() ,
1217 width ,
1218 height ,
1219 1
1220 );
1221 }
1222
1224 const VkStridedDeviceAddressRegionKHR* rgenRegion,
1225 const VkStridedDeviceAddressRegionKHR* missRegion,
1226 const VkStridedDeviceAddressRegionKHR* hitRegion,
1227 const VkStridedDeviceAddressRegionKHR* callRegion
1228 ) const
1229 {
1231
1232 const uint32_t width = static_cast<uint32_t>(SlateSystem::GetRegister()->GetViewPort()->GetPanelSize().x);
1233 const uint32_t height = static_cast<uint32_t>(SlateSystem::GetRegister()->GetViewPort()->GetPanelSize().y);
1234
1235 /**
1236 * @brief Trace rays.
1237 */
1238 m_Renderer->m_VulkanState.m_VkFunc.vkCmdTraceRaysKHR(
1239 m_CommandBuffer ,
1240 rgenRegion ,
1241 missRegion ,
1242 hitRegion ,
1243 callRegion ,
1244 width ,
1245 height ,
1246 1
1247 );
1248 }
1249
1251 const VkStridedDeviceAddressRegionKHR* rgenRegion ,
1252 const VkStridedDeviceAddressRegionKHR* missRegion ,
1253 const VkStridedDeviceAddressRegionKHR* hitRegion ,
1254 const VkStridedDeviceAddressRegionKHR* callRegion
1255 ) const
1256 {
1258
1259 const uint32_t width = static_cast<uint32_t>(SlateSystem::GetRegister()->GetViewPort()->GetPanelSize().x);
1260 const uint32_t height = static_cast<uint32_t>(SlateSystem::GetRegister()->GetViewPort()->GetPanelSize().y);
1261
1262 /*
1263 * @attention Vulkan not allow dynamic state in mixing raytracing pipeline and custom graphic pipeline.
1264 * @see https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/8038.
1265 */
1266 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
1267 m_Renderer->m_VulkanState.m_VkFunc.vkCmdTraceRaysKHR(
1268 cmdBuffer,
1269 rgenRegion,
1270 missRegion,
1271 hitRegion,
1272 callRegion,
1273 width,
1274 height,
1275 1
1276 );
1277 });
1278 }
1279
1281 const DescriptorSetInfo& infos ,
1282 VkCommandBuffer cmdBuffer ,
1283 VkPipelineBindPoint bindPoint
1284 )
1285 {
1287
1288 std::stringstream ss;
1289 ss << m_Renderer->m_RendererName << "." << m_HandledSubPass->GetName() << ".Default";
1290
1291 BindDescriptorSet(infos, ss.str(), cmdBuffer, bindPoint);
1292 }
1293
1295 const DescriptorSetInfo& infos ,
1296 const std::string& name ,
1297 VkCommandBuffer cmdBuffer ,
1298 VkPipelineBindPoint bindPoint
1299 )
1300 {
1302
1303 /**
1304 * @brief Iter all desctiptorsets.
1305 */
1306 for (const auto& pair : infos)
1307 {
1308 vkCmdBindDescriptorSets(
1309 cmdBuffer ? cmdBuffer : m_CommandBuffer,
1310 bindPoint,
1311 m_Renderer->m_Pipelines.Find(name)->GetPipelineLayout(),
1312 pair.first,
1313 1,
1314 &pair.second->Get(),
1315 0,
1316 nullptr
1317 );
1318 }
1319 }
1320
1322 const DescriptorSetInfo& infos ,
1323 VkPipelineBindPoint bindPoint
1324 )
1325 {
1327
1328 std::stringstream ss;
1329 ss << m_Renderer->m_RendererName << "." << m_HandledSubPass->GetName() << ".Default";
1330
1331 BindDescriptorSetAsync(infos, ss.str(), bindPoint);
1332 }
1333
1335 const DescriptorSetInfo& infos ,
1336 const std::string& name ,
1337 VkPipelineBindPoint bindPoint
1338 )
1339 {
1341
1342 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& secCmdBuffer) {
1343
1344 /**
1345 * @brief Iter all desctiptorsets.
1346 */
1347 for (const auto& pair : infos)
1348 {
1349 vkCmdBindDescriptorSets(
1350 secCmdBuffer,
1351 bindPoint,
1352 m_Renderer->m_Pipelines.Find(name)->GetPipelineLayout(),
1353 pair.first,
1354 1,
1355 &pair.second->Get(),
1356 0,
1357 nullptr
1358 );
1359 }
1360 });
1361 }
1362
1363 void Renderer::RenderBehaveBuilder::RunDGC(VkCommandBuffer cmdBuffer) const
1364 {
1366
1367 PreprocessDGC_NV(cmdBuffer);
1368
1369 InternalRegionBarrier(
1370 VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV ,
1371 VK_ACCESS_INDIRECT_COMMAND_READ_BIT ,
1372 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV ,
1373 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT ,
1374 cmdBuffer
1375 );
1376
1377 ExecuteDGC_NV(cmdBuffer);
1378 }
1379
1381 {
1383
1384 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
1385 PreprocessDGC_NV(cmdBuffer);
1386
1387 InternalRegionBarrier(
1388 VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV ,
1389 VK_ACCESS_INDIRECT_COMMAND_READ_BIT ,
1390 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV ,
1391 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT ,
1392 cmdBuffer
1393 );
1394
1395 ExecuteDGC_NV(cmdBuffer);
1396 });
1397 }
1398
1399 void Renderer::RenderBehaveBuilder::PreprocessDGC_NV(VkCommandBuffer cmdBuffer) const
1400 {
1402
1403 /**
1404 * @brief Call vkCmdPreprocessGeneratedCommandsNV.
1405 */
1406 m_HandledDGCData->PreprocessDGC(cmdBuffer ? cmdBuffer : m_CommandBuffer);
1407 }
1408
1410 {
1412
1413 /**
1414 * @brief Call vkCmdPreprocessGeneratedCommandsNV.
1415 */
1416 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
1417 m_HandledDGCData->PreprocessDGC(cmdBuffer);
1418 });
1419 }
1420
1421 void Renderer::RenderBehaveBuilder::ExecuteDGC_NV(const VkCommandBuffer& cmdBuffer) const
1422 {
1424
1425 /**
1426 * @brief Call vkCmdExecuteGeneratedCommandsNV.
1427 */
1428 m_HandledDGCData->ExecuteDGC(cmdBuffer ? cmdBuffer : m_CommandBuffer);
1429 }
1430
1432 {
1434
1435 /**
1436 * @brief Call vkCmdExecuteGeneratedCommandsNV.
1437 */
1438 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
1439 m_HandledDGCData->ExecuteDGC(cmdBuffer);
1440 });
1441 }
1442
1443 void Renderer::RenderBehaveBuilder::DrawFullScreenTriangle(const VkCommandBuffer& cmdBuffer) const
1444 {
1446
1447 /**
1448 * @brief Call vkCmdDraw.
1449 */
1450 vkCmdDraw(cmdBuffer ? cmdBuffer : m_CommandBuffer, 3, 1, 0, 0);
1451 }
1452
1454 {
1456
1457 /**
1458 * @brief Call vkCmdDraw.
1459 */
1460 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
1461 vkCmdDraw(cmdBuffer, 3, 1, 0, 0);
1462 });
1463 }
1464
1466 VkAccessFlags srcAccessMask ,
1467 VkAccessFlags dstAccessMask ,
1468 VkPipelineStageFlags srcStageMask ,
1469 VkPipelineStageFlags dstStageMask ,
1470 VkCommandBuffer cmdBuffer
1471 ) const
1472 {
1474
1475 /**
1476 * @brief Instance a VkMemoryBarrier.
1477 */
1478 VkMemoryBarrier barrier{};
1479 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1480 barrier.srcAccessMask = srcAccessMask;
1481 barrier.dstAccessMask = dstAccessMask;
1482
1483 /**
1484 * @brief Call vkCmdPipelineBarrier.
1485 */
1486 vkCmdPipelineBarrier(
1487 cmdBuffer ? cmdBuffer : m_CommandBuffer,
1488 srcStageMask,
1489 dstStageMask,
1490 VK_DEPENDENCY_BY_REGION_BIT,
1491 1, &barrier,
1492 0, nullptr,
1493 0, nullptr
1494 );
1495 }
1496
1498 VkAccessFlags srcAccessMask ,
1499 VkAccessFlags dstAccessMask ,
1500 VkPipelineStageFlags srcStageMask ,
1501 VkPipelineStageFlags dstStageMask
1502 ) const
1503 {
1505
1506 /**
1507 * @brief Instance a VkMemoryBarrier.
1508 */
1509 VkMemoryBarrier barrier{};
1510 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1511 barrier.srcAccessMask = srcAccessMask;
1512 barrier.dstAccessMask = dstAccessMask;
1513
1514 /**
1515 * @brief Call vkCmdPipelineBarrier.
1516 */
1517 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](const VkCommandBuffer& cmdBuffer) {
1518 vkCmdPipelineBarrier(
1519 cmdBuffer,
1520 srcStageMask,
1521 dstStageMask,
1522 VK_DEPENDENCY_BY_REGION_BIT,
1523 1, &barrier,
1524 0, nullptr,
1525 0, nullptr
1526 );
1527 });
1528 }
1529
1531 const std::string& subPassName ,
1532 Renderer* renderer
1533 )
1534 : m_Renderer(renderer)
1535 {
1537
1538 m_HandledSubPass = *renderer->m_Pass->GetSubPasses()->find_value(subPassName);
1539 m_DescriptorSetId = { m_Renderer->m_Pass->GetName(), m_HandledSubPass->GetName() };
1540 }
1541
1543 {
1545
1546 /**
1547 * @brief Call RendererSubPass::SetPushConstant().
1548 */
1549 m_HandledSubPass->SetPushConstant([&](auto& range) {
1550 range.stageFlags = VK_SHADER_STAGE_ALL;
1551 range.offset = 0;
1552 range.size = size;
1553 });
1554
1555 return *this;
1556 }
1557
1559 uint32_t set ,
1560 uint32_t binding ,
1561 uint64_t size ,
1562 VkShaderStageFlags stageFlags
1563 )
1564 {
1566
1567 const UInt2 id(set, binding);
1568
1569 /**
1570 * @brief Creating VulkanBuffer.
1571 */
1572 m_HandledSubPass->GetBuffers(id) = std::make_shared<VulkanBuffer>(
1573 m_Renderer->m_VulkanState,
1574 "UniformBuffer",
1575 size,
1576 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
1577 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1578 );
1579
1580 /**
1581 * @brief fill in bufferInfos.
1582 */
1583 m_BufferInfos[set][binding] = *m_HandledSubPass->GetBuffers(id)->GetBufferInfo();
1584
1585 /**
1586 * @brief Registy descriptor and add binging to it.
1587 */
1588 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1589 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, stageFlags, 1);
1590
1591 return *this;
1592 }
1593
1595 uint32_t set ,
1596 uint32_t binding ,
1597 uint64_t size ,
1598 VkShaderStageFlags stageFlags
1599 )
1600 {
1602
1603 const UInt2 id(set, binding);
1604
1605 /**
1606 * @brief Creating VulkanBuffer.
1607 */
1608 m_HandledSubPass->GetBuffers(id) = std::make_shared<VulkanBuffer>(
1609 m_Renderer->m_VulkanState,
1610 "StorageBuffer",
1611 size,
1612 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
1613 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
1614 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1615 );
1616
1617 /**
1618 * @brief fill in bufferInfos.
1619 */
1620 m_BufferInfos[set][binding] = *m_HandledSubPass->GetBuffers(id)->GetBufferInfo();
1621
1622 /**
1623 * @brief Registy descriptor and add binging to it.
1624 */
1625 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1626 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageFlags, 1);
1627
1628 return *this;
1629 }
1630
1632 uint32_t set ,
1633 uint32_t binding ,
1634 VkShaderStageFlags stageFlags ,
1635 std::shared_ptr<VulkanBuffer> buffer
1636 )
1637 {
1639
1640 const UInt2 id(set, binding);
1641
1642 /**
1643 * @brief Creating VulkanBuffer.
1644 */
1645 m_HandledSubPass->GetBuffers(id) = buffer;
1646
1647 /**
1648 * @brief fill in bufferInfos.
1649 */
1650 m_BufferInfos[set][binding] = *m_HandledSubPass->GetBuffers(id)->GetBufferInfo();
1651
1652 /**
1653 * @brief Registy descriptor and add binging to it.
1654 */
1655 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1656 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageFlags, 1);
1657
1658 return *this;
1659 }
1660
1662 uint32_t set ,
1663 uint32_t binding ,
1664 VkShaderStageFlags stageFlags ,
1665 const std::vector<std::string>& textureNames ,
1666 VkFormat format ,
1667 TextureType type
1668 )
1669 {
1671
1672 /**
1673 * @brief fill in imageInfos.
1674 */
1675 for (size_t i = 0; i < textureNames.size(); i++)
1676 {
1677 RendererResourceCreateInfo info;
1678 info.name = textureNames[i];
1679 info.type = type;
1680 info.width = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width;
1681 info.height = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height;
1682 info.description.samples = VK_SAMPLE_COUNT_1_BIT;
1683 info.description.format = format;
1684 info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
1685
1686 VkDescriptorImageInfo* imageInfo = m_Renderer->m_RendererResourcePool->AccessResource(info);
1687 imageInfo->imageLayout = VK_IMAGE_LAYOUT_GENERAL;
1688
1689 m_ImageInfos[set][binding].push_back(*imageInfo);
1690 }
1691
1692 /**
1693 * @brief Registy descriptor and add binging to it.
1694 */
1695 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1696 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stageFlags, static_cast<uint32_t>(textureNames.size()));
1697
1698 return *this;
1699 }
1700
1702 uint32_t set ,
1703 uint32_t binding ,
1704 VkShaderStageFlags stageFlags ,
1705 const std::string& textureName ,
1706 VkFormat format ,
1707 TextureType type ,
1708 std::function<void(RendererResourceCreateInfo&)> func
1709 )
1710 {
1712
1713 /**
1714 * @brief fill in imageInfos.
1715 */
1717 info.name = textureName;
1718 info.type = type;
1719 info.width = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width;
1720 info.height = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.height;
1721 info.description.samples = VK_SAMPLE_COUNT_1_BIT;
1722 info.description.format = format;
1723 info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
1724
1725 if (func)
1726 {
1727 func(info);
1728 }
1729
1730 for(int i = 0; i < info.mipLevel; i++)
1731 {
1732 VkDescriptorImageInfo* imageInfo = m_Renderer->m_RendererResourcePool->AccessResource(info, i);
1733 imageInfo->imageLayout = VK_IMAGE_LAYOUT_GENERAL;
1734
1735 m_ImageInfos[set][binding].push_back(*imageInfo);
1736 }
1737
1738 /**
1739 * @brief Registy descriptor and add binging to it.
1740 */
1741 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1742 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stageFlags, static_cast<uint32_t>(info.mipLevel));
1743
1744 return *this;
1745 }
1746
1748 uint32_t set,
1749 uint32_t binding,
1750 VkShaderStageFlags stageFlags,
1751 const std::vector<std::string>& textureNames
1752 )
1753 {
1755
1756 /**
1757 * @brief fill in imageInfos.
1758 */
1759 for (size_t i = 0; i < textureNames.size(); i++)
1760 {
1761 RendererResourceCreateInfo resInfo;
1762 resInfo.name = textureNames[i];
1763 const auto info = m_Renderer->m_RendererResourcePool->AccessResource(resInfo);
1764
1765 m_ImageInfos[set][binding].push_back(*info);
1766 }
1767
1768 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1769 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stageFlags, static_cast<uint32_t>(textureNames.size()));
1770
1771 return *this;
1772 }
1773
1775 uint32_t set ,
1776 uint32_t binding ,
1777 VkShaderStageFlags stageFlags ,
1778 const std::vector<std::string>& inputAttachmentNames
1779 )
1780 {
1782
1783 /**
1784 * @brief fill in imageInfos.
1785 */
1786 for (size_t i = 0; i < inputAttachmentNames.size(); i++)
1787 {
1788 RendererResourceCreateInfo resInfo;
1789 resInfo.name = inputAttachmentNames[i];
1790 const auto info = m_Renderer->m_RendererResourcePool->AccessResource(resInfo);
1791
1792 m_ImageInfos[set][binding].push_back(*info);
1793 }
1794
1795 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1796 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, stageFlags, static_cast<uint32_t>(inputAttachmentNames.size()));
1797
1798 return *this;
1799 }
1800
1802 uint32_t set ,
1803 uint32_t binding ,
1804 VkShaderStageFlags stageFlags
1805 )
1806 {
1808
1809 const auto descriptorSet = DescriptorSetManager::Registry(m_DescriptorSetId, set);
1810 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stageFlags, 1);
1811
1812 return *this;
1813 }
1814
1815 void Renderer::DescriptorSetBuilder::Build(const VkAccelerationStructureKHR& accel)
1816 {
1818
1819 const auto& descriptorSets = DescriptorSetManager::GetByName(m_DescriptorSetId);
1820
1821 for (auto& pair : descriptorSets)
1822 {
1823 /**
1824 * @brief UpdateDescriptorSet, skip bindless texture set.
1825 */
1826 if (pair.first == SpicesShader::BINDLESS_TEXTURE_SET)
1827 {
1828 if (!pair.second->Get())
1829 {
1830 pair.second->BuildBindLessTextureDescriptorSet(m_HandledSubPass->GetName());
1831 }
1832
1833 pair.second->UpdateBindLessTextureDescriptorSet(m_ImageInfos[pair.first]);
1834 continue;
1835 }
1836
1837 /**
1838 * @brief AllocateDescriptorSet for Pool.
1839 */
1840 pair.second->BuildDescriptorSet(m_HandledSubPass->GetName());
1841
1842 /**
1843 * @brief UpdateDescriptorSet.
1844 */
1845 pair.second->UpdateDescriptorSet(m_ImageInfos[pair.first], m_BufferInfos[pair.first], accel);
1846 }
1847 }
1848
1849 Renderer::RendererPassBuilder::RendererPassBuilder(const std::string& rendererPassName, Renderer* renderer)
1850 : m_RendererPassName(rendererPassName)
1851 , m_Renderer(renderer)
1852 {
1854
1855 m_Renderer->m_Pass = std::make_shared<RendererPass>(rendererPassName, m_Renderer->m_Device);
1856 }
1857
1859 const std::string& subPassName ,
1861 )
1862 {
1864
1865 const size_t size = m_Renderer->m_Pass->GetSubPasses()->size();
1866 m_HandledRendererSubPass = m_Renderer->m_Pass->AddSubPass(subPassName, static_cast<uint32_t>(size), flags);
1867
1868 return *this;
1869 }
1870
1872 VkAccessFlags srcAccessMask ,
1873 VkAccessFlags dstAccessMask ,
1874 VkPipelineStageFlags srcStageMask ,
1875 VkPipelineStageFlags dstStageMask
1876 )
1877 {
1879
1880 uint32_t index = m_HandledRendererSubPass->GetIndex();
1881 m_HandledRendererSubPass->AddSubPassDependency(index, index, srcAccessMask, dstAccessMask, srcStageMask, dstStageMask);
1882
1883 return *this;
1884 }
1885
1887 {
1889
1890 m_HandledRendererSubPass->BuildSubPassDescription();
1891
1892 const size_t index = m_Renderer->m_Pass->GetSubPasses()->size() - 1;
1893 m_HandledRendererSubPass->BuildSubPassDependency(static_cast<uint32_t>(index));
1894
1895 return *this;
1896 }
1897
1899 {
1901
1902 m_Renderer->m_Pass->BuildRendererPass();
1903 }
1904
1906 Renderer* renderer ,
1907 uint32_t currentFrame ,
1908 uint32_t currentImage ,
1909 const std::array<VkCommandBuffer, MaxFrameInFlight>& cmdBuffers
1910 )
1911 : RenderBehaveBuilder(renderer, currentFrame, currentImage)
1912 {
1914
1915 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
1916 m_CommandBuffer = cmdBuffers[currentFrame];
1917 }
1918
1920 const std::string& materialName ,
1921 VkCommandBuffer cmdBuffer ,
1922 VkPipelineBindPoint bindPoint
1923 )
1924 {
1926
1927 RenderBehaveBuilder::BindPipeline(materialName, cmdBuffer, bindPoint);
1928 }
1929
1931 const DescriptorSetInfo& infos ,
1932 VkCommandBuffer cmdBuffer ,
1933 VkPipelineBindPoint bindPoint
1934 )
1935 {
1937
1938 RenderBehaveBuilder::BindDescriptorSet(infos, cmdBuffer, bindPoint);
1939 }
1940
1942 const DescriptorSetInfo& infos ,
1943 const std::string& name ,
1944 VkCommandBuffer cmdBuffer ,
1945 VkPipelineBindPoint bindPoint
1946 )
1947 {
1949
1950 RenderBehaveBuilder::BindDescriptorSet(infos, name, cmdBuffer, bindPoint);
1951 }
1952
1953 void Renderer::ComputeRenderBehaveBuilder::Dispatch(uint32_t x, uint32_t y, uint32_t z) const
1954 {
1956
1957 vkCmdDispatch(m_CommandBuffer, x, y, z);
1958 }
1959
1961 VulkanImage* image ,
1962 VkAccessFlags srcAccessMask ,
1963 VkAccessFlags dstAccessMask ,
1964 VkPipelineStageFlags srcStageMask ,
1965 VkPipelineStageFlags dstStageMask ,
1966 uint32_t srcQueueFamilyIndex ,
1967 uint32_t dstQueueFamilyIndex ,
1968 VkCommandBuffer cmdBuffer
1969 )
1970 {
1972
1973 image->Barrier(
1974 cmdBuffer ? cmdBuffer : m_CommandBuffer ,
1975 srcAccessMask ,
1976 dstAccessMask ,
1977 srcStageMask ,
1978 dstStageMask ,
1979 srcQueueFamilyIndex ,
1980 dstQueueFamilyIndex
1981 );
1982 }
1983
1985 VulkanImage* image ,
1986 VkAccessFlags srcAccessMask ,
1987 VkAccessFlags dstAccessMask ,
1988 VkPipelineStageFlags srcStageMask ,
1989 VkPipelineStageFlags dstStageMask ,
1990 uint32_t srcQueueFamilyIndex ,
1991 uint32_t dstQueueFamilyIndex ,
1992 VkCommandBuffer cmdBuffer
1993 )
1994 {
1996
1997 image->Barrier(
1998 cmdBuffer ? cmdBuffer : m_CommandBuffer ,
1999 srcAccessMask ,
2000 dstAccessMask ,
2001 srcStageMask ,
2002 dstStageMask ,
2003 srcQueueFamilyIndex ,
2004 dstQueueFamilyIndex
2005 );
2006 }
2007
2009 VulkanImage* image ,
2010 VkAccessFlags srcAccessMask ,
2011 VkAccessFlags dstAccessMask ,
2012 VkPipelineStageFlags srcStageMask ,
2013 VkPipelineStageFlags dstStageMask ,
2014 VkCommandBuffer cmdBuffer
2015 )
2016 {
2018
2019 image->Barrier(
2020 cmdBuffer ? cmdBuffer : m_CommandBuffer ,
2021 srcAccessMask ,
2022 dstAccessMask ,
2023 srcStageMask ,
2024 dstStageMask ,
2025 VK_QUEUE_FAMILY_IGNORED ,
2026 VK_QUEUE_FAMILY_IGNORED
2027 );
2028 }
2029
2031 VulkanImage* image ,
2032 VkAccessFlags srcAccessMask ,
2033 VkAccessFlags dstAccessMask ,
2034 VkPipelineStageFlags srcStageMask ,
2035 VkPipelineStageFlags dstStageMask ,
2036 VkCommandBuffer cmdBuffer
2037 )
2038 {
2040
2041 RenderBehaveBuilder::InternalBarriers(
2042 srcAccessMask ,
2043 dstAccessMask ,
2044 srcStageMask ,
2045 dstStageMask ,
2046 cmdBuffer ? cmdBuffer : m_CommandBuffer
2047 );
2048 }
2049
2051 VkBuffer buffer ,
2052 VkAccessFlags srcAccessMask ,
2053 VkAccessFlags dstAccessMask ,
2054 VkPipelineStageFlags srcStageMask ,
2055 VkPipelineStageFlags dstStageMask ,
2056 uint32_t srcQueueFamilyIndex ,
2057 uint32_t dstQueueFamilyIndex ,
2058 VkCommandBuffer cmdBuffer
2059 )
2060 {
2062
2063 VkBufferMemoryBarrier bufferBarrier {};
2064 bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
2065 bufferBarrier.srcAccessMask = srcAccessMask;
2066 bufferBarrier.dstAccessMask = dstAccessMask;
2067 bufferBarrier.srcQueueFamilyIndex = srcQueueFamilyIndex; // Fetch From Graphic to Compute.
2068 bufferBarrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
2069 bufferBarrier.size = VK_WHOLE_SIZE;
2070 bufferBarrier.buffer = buffer;
2071
2072 vkCmdPipelineBarrier(
2073 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2074 srcStageMask,
2075 dstStageMask,
2076 0,
2077 0, nullptr,
2078 1, &bufferBarrier,
2079 0, nullptr
2080 );
2081 }
2082
2084 VkBuffer buffer ,
2085 VkAccessFlags srcAccessMask ,
2086 VkAccessFlags dstAccessMask ,
2087 VkPipelineStageFlags srcStageMask ,
2088 VkPipelineStageFlags dstStageMask ,
2089 uint32_t srcQueueFamilyIndex ,
2090 uint32_t dstQueueFamilyIndex ,
2091 VkCommandBuffer cmdBuffer
2092 )
2093 {
2095
2096 VkBufferMemoryBarrier bufferBarrier {};
2097 bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
2098 bufferBarrier.srcAccessMask = srcAccessMask;
2099 bufferBarrier.dstAccessMask = dstAccessMask;
2100 bufferBarrier.srcQueueFamilyIndex = srcQueueFamilyIndex; // Release From Compute to Graphic
2101 bufferBarrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
2102 bufferBarrier.size = VK_WHOLE_SIZE;
2103 bufferBarrier.buffer = buffer;
2104
2105 vkCmdPipelineBarrier(
2106 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2107 srcStageMask,
2108 dstStageMask,
2109 0,
2110 0, nullptr,
2111 1, &bufferBarrier,
2112 0, nullptr
2113 );
2114 }
2115
2117 VkBuffer buffer ,
2118 VkAccessFlags srcAccessMask ,
2119 VkAccessFlags dstAccessMask ,
2120 VkPipelineStageFlags srcStageMask ,
2121 VkPipelineStageFlags dstStageMask ,
2122 VkCommandBuffer cmdBuffer
2123 )
2124 {
2126
2127 VkBufferMemoryBarrier bufferBarrier {};
2128 bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
2129 bufferBarrier.srcAccessMask = srcAccessMask;
2130 bufferBarrier.dstAccessMask = dstAccessMask;
2131 bufferBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
2132 bufferBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
2133 bufferBarrier.size = VK_WHOLE_SIZE;
2134 bufferBarrier.buffer = buffer;
2135
2136 vkCmdPipelineBarrier(
2137 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2138 srcStageMask,
2139 dstStageMask,
2140 0,
2141 0, nullptr,
2142 1, &bufferBarrier,
2143 0, nullptr
2144 );
2145 }
2146
2148 VkBuffer buffer ,
2149 VkAccessFlags srcAccessMask ,
2150 VkAccessFlags dstAccessMask ,
2151 VkPipelineStageFlags srcStageMask ,
2152 VkPipelineStageFlags dstStageMask ,
2153 VkCommandBuffer cmdBuffer
2154 )
2155 {
2157
2158 RenderBehaveBuilder::InternalBarriers(
2159 buffer ,
2160 srcAccessMask ,
2161 dstAccessMask ,
2162 srcStageMask ,
2163 dstStageMask ,
2164 cmdBuffer ? cmdBuffer : m_CommandBuffer
2165 );
2166 }
2167
2169 VkAccessFlags srcAccessMask ,
2170 VkAccessFlags dstAccessMask ,
2171 VkPipelineStageFlags srcStageMask ,
2172 VkPipelineStageFlags dstStageMask ,
2173 VkCommandBuffer cmdBuffer
2174 )
2175 {
2177
2178 VkMemoryBarrier barrier {};
2179 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
2180 barrier.srcAccessMask = srcAccessMask;
2181 barrier.dstAccessMask = dstAccessMask;
2182
2183 vkCmdPipelineBarrier(
2184 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2185 srcStageMask,
2186 dstStageMask,
2187 0,
2188 1, &barrier,
2189 0, nullptr,
2190 0, nullptr
2191 );
2192 }
2193
2195 VkAccessFlags srcAccessMask ,
2196 VkAccessFlags dstAccessMask ,
2197 VkPipelineStageFlags srcStageMask ,
2198 VkPipelineStageFlags dstStageMask ,
2199 VkCommandBuffer cmdBuffer
2200 )
2201 {
2203
2204 RenderBehaveBuilder::InternalBarriers(
2205 srcAccessMask ,
2206 dstAccessMask ,
2207 srcStageMask ,
2208 dstStageMask ,
2209 cmdBuffer ? cmdBuffer : m_CommandBuffer
2210 );
2211 }
2212
2214 VulkanImage* image ,
2215 VkAccessFlags srcAccessMask ,
2216 VkAccessFlags dstAccessMask ,
2217 VkPipelineStageFlags srcStageMask ,
2218 VkPipelineStageFlags dstStageMask ,
2219 uint32_t srcQueueFamilyIndex ,
2220 uint32_t dstQueueFamilyIndex ,
2221 VkCommandBuffer cmdBuffer
2222 )
2223 {
2225
2226 RenderBehaveBuilder::AddBarriers(
2227 image ,
2228 srcAccessMask ,
2229 dstAccessMask ,
2230 srcStageMask ,
2231 dstStageMask ,
2232 srcQueueFamilyIndex ,
2233 dstQueueFamilyIndex ,
2234 cmdBuffer ? cmdBuffer : m_CommandBuffer
2235 );
2236 }
2237
2239 VulkanImage* image ,
2240 VkAccessFlags srcAccessMask ,
2241 VkAccessFlags dstAccessMask ,
2242 VkPipelineStageFlags srcStageMask ,
2243 VkPipelineStageFlags dstStageMask ,
2244 uint32_t srcQueueFamilyIndex ,
2245 uint32_t dstQueueFamilyIndex ,
2246 VkCommandBuffer cmdBuffer
2247 )
2248 {
2250
2251 RenderBehaveBuilder::ReleaseBarriers(
2252 image ,
2253 srcAccessMask ,
2254 dstAccessMask ,
2255 srcStageMask ,
2256 dstStageMask ,
2257 srcQueueFamilyIndex ,
2258 dstQueueFamilyIndex ,
2259 cmdBuffer ? cmdBuffer : m_CommandBuffer
2260 );
2261 }
2262
2264 VkBuffer buffer ,
2265 VkAccessFlags srcAccessMask ,
2266 VkAccessFlags dstAccessMask ,
2267 VkPipelineStageFlags srcStageMask ,
2268 VkPipelineStageFlags dstStageMask ,
2269 uint32_t srcQueueFamilyIndex ,
2270 uint32_t dstQueueFamilyIndex ,
2271 VkCommandBuffer cmdBuffer
2272 )
2273 {
2275
2276 RenderBehaveBuilder::AddBarriers(
2277 buffer ,
2278 srcAccessMask ,
2279 dstAccessMask ,
2280 srcStageMask ,
2281 dstStageMask ,
2282 srcQueueFamilyIndex ,
2283 dstQueueFamilyIndex ,
2284 cmdBuffer ? cmdBuffer : m_CommandBuffer
2285 );
2286 }
2287
2289 VkBuffer buffer ,
2290 VkAccessFlags srcAccessMask ,
2291 VkAccessFlags dstAccessMask ,
2292 VkPipelineStageFlags srcStageMask ,
2293 VkPipelineStageFlags dstStageMask ,
2294 uint32_t srcQueueFamilyIndex ,
2295 uint32_t dstQueueFamilyIndex ,
2296 VkCommandBuffer cmdBuffer
2297 )
2298 {
2300
2301 RenderBehaveBuilder::ReleaseBarriers(
2302 buffer ,
2303 srcAccessMask ,
2304 dstAccessMask ,
2305 srcStageMask ,
2306 dstStageMask ,
2307 srcQueueFamilyIndex ,
2308 dstQueueFamilyIndex ,
2309 cmdBuffer ? cmdBuffer : m_CommandBuffer
2310 );
2311 }
2312
2314 const std::string& subPassName ,
2315 Renderer* renderer
2316 )
2317 : m_Renderer(renderer)
2318 , m_SubPassName(subPassName)
2319 {
2321
2322 if (!m_Renderer->m_DGCData[subPassName])
2323 {
2324 m_Renderer->m_DGCData[subPassName] = std::make_shared<VulkanDeviceGeneratedCommandsNV>(m_Renderer->m_VulkanState);
2325 }
2326
2327 m_Renderer->m_DGCData[subPassName]->ResetCommandsLayout();
2328 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
2329 }
2330
2332 {
2334
2335 /**
2336 * @brief Instance a VkIndirectCommandsLayoutTokenNV.
2337 */
2338 VkIndirectCommandsLayoutTokenNV input{};
2339 input.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV;
2340 input.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV;
2341
2342 input.stream = static_cast<uint32_t>(m_InputInfos.size());
2343 input.offset = 0;
2344
2345 input.pIndexTypes = nullptr;
2346 input.pIndexTypeValues = nullptr;
2347
2348 /**
2349 * @brief Store Input.
2350 */
2351 m_InputInfos.push_back(input);
2352 m_HandledDGCData->AddInputStride(sizeof(VkBindShaderGroupIndirectCommandNV));
2353
2354 return *this;
2355 }
2356
2358 {
2360
2361 /**
2362 * @brief Instance a VkIndirectCommandsLayoutTokenNV.
2363 */
2364 VkIndirectCommandsLayoutTokenNV input{};
2365 input.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV;
2366 input.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV;
2367
2368 input.vertexBindingUnit = 0;
2369 input.vertexDynamicStride = VK_FALSE;
2370
2371 input.stream = static_cast<uint32_t>(m_InputInfos.size());
2372 input.offset = 0;
2373
2374 input.pIndexTypes = nullptr;
2375 input.pIndexTypeValues = nullptr;
2376
2377 /**
2378 * @brief Store Input.
2379 */
2380 m_InputInfos.push_back(input);
2381 m_HandledDGCData->AddInputStride(sizeof(VkBindVertexBufferIndirectCommandNV));
2382
2383 return *this;
2384 }
2385
2387 {
2389
2390 /**
2391 * @brief Instance a VkIndirectCommandsLayoutTokenNV.
2392 */
2393 VkIndirectCommandsLayoutTokenNV input{};
2394 input.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV;
2395 input.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV;
2396
2397 input.stream = static_cast<uint32_t>(m_InputInfos.size());
2398 input.offset = 0;
2399
2400 input.pIndexTypes = nullptr;
2401 input.pIndexTypeValues = nullptr;
2402
2403 /**
2404 * @brief Store Input.
2405 */
2406 m_InputInfos.push_back(input);
2407 m_HandledDGCData->AddInputStride(sizeof(VkBindIndexBufferIndirectCommandNV));
2408
2409 return *this;
2410 }
2411
2413 {
2415
2416 std::stringstream ss;
2417 ss << m_Renderer->m_RendererName << "." << m_SubPassName << ".Default";
2418
2419 /**
2420 * @brief Instance a VkIndirectCommandsLayoutTokenNV.
2421 */
2422 VkIndirectCommandsLayoutTokenNV input{};
2423 input.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV;
2424 input.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV;
2425
2426 input.pushconstantPipelineLayout = m_Renderer->m_Pipelines.Find(ss.str())->GetPipelineLayout();
2427 input.pushconstantShaderStageFlags = VK_SHADER_STAGE_ALL;
2428 input.pushconstantOffset = 0;
2429 input.pushconstantSize = sizeof(VkDeviceAddress);
2430
2431 input.stream = static_cast<uint32_t>(m_InputInfos.size());
2432 input.offset = 0;
2433
2434 input.pIndexTypes = nullptr;
2435 input.pIndexTypeValues = nullptr;
2436
2437 /**
2438 * @brief Store Input.
2439 */
2440 m_InputInfos.push_back(input);
2441 m_HandledDGCData->AddInputStride(sizeof(VkDeviceAddress));
2442
2443 return *this;
2444 }
2445
2447 {
2449
2450 /**
2451 * @brief Instance a VkIndirectCommandsLayoutTokenNV.
2452 */
2453 VkIndirectCommandsLayoutTokenNV input{};
2454 input.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV;
2455 input.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV;
2456
2457 input.stream = static_cast<uint32_t>(m_InputInfos.size());
2458 input.offset = 0;
2459
2460 input.pIndexTypes = nullptr;
2461 input.pIndexTypeValues = nullptr;
2462
2463 /**
2464 * @brief Store Input.
2465 */
2466 m_InputInfos.push_back(input);
2467 m_HandledDGCData->AddInputStride(sizeof(VkDrawIndexedIndirectCommand));
2468
2469 return *this;
2470 }
2471
2473 {
2475
2476 /**
2477 * @brief Instance a VkIndirectCommandsLayoutTokenNV.
2478 */
2479 VkIndirectCommandsLayoutTokenNV input{};
2480 input.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV;
2481 input.tokenType = VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV;
2482
2483 input.stream = static_cast<uint32_t>(m_InputInfos.size());
2484 input.offset = 0;
2485
2486 input.pIndexTypes = nullptr;
2487 input.pIndexTypeValues = nullptr;
2488
2489 /**
2490 * @brief Store Input.
2491 */
2492 m_InputInfos.push_back(input);
2493 m_HandledDGCData->AddInputStride(sizeof(VkDrawMeshTasksIndirectCommandNV));
2494
2495 return *this;
2496 }
2497
2499 {
2501
2502 /**
2503 * @brief Create IndirectCommandsLayout.
2504 */
2505 m_HandledDGCData->BuildCommandLayout(m_InputInfos);
2506 }
2507
2509 std::shared_ptr<RendererSubPass> subPass,
2510 std::shared_ptr<Material> material,
2511 Renderer* renderer
2512 )
2513 : m_Renderer(renderer)
2517 {}
2518
2520 {
2522
2523 /**
2524 * @brief Init Config.
2525 */
2526 VulkanPipeline::DefaultPipelineConfigInfo(m_pipelineConfig);
2527
2528 return *this;
2529 }
2530
2532 {
2534
2535 m_pipelineConfig.bindingDescriptions = {};
2536
2537 return *this;
2538 }
2539
2541 {
2543
2544 m_pipelineConfig.attributeDescriptions = {};
2545
2546 return *this;
2547 }
2548
2550 const std::vector<VkVertexInputBindingDescription>& inputs
2551 )
2552 {
2554
2555 m_pipelineConfig.bindingDescriptions = inputs;
2556
2557 return *this;
2558 }
2559
2561 const std::vector<VkVertexInputAttributeDescription>& inputs
2562 )
2563 {
2565
2566 m_pipelineConfig.attributeDescriptions = inputs;
2567
2568 return *this;
2569 }
2570
2572 {
2574
2575 m_pipelineConfig.renderPass = m_Renderer->m_Pass;
2576
2577 return *this;
2578 }
2579
2581 {
2583
2584 m_pipelineConfig.subpass = m_HandledSubPass->GetIndex();
2585
2586 return *this;
2587 }
2588
2590 {
2592
2593 m_pipelineConfig.pipelineLayout = layout;
2594
2595 return *this;
2596 }
2597
2599 {
2601
2602 m_pipelineConfig.rasterizationInfo.cullMode = cullMode;
2603
2604 return *this;
2605 }
2606
2608 {
2610
2611 m_pipelineConfig.colorBlendInfo.attachmentCount = static_cast<uint32_t>(m_HandledSubPass->GetColorBlend().size());
2612 m_pipelineConfig.colorBlendInfo.pAttachments = m_HandledSubPass->GetColorBlend().data();
2613
2614 return *this;
2615 }
2616
2618 {
2620
2621 const auto pipeline = std::make_shared<VulkanPipeline>(
2622 m_Renderer->m_VulkanState ,
2623 m_Material->GetName() ,
2624 m_Material->GetShaderPath() ,
2625 m_pipelineConfig
2626 );
2627
2628 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2629 {
2630 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2631 }
2632
2633 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2634 }
2635
2637 {
2639
2640 const auto pipeline = std::make_shared<VulkanMeshPipeline>(
2641 m_Renderer->m_VulkanState ,
2642 m_Material->GetName() ,
2643 m_Material->GetShaderPath() ,
2644 m_pipelineConfig
2645 );
2646
2647 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2648 {
2649 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2650 }
2651
2652 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2653 }
2654
2656 {
2658
2659 const auto pipeline = std::make_shared<VulkanComputePipeline>(
2660 m_Renderer->m_VulkanState ,
2661 m_Material->GetName() ,
2662 m_Material->GetShaderPath() ,
2663 m_pipelineConfig
2664 );
2665
2666 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2667 {
2668 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2669 }
2670
2671 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2672 }
2673
2674 void Renderer::PipelineBuilder::BuildRayTracing(const std::unordered_map<std::string, uint32_t>& hitGroups)
2675 {
2677
2678 std::unordered_map<std::string, std::vector<std::string>> stages(m_Material->GetShaderPath());
2679 for (auto& pair : hitGroups)
2680 {
2681 stages["rchit"].push_back(pair.first);
2682 }
2683
2684 const auto pipeline = std::make_shared<VulkanRayTracingPipeline>(
2685 m_Renderer->m_VulkanState ,
2686 m_Material->GetName() ,
2687 stages ,
2688 m_pipelineConfig
2689 );
2690
2691 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2692 {
2693 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2694 }
2695
2696 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2697 }
2698
2699 void Renderer::PipelineBuilder::BuildDeviceGeneratedCommand(const std::string& pipelineName, const std::string& materialName, VulkanDeviceGeneratedCommandsNV* indirectPtr)
2700 {
2702
2703 indirectPtr->CreateMeshPipeline(pipelineName, materialName, m_pipelineConfig);
2704 }
2705}
static constexpr uint32_t MAX_DIRECTIONALLIGHT_NUM
Definition Renderer.h:46
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
bool IsActive() const
Query whether this camera is primary.
CameraComponent Class. This class defines the specific behaves of CameraComponent.
This Class manages all descriptor sets this project.
const SpicesShader::DirectionalLight & GetLight() const
Get the DirectionalLight variable.
DirectionalLightComponent Class. This class defines the specific behaves of DirectionalLightComponent...
FrameInfo Class. This class defines the FrameInfo data.
Definition FrameInfo.h:32
Material Class. This class contains a branch of parameter and shader, also descriptor.
Definition Material.h:62
const SpicesShader::PointLight & GetLight() const
Get the PointLight variable.
PointLightComponent Class. This class defines the specific behaves of PointLightComponent.
uint32_t StatisticsFlags
Definition Querier.h:32
Basic interface of Queries.
Definition Querier.h:17
This class is a wrapper of VulkanRenderPass. Used during Renderer.
RendererResourcePool Class. This class is a pool of all framebuffer's attachment.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.
virtual void 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 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.
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.
DGCLayoutBuilder & AddPushConstantInput()
Add Binding PushConstant Command to Input.
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.
void Build(const VkAccelerationStructureKHR &accel=VK_NULL_HANDLE)
Create all buffer type descriptor set. Create pipeline layout.
String2 m_DescriptorSetId
The Descriptor Set Manager ID descriptorSet belongs to.
Definition Renderer.h:730
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.
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.
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.
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
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 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.
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 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
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.
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 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 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 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.
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 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.
void Build() const
Build the RendererPass.
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 & AddSelfDependency(VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask)
Add subPass Self Dependency.
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.
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
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 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
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
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
bool m_IsLoadDefaultMaterial
Whether should load a default renderer material.
Definition Renderer.h:2032
virtual void CreateDescriptorSet()=0
This interface is called during OnSystemInitialize(). Create all sub pass descriptorSet.
static std::shared_ptr< scl::behave_state_list< void, Renderer::RenderBehaveBuilder *, VkCommandBuffer > > m_StatisticsStateList
Statistics StateList.
Definition Renderer.h:1985
DescriptorSetManager::DescriptorSetCombineFlags m_DescriptorSetCombine
Combination of DescriptorSet.
Definition Renderer.h:2027
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
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
Definition Renderer.h:1992
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 Class. This class defines the basic behaves of renderer. When we add an new Renderer,...
Definition Renderer.h:57
TransformComponent Class. This class defines the specific behaves of TransformComponent.
This Class is a Wrapper of VulkanBuffer.
VulkanDescriptorPool Class. This class is the wrapper of VkDescriptorPool.
VulkanDeviceGeneratedCommandsNV Class. This class defines the VulkanDeviceGeneratedCommandsNV behaves...
VulkanInstance Class. This class defines the VulkanDevice behave. This class is just a wrapper of vkd...
TextureType
The enum of all Texture Type.
Definition Texture.h:20
uint32_t height
Texture' height..
uint32_t mipLevel
Texture's mipmap level.
TextureType type
Texture's Class Type.
std::string name
Texture's name.
This struct defines the data used to create a texture2d. From render pass.
UInt2(const uint32_t &x, const uint32_t &y)
Constructor Function.
Definition Math.h:30
double unsigned int
Definition Math.h:17
This struct contains all Vulkan object in used global.
Definition VulkanUtils.h:74