2
3
4
5
9#include "Systems/SlateSystem.h"
10#include "Resources/ResourcePool/ResourcePool.h"
11#include "Render/Vulkan/VulkanRenderBackend.h"
17 const std::string& rendererName ,
22 bool isLoadDefaultMaterial
35 m_RenderCache = std::make_shared<RendererCache>();
43
44
48
49
53
54
61
62
71
72
73 m_RenderCache->ClearCaches();
76
77
81
82
91
92
93 m_RenderCache->ClearCaches();
101
102
103
104 std::map<uint32_t, VkDescriptorSetLayout> sortedRowSetLayouts;
107
108
111 const auto preRendererSetInfo = DescriptorSetManager::GetByName(
"PreRenderer");
112 for (
auto& pair : preRendererSetInfo)
114 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
119
120
123 const auto specificRendererSetInfo = DescriptorSetManager::GetByName({ m_Pass->GetName(), subPassName });
124 for (
auto& pair : specificRendererSetInfo)
126 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
131
132
133
134 const auto material = ResourcePool<Material>::Load<Material>(materialName, materialName);
141
142
143 std::vector<VkDescriptorSetLayout> rowSetLayouts;
145 for (
auto& pair : sortedRowSetLayouts)
147 rowSetLayouts.push_back(pair.second);
151
152
153 const auto subPass = *m_Pass->GetSubPasses()->find_value(subPassName);
154 VkPipelineLayout pipelineLayout = CreatePipelineLayout(rowSetLayouts, subPass);
157
158
159 CreatePipeline(material, pipelineLayout, subPass);
167
168
169
170 std::map<uint32_t, VkDescriptorSetLayout> sortedRowSetLayouts;
173
174
175 const auto preRendererSetInfo = DescriptorSetManager::GetByName(
"PreRenderer");
176 for (
auto& pair : preRendererSetInfo)
178 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
182
183
184 const auto specificRendererSetInfo = DescriptorSetManager::GetByName({ m_Pass->GetName(), subPassName});
185 for (
auto& pair : specificRendererSetInfo)
187 sortedRowSetLayouts[pair.first] = pair.second->GetRowSetLayout();
191
192
193
194 const auto material = ResourcePool<Material>::Load<Material>(materialName, materialName);
197
198
199 std::vector<VkDescriptorSetLayout> rowSetLayouts;
201 for (
auto& pair : sortedRowSetLayouts)
203 rowSetLayouts.push_back(pair.second);
207
208
209 const auto& subPass = *m_Pass->GetSubPasses()->find_value(subPassName);
210 VkPipelineLayout pipelineLayout = CreatePipelineLayout(rowSetLayouts, subPass);
213
214
215 std::stringstream ss;
216 ss << materialName <<
".DGC";
217 CreateDeviceGeneratedCommandsPipeline(ss.str(), materialName, pipelineLayout, subPass, indirectPtr);
224 std::stringstream ss;
228
229
230 return ResourcePool<Material>::Load<Material>(ss.str(), ss.str());
238
239
240 m_Pass->GetSubPasses()->for_each([&](
const auto& K,
const auto& V) {
242 std::stringstream ss;
243 ss << m_RendererName <<
"." << K <<
".Default";
246
247
248 auto material = GetDefaultMaterial(K);
249 material->BuildMaterial();
252
253
262 std::stringstream ss;
266
267
279
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;
288 if (subPass->IsUsePushConstant())
290 pipelineLayoutInfo.pushConstantRangeCount = 1;
291 pipelineLayoutInfo.pPushConstantRanges = &subPass->GetPushConstant();
295
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")
301 return pipelineLayout;
309
310
311 glm::mat4 invViewMat = glm::mat4(1.0f);
312 glm::mat4 projectionMat = glm::mat4(1.0f);
313 unsigned int stableFrames = 0;
319
320
332
333
334 invViewMat = transComp.GetModelMatrix();
335 projectionMat = camComp.GetCamera()->GetPMatrixReverseZ();
336 stableFrames = camComp.GetCamera()->GetStableFrames();
337 fov = glm::radians(camComp.GetCamera()->GetPerspectiveParam().fov);
340
341
345
346
352
353
358
359
362 std::stringstream ss;
363 ss <<
m_RendererName <<
": " <<
"not find a active camera in world, please check again";
365 SPICES_CORE_WARN(ss.str())
368 return std::make_tuple(invViewMat, projectionMat, stableFrames, fov);
376
377
387 SpicesShader::DirectionalLight directionalLight = dirlightComp
.GetLight();
388 directionalLight.rotationMatrix = tranComp.GetRotateMatrix();
389 dLightBuffer[index] = directionalLight;
395
396
397 dLightBuffer[index].intensity = -1000.0f;
406 directionalLight[i] = glm::mat4(1.0f);
419 camTranComp = tranComp;
420 ratio = camComp.GetCamera()->GetAspectRatio();
433 tempComp.SetPosition(camTranComp.GetPosition());
434 tempComp.SetRotation(camTranComp.GetRotation());
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);
439 directionalLight[index] = projection * glm::inverse(view);
450
451
461 SpicesShader::PointLight pointLight = plightComp
.GetLight();
462 pointLight.position = tranComp.GetPosition();
463 pLightBuffer[index] = pointLight;
469
470
471 pLightBuffer[index].intensity = -1000.0f;
484 m_CommandBuffer = m_Renderer->m_VulkanState.m_GraphicCommandBuffer[currentFrame];
487
488
491 m_Renderer->m_StatisticsStateList = std::make_shared<scl::behave_state_list<
void, RenderBehaveBuilder*, VkCommandBuffer>>();
495 const auto state =
m_Renderer->m_StatisticsStateList->AddNode();
497 state->PushBehave(
"EndRenderer",
nullptr);
498 state->PushBehave(
"BeginStatistics",
nullptr);
499 state->PushBehave(
"EndStatistics",
nullptr);
506 const auto state =
m_Renderer->m_StatisticsStateList->AddNode();
508 state->PushBehave(
"EndRenderer",
nullptr);
509 state->PushBehave(
"BeginStatistics", [=](RenderBehaveBuilder* builder, VkCommandBuffer commandBuffer) {
510 builder->GetStatisticsRendererPass()->BeginStatistics(commandBuffer,
static_cast<Querier::StatisticsBits>(1 << i));
512 state->PushBehave(
"EndStatistics", [=](RenderBehaveBuilder* builder, VkCommandBuffer commandBuffer) {
513 builder->GetStatisticsRendererPass()->EndStatistics(commandBuffer,
static_cast<Querier::StatisticsBits>(1 << i));
520 const auto state =
m_Renderer->m_StatisticsStateList->AddNode();
522 state->PushBehave(
"EndRenderer", [](RenderBehaveBuilder* builder, VkCommandBuffer commandBuffer) {
523 AsyncTask(ThreadPoolEnum::Custom, [&](std::shared_ptr<RendererSubPass> subPass) {
524 subPass->StoreStatistics();
525 }, builder->GetStatisticsRendererPass());
527 state->PushBehave(
"BeginStatistics",
nullptr);
528 state->PushBehave(
"EndStatistics",
nullptr);
533 const auto state =
m_Renderer->m_StatisticsStateList->AddNode();
535 state->PushBehave(
"EndRenderer",
nullptr);
536 state->PushBehave(
"BeginStatistics",
nullptr);
537 state->PushBehave(
"EndStatistics",
nullptr);
548 return *
m_Renderer->m_Pass->GetSubPasses()->first();
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)
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")
576
577
578 return m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [=](
const VkCommandBuffer& cmdBuffer) {
588
589
590 std::future<VkCommandBuffer> futureCmdBuffer = m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
595
596
597 Wait(futureCmdBuffer);
604 const VkCommandBuffer buffers = futureCmdBuffer.get();
607
608
609 vkCmdExecuteCommands(m_CommandBuffer, 1, &buffers);
616 std::vector<VkCommandBuffer> buffers(futureCmdBuffers.size());
618 for (size_t i = 0; i < buffers.size(); i++)
620 buffers[i] = futureCmdBuffers[i].get();
624
625
626 vkCmdExecuteCommands(m_CommandBuffer, buffers.size(), buffers.data());
634 cmdBuffer ? cmdBuffer : m_CommandBuffer,
636 m_Renderer->m_Pipelines.Find(materialName)->GetPipeline()
645 cmdBuffer ? cmdBuffer : m_CommandBuffer,
655 m_Renderer->SubmitCmdsParallel(
658 [&](
const VkCommandBuffer& cmdBuffer)
663 m_Renderer->m_Pipelines.Find(materialName)->GetPipeline()
673
674
675
676 VkViewport viewport {};
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;
685
686
687
688 if (SlateSystem::GetRegister())
690 const ImVec2 viewPortSize = SlateSystem::GetRegister()->GetViewPort()->GetPanelSize();
692 viewport.y = viewPortSize.y;
693 viewport.width = viewPortSize.x;
694 viewport.height = -viewPortSize.y;
698
699
701 scissor.offset = { 0, 0 };
702 scissor.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
705
706
707 vkCmdSetViewport(cmdBuffer ? cmdBuffer : m_CommandBuffer, 0, 1, &viewport);
710
711
712 vkCmdSetScissor(cmdBuffer ? cmdBuffer : m_CommandBuffer, 0, 1, &scissor);
720
721
722
723 VkViewport viewport {};
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;
732
733
734
735 if (SlateSystem::GetRegister())
737 const ImVec2 viewPortSize = SlateSystem::GetRegister()->GetViewPort()->GetPanelSize();
739 viewport.y = viewPortSize.y;
740 viewport.width = viewPortSize.x;
741 viewport.height = -viewPortSize.y;
745
746
748 scissor.offset = { 0, 0 };
749 scissor.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
751 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
754
755
756 vkCmdSetViewport(cmdBuffer, 0, 1, &viewport);
759
760
761 vkCmdSetScissor(cmdBuffer, 0, 1, &scissor);
769 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
771 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
773 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
774 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
784 vkCmdNextSubpass(m_CommandBuffer, VK_SUBPASS_CONTENTS_INLINE);
792
793
794 RENDERPASS_STATISTICS_ENDSTATISTICS(
this, m_CommandBuffer)
795 RENDERPASS_STATISTICS_ENDRENDERER(
this)
797 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
799 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
801 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
802 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
813
814
815 RENDERPASS_STATISTICS_BEGINSTATISTICS(
this, m_CommandBuffer)
822 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
824 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
826 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
827 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
832 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
833 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
837 vkCmdNextSubpass(m_CommandBuffer, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
844 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
846 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
849
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 };
858
859
860 if (m_Renderer->m_Pass->IsUseSwapChain() || !SlateSystem::GetRegister())
862 renderPassInfo.renderArea.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
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;
871 renderPassInfo.clearValueCount =
static_cast<uint32_t>(m_Renderer->m_Pass->GetClearValues().size());
872 renderPassInfo.pClearValues = m_Renderer->m_Pass->GetClearValues().data();
874 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
875 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
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)
880 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
881 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
883 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Enter Pass:" + m_Renderer->m_Pass->GetName())
886
887
888 RENDERPASS_STATISTICS_BEGINSTATISTICS(
this, m_CommandBuffer)
890 vkCmdBeginRenderPass(m_CommandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
897 return m_HandledSubPass;
904 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
906 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
908 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
909 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
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)
914 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
915 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
917 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Enter Pass:" + m_Renderer->m_Pass->GetName())
920
921
922 RENDERPASS_STATISTICS_BEGINSTATISTICS(
this, m_CommandBuffer)
929 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
931 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
934
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 };
943
944
945 if (m_Renderer->m_Pass->IsUseSwapChain() || !SlateSystem::GetRegister())
947 renderPassInfo.renderArea.extent = m_Renderer->m_Device->GetSwapChainSupport().surfaceSize;
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;
956 renderPassInfo.clearValueCount =
static_cast<uint32_t>(m_Renderer->m_Pass->GetClearValues().size());
957 renderPassInfo.pClearValues = m_Renderer->m_Pass->GetClearValues().data();
959 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
960 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
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)
965 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
966 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
968 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Enter Pass:" + m_Renderer->m_Pass->GetName())
971
972
973 RENDERPASS_STATISTICS_BEGINSTATISTICS(
this, m_CommandBuffer)
976
977
978 vkCmdBeginRenderPass(m_CommandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
985 vkCmdEndRenderPass(m_CommandBuffer);
988
989
990 RENDERPASS_STATISTICS_ENDSTATISTICS(
this, m_CommandBuffer)
991 RENDERPASS_STATISTICS_ENDRENDERER(
this)
993 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Leave Pass:" + m_Renderer->m_Pass->GetName())
995 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
996 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
998 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
999 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
1001 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1002 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1010
1011
1012 RENDERPASS_STATISTICS_ENDSTATISTICS(
this, m_CommandBuffer)
1013 RENDERPASS_STATISTICS_ENDRENDERER(
this)
1015 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Leave Pass:" + m_Renderer->m_Pass->GetName())
1017 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1018 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1020 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
1021 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
1023 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1024 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1029 VulkanRayTracing* rayTracing ,
1030 uint32_t currentFrame ,
1031 uint32_t currentImage
1038 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
1045 return m_HandledSubPass;
1052 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
1054 m_HandledDGCData = m_Renderer->m_DGCData[m_HandledSubPass->GetName()];
1056 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_Renderer->m_Pass->GetName())
1057 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
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)
1062 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_Renderer->m_Pass->GetName())
1063 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
1065 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Enter Pass:" + m_Renderer->m_Pass->GetName())
1068
1069
1070 RENDERPASS_STATISTICS_BEGINSTATISTICS(
this, m_CommandBuffer)
1076
1077
1078 RENDERPASS_STATISTICS_ENDSTATISTICS(
this, m_CommandBuffer)
1079 RENDERPASS_STATISTICS_ENDRENDERER(
this)
1081 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_CommandBuffer, m_Renderer->m_VulkanState.m_VkFunc,
"Leave Pass:" + m_Renderer->m_Pass->GetName())
1083 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1084 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1086 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 2)
1087 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_CommandBuffer, 1)
1089 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1090 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1098
1099
1100 RENDERPASS_STATISTICS_ENDSTATISTICS(
this, m_CommandBuffer)
1101 RENDERPASS_STATISTICS_ENDRENDERER(
this)
1103 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->find_value(subPassName);
1105 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
1107 NSIGHTPERF_GPUPROFILERREPORT_POPRANGE(m_CommandBuffer)
1108 NSIGHTPERF_GPUPROFILERREPORF_PUSHRANGE(m_CommandBuffer, m_HandledSubPass->GetName())
1113 DEBUGUTILS_ENDLABEL(m_CommandBuffer)
1114 DEBUGUTILS_BEGINLABEL(m_CommandBuffer, m_HandledSubPass->GetName())
1119
1120
1121 RENDERPASS_STATISTICS_BEGINSTATISTICS(
this, m_CommandBuffer)
1125 const std::string& materialName ,
1126 VkCommandBuffer cmdBuffer ,
1127 VkPipelineBindPoint bindPoint
1132 RenderBehaveBuilder::BindPipeline(materialName, cmdBuffer, bindPoint);
1136 VkPipeline pipeline ,
1137 VkCommandBuffer cmdBuffer,
1138 VkPipelineBindPoint bindPoint
1143 RenderBehaveBuilder::BindPipeline(pipeline, cmdBuffer, bindPoint);
1147 const std::string& materialName ,
1148 VkPipelineBindPoint bindPoint
1153 RenderBehaveBuilder::BindPipelineAsync(materialName, bindPoint);
1157 const DescriptorSetInfo& infos ,
1158 VkCommandBuffer cmdBuffer ,
1159 VkPipelineBindPoint bindPoint
1164 RenderBehaveBuilder::BindDescriptorSet(infos, cmdBuffer, bindPoint);
1168 const DescriptorSetInfo& infos ,
1169 VkPipelineBindPoint bindPoint
1174 RenderBehaveBuilder::BindDescriptorSetAsync(infos, bindPoint);
1178 const DescriptorSetInfo& infos ,
1179 const std::string& name ,
1180 VkCommandBuffer cmdBuffer ,
1181 VkPipelineBindPoint bindPoint
1186 RenderBehaveBuilder::BindDescriptorSet(infos, name, cmdBuffer, bindPoint);
1190 const DescriptorSetInfo& infos ,
1191 const std::string& name ,
1192 VkPipelineBindPoint bindPoint
1197 RenderBehaveBuilder::BindDescriptorSetAsync(infos, name, bindPoint);
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);
1208
1209
1210
1211 m_Renderer->m_VulkanState.m_VkFunc.vkCmdTraceRaysKHR(
1213 &m_VulkanRayTracing->GetRgenRegion() ,
1214 &m_VulkanRayTracing->GetMissRegion() ,
1215 &m_VulkanRayTracing->GetHitRegion() ,
1216 &m_VulkanRayTracing->GetCallRegion() ,
1224 const VkStridedDeviceAddressRegionKHR* rgenRegion,
1225 const VkStridedDeviceAddressRegionKHR* missRegion,
1226 const VkStridedDeviceAddressRegionKHR* hitRegion,
1227 const VkStridedDeviceAddressRegionKHR* callRegion
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);
1236
1237
1238 m_Renderer->m_VulkanState.m_VkFunc.vkCmdTraceRaysKHR(
1251 const VkStridedDeviceAddressRegionKHR* rgenRegion ,
1252 const VkStridedDeviceAddressRegionKHR* missRegion ,
1253 const VkStridedDeviceAddressRegionKHR* hitRegion ,
1254 const VkStridedDeviceAddressRegionKHR* callRegion
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);
1263
1264
1265
1266 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
1267 m_Renderer->m_VulkanState.m_VkFunc.vkCmdTraceRaysKHR(
1281 const DescriptorSetInfo& infos ,
1282 VkCommandBuffer cmdBuffer ,
1283 VkPipelineBindPoint bindPoint
1288 std::stringstream ss;
1289 ss << m_Renderer->m_RendererName <<
"." << m_HandledSubPass->GetName() <<
".Default";
1291 BindDescriptorSet(infos, ss.str(), cmdBuffer, bindPoint);
1295 const DescriptorSetInfo& infos ,
1296 const std::string& name ,
1297 VkCommandBuffer cmdBuffer ,
1298 VkPipelineBindPoint bindPoint
1304
1305
1306 for (
const auto& pair : infos)
1308 vkCmdBindDescriptorSets(
1309 cmdBuffer ? cmdBuffer : m_CommandBuffer,
1311 m_Renderer->m_Pipelines.Find(name)->GetPipelineLayout(),
1314 &pair.second->Get(),
1322 const DescriptorSetInfo& infos ,
1323 VkPipelineBindPoint bindPoint
1328 std::stringstream ss;
1329 ss << m_Renderer->m_RendererName <<
"." << m_HandledSubPass->GetName() <<
".Default";
1331 BindDescriptorSetAsync(infos, ss.str(), bindPoint);
1335 const DescriptorSetInfo& infos ,
1336 const std::string& name ,
1337 VkPipelineBindPoint bindPoint
1342 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& secCmdBuffer) {
1345
1346
1347 for (
const auto& pair : infos)
1349 vkCmdBindDescriptorSets(
1352 m_Renderer->m_Pipelines.Find(name)->GetPipelineLayout(),
1355 &pair.second->Get(),
1367 PreprocessDGC_NV(cmdBuffer);
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 ,
1377 ExecuteDGC_NV(cmdBuffer);
1384 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
1385 PreprocessDGC_NV(cmdBuffer);
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 ,
1395 ExecuteDGC_NV(cmdBuffer);
1404
1405
1406 m_HandledDGCData->PreprocessDGC(cmdBuffer ? cmdBuffer : m_CommandBuffer);
1414
1415
1416 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
1417 m_HandledDGCData->PreprocessDGC(cmdBuffer);
1426
1427
1428 m_HandledDGCData->ExecuteDGC(cmdBuffer ? cmdBuffer : m_CommandBuffer);
1436
1437
1438 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
1439 m_HandledDGCData->ExecuteDGC(cmdBuffer);
1448
1449
1450 vkCmdDraw(cmdBuffer ? cmdBuffer : m_CommandBuffer, 3, 1, 0, 0);
1458
1459
1460 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
1461 vkCmdDraw(cmdBuffer, 3, 1, 0, 0);
1466 VkAccessFlags srcAccessMask ,
1467 VkAccessFlags dstAccessMask ,
1468 VkPipelineStageFlags srcStageMask ,
1469 VkPipelineStageFlags dstStageMask ,
1470 VkCommandBuffer cmdBuffer
1476
1477
1478 VkMemoryBarrier barrier{};
1479 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1480 barrier.srcAccessMask = srcAccessMask;
1481 barrier.dstAccessMask = dstAccessMask;
1484
1485
1486 vkCmdPipelineBarrier(
1487 cmdBuffer ? cmdBuffer : m_CommandBuffer,
1490 VK_DEPENDENCY_BY_REGION_BIT,
1498 VkAccessFlags srcAccessMask ,
1499 VkAccessFlags dstAccessMask ,
1500 VkPipelineStageFlags srcStageMask ,
1501 VkPipelineStageFlags dstStageMask
1507
1508
1509 VkMemoryBarrier barrier{};
1510 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1511 barrier.srcAccessMask = srcAccessMask;
1512 barrier.dstAccessMask = dstAccessMask;
1515
1516
1517 m_Renderer->SubmitCmdsParallel(m_CommandBuffer, m_SubPassIndex, [&](
const VkCommandBuffer& cmdBuffer) {
1518 vkCmdPipelineBarrier(
1522 VK_DEPENDENCY_BY_REGION_BIT,
1531 const std::string& subPassName ,
1538 m_HandledSubPass = *renderer->m_Pass->GetSubPasses()->find_value(subPassName);
1539 m_DescriptorSetId = { m_Renderer->m_Pass->GetName(), m_HandledSubPass->GetName() };
1547
1548
1549 m_HandledSubPass->SetPushConstant([&](
auto& range) {
1550 range.stageFlags = VK_SHADER_STAGE_ALL;
1562 VkShaderStageFlags stageFlags
1570
1571
1572 m_HandledSubPass->GetBuffers(id) = std::make_shared<VulkanBuffer>(
1573 m_Renderer->m_VulkanState,
1576 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
1577 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1581
1582
1583 m_BufferInfos[set][binding] = *m_HandledSubPass->GetBuffers(id)->GetBufferInfo();
1586
1587
1589 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, stageFlags, 1);
1598 VkShaderStageFlags stageFlags
1606
1607
1608 m_HandledSubPass->GetBuffers(id) = std::make_shared<VulkanBuffer>(
1609 m_Renderer->m_VulkanState,
1612 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
1613 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
1614 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1618
1619
1620 m_BufferInfos[set][binding] = *m_HandledSubPass->GetBuffers(id)->GetBufferInfo();
1623
1624
1626 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageFlags, 1);
1634 VkShaderStageFlags stageFlags ,
1643
1644
1645 m_HandledSubPass->GetBuffers(id) = buffer;
1648
1649
1650 m_BufferInfos[set][binding] = *m_HandledSubPass->GetBuffers(id)->GetBufferInfo();
1653
1654
1656 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageFlags, 1);
1664 VkShaderStageFlags stageFlags ,
1665 const std::vector<std::string>& textureNames ,
1673
1674
1675 for (size_t i = 0; i < textureNames.size(); i++)
1677 RendererResourceCreateInfo info;
1678 info.name = textureNames[i];
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;
1686 VkDescriptorImageInfo* imageInfo = m_Renderer->m_RendererResourcePool->AccessResource(info);
1687 imageInfo->imageLayout = VK_IMAGE_LAYOUT_GENERAL;
1689 m_ImageInfos[set][binding].push_back(*imageInfo);
1693
1694
1696 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stageFlags,
static_cast<uint32_t>(textureNames.size()));
1704 VkShaderStageFlags stageFlags ,
1705 const std::string& textureName ,
1714
1715
1717 info
.name = textureName;
1719 info
.width =
m_Renderer->m_Device->GetSwapChainSupport().surfaceSize.width;
1721 info.description.samples = VK_SAMPLE_COUNT_1_BIT;
1722 info.description.format = format;
1723 info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
1732 VkDescriptorImageInfo* imageInfo = m_Renderer->m_RendererResourcePool->AccessResource(info, i);
1733 imageInfo->imageLayout = VK_IMAGE_LAYOUT_GENERAL;
1735 m_ImageInfos[set][binding].push_back(*imageInfo);
1739
1740
1742 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stageFlags,
static_cast<uint32_t>(info.mipLevel));
1750 VkShaderStageFlags stageFlags,
1751 const std::vector<std::string>& textureNames
1757
1758
1759 for (size_t i = 0; i < textureNames.size(); i++)
1761 RendererResourceCreateInfo resInfo;
1762 resInfo.name = textureNames[i];
1763 const auto info = m_Renderer->m_RendererResourcePool->AccessResource(resInfo);
1765 m_ImageInfos[set][binding].push_back(*info);
1769 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stageFlags,
static_cast<uint32_t>(textureNames.size()));
1777 VkShaderStageFlags stageFlags ,
1778 const std::vector<std::string>& inputAttachmentNames
1784
1785
1786 for (size_t i = 0; i < inputAttachmentNames.size(); i++)
1788 RendererResourceCreateInfo resInfo;
1789 resInfo.name = inputAttachmentNames[i];
1790 const auto info = m_Renderer->m_RendererResourcePool->AccessResource(resInfo);
1792 m_ImageInfos[set][binding].push_back(*info);
1796 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, stageFlags,
static_cast<uint32_t>(inputAttachmentNames.size()));
1804 VkShaderStageFlags stageFlags
1810 descriptorSet->AddBinding(binding, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stageFlags, 1);
1819 const auto& descriptorSets = DescriptorSetManager::GetByName(m_DescriptorSetId);
1821 for (
auto& pair : descriptorSets)
1824
1825
1826 if (pair.first == SpicesShader::BINDLESS_TEXTURE_SET)
1828 if (!pair.second->Get())
1830 pair.second->BuildBindLessTextureDescriptorSet(m_HandledSubPass->GetName());
1833 pair.second->UpdateBindLessTextureDescriptorSet(m_ImageInfos[pair.first]);
1838
1839
1840 pair.second->BuildDescriptorSet(m_HandledSubPass->GetName());
1843
1844
1845 pair.second->UpdateDescriptorSet(m_ImageInfos[pair.first], m_BufferInfos[pair.first], accel);
1859 const std::string& subPassName ,
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);
1872 VkAccessFlags srcAccessMask ,
1873 VkAccessFlags dstAccessMask ,
1874 VkPipelineStageFlags srcStageMask ,
1875 VkPipelineStageFlags dstStageMask
1880 uint32_t index = m_HandledRendererSubPass->GetIndex();
1881 m_HandledRendererSubPass->AddSubPassDependency(index, index, srcAccessMask, dstAccessMask, srcStageMask, dstStageMask);
1890 m_HandledRendererSubPass->BuildSubPassDescription();
1892 const size_t index = m_Renderer->m_Pass->GetSubPasses()->size() - 1;
1893 m_HandledRendererSubPass->BuildSubPassDependency(
static_cast<uint32_t>(index));
1907 uint32_t currentFrame ,
1908 uint32_t currentImage ,
1909 const std::array<VkCommandBuffer, MaxFrameInFlight>& cmdBuffers
1915 m_HandledSubPass = *m_Renderer->m_Pass->GetSubPasses()->first();
1916 m_CommandBuffer = cmdBuffers[currentFrame];
1920 const std::string& materialName ,
1921 VkCommandBuffer cmdBuffer ,
1922 VkPipelineBindPoint bindPoint
1927 RenderBehaveBuilder::BindPipeline(materialName, cmdBuffer, bindPoint);
1931 const DescriptorSetInfo& infos ,
1932 VkCommandBuffer cmdBuffer ,
1933 VkPipelineBindPoint bindPoint
1938 RenderBehaveBuilder::BindDescriptorSet(infos, cmdBuffer, bindPoint);
1942 const DescriptorSetInfo& infos ,
1943 const std::string& name ,
1944 VkCommandBuffer cmdBuffer ,
1945 VkPipelineBindPoint bindPoint
1950 RenderBehaveBuilder::BindDescriptorSet(infos, name, cmdBuffer, bindPoint);
1957 vkCmdDispatch(m_CommandBuffer, x, y, z);
1962 VkAccessFlags srcAccessMask ,
1963 VkAccessFlags dstAccessMask ,
1964 VkPipelineStageFlags srcStageMask ,
1965 VkPipelineStageFlags dstStageMask ,
1966 uint32_t srcQueueFamilyIndex ,
1967 uint32_t dstQueueFamilyIndex ,
1968 VkCommandBuffer cmdBuffer
1974 cmdBuffer ? cmdBuffer : m_CommandBuffer ,
1979 srcQueueFamilyIndex ,
1986 VkAccessFlags srcAccessMask ,
1987 VkAccessFlags dstAccessMask ,
1988 VkPipelineStageFlags srcStageMask ,
1989 VkPipelineStageFlags dstStageMask ,
1990 uint32_t srcQueueFamilyIndex ,
1991 uint32_t dstQueueFamilyIndex ,
1992 VkCommandBuffer cmdBuffer
1998 cmdBuffer ? cmdBuffer : m_CommandBuffer ,
2003 srcQueueFamilyIndex ,
2010 VkAccessFlags srcAccessMask ,
2011 VkAccessFlags dstAccessMask ,
2012 VkPipelineStageFlags srcStageMask ,
2013 VkPipelineStageFlags dstStageMask ,
2014 VkCommandBuffer cmdBuffer
2020 cmdBuffer ? cmdBuffer : m_CommandBuffer ,
2025 VK_QUEUE_FAMILY_IGNORED ,
2026 VK_QUEUE_FAMILY_IGNORED
2032 VkAccessFlags srcAccessMask ,
2033 VkAccessFlags dstAccessMask ,
2034 VkPipelineStageFlags srcStageMask ,
2035 VkPipelineStageFlags dstStageMask ,
2036 VkCommandBuffer cmdBuffer
2041 RenderBehaveBuilder::InternalBarriers(
2046 cmdBuffer ? cmdBuffer : m_CommandBuffer
2052 VkAccessFlags srcAccessMask ,
2053 VkAccessFlags dstAccessMask ,
2054 VkPipelineStageFlags srcStageMask ,
2055 VkPipelineStageFlags dstStageMask ,
2056 uint32_t srcQueueFamilyIndex ,
2057 uint32_t dstQueueFamilyIndex ,
2058 VkCommandBuffer cmdBuffer
2063 VkBufferMemoryBarrier bufferBarrier {};
2064 bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
2065 bufferBarrier.srcAccessMask = srcAccessMask;
2066 bufferBarrier.dstAccessMask = dstAccessMask;
2067 bufferBarrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
2068 bufferBarrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
2069 bufferBarrier.size = VK_WHOLE_SIZE;
2070 bufferBarrier.buffer = buffer;
2072 vkCmdPipelineBarrier(
2073 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2085 VkAccessFlags srcAccessMask ,
2086 VkAccessFlags dstAccessMask ,
2087 VkPipelineStageFlags srcStageMask ,
2088 VkPipelineStageFlags dstStageMask ,
2089 uint32_t srcQueueFamilyIndex ,
2090 uint32_t dstQueueFamilyIndex ,
2091 VkCommandBuffer cmdBuffer
2096 VkBufferMemoryBarrier bufferBarrier {};
2097 bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
2098 bufferBarrier.srcAccessMask = srcAccessMask;
2099 bufferBarrier.dstAccessMask = dstAccessMask;
2100 bufferBarrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
2101 bufferBarrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
2102 bufferBarrier.size = VK_WHOLE_SIZE;
2103 bufferBarrier.buffer = buffer;
2105 vkCmdPipelineBarrier(
2106 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2118 VkAccessFlags srcAccessMask ,
2119 VkAccessFlags dstAccessMask ,
2120 VkPipelineStageFlags srcStageMask ,
2121 VkPipelineStageFlags dstStageMask ,
2122 VkCommandBuffer cmdBuffer
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;
2136 vkCmdPipelineBarrier(
2137 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2149 VkAccessFlags srcAccessMask ,
2150 VkAccessFlags dstAccessMask ,
2151 VkPipelineStageFlags srcStageMask ,
2152 VkPipelineStageFlags dstStageMask ,
2153 VkCommandBuffer cmdBuffer
2158 RenderBehaveBuilder::InternalBarriers(
2164 cmdBuffer ? cmdBuffer : m_CommandBuffer
2169 VkAccessFlags srcAccessMask ,
2170 VkAccessFlags dstAccessMask ,
2171 VkPipelineStageFlags srcStageMask ,
2172 VkPipelineStageFlags dstStageMask ,
2173 VkCommandBuffer cmdBuffer
2178 VkMemoryBarrier barrier {};
2179 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
2180 barrier.srcAccessMask = srcAccessMask;
2181 barrier.dstAccessMask = dstAccessMask;
2183 vkCmdPipelineBarrier(
2184 cmdBuffer ? cmdBuffer : m_CommandBuffer,
2195 VkAccessFlags srcAccessMask ,
2196 VkAccessFlags dstAccessMask ,
2197 VkPipelineStageFlags srcStageMask ,
2198 VkPipelineStageFlags dstStageMask ,
2199 VkCommandBuffer cmdBuffer
2204 RenderBehaveBuilder::InternalBarriers(
2209 cmdBuffer ? cmdBuffer : m_CommandBuffer
2215 VkAccessFlags srcAccessMask ,
2216 VkAccessFlags dstAccessMask ,
2217 VkPipelineStageFlags srcStageMask ,
2218 VkPipelineStageFlags dstStageMask ,
2219 uint32_t srcQueueFamilyIndex ,
2220 uint32_t dstQueueFamilyIndex ,
2221 VkCommandBuffer cmdBuffer
2226 RenderBehaveBuilder::AddBarriers(
2232 srcQueueFamilyIndex ,
2233 dstQueueFamilyIndex ,
2234 cmdBuffer ? cmdBuffer : m_CommandBuffer
2240 VkAccessFlags srcAccessMask ,
2241 VkAccessFlags dstAccessMask ,
2242 VkPipelineStageFlags srcStageMask ,
2243 VkPipelineStageFlags dstStageMask ,
2244 uint32_t srcQueueFamilyIndex ,
2245 uint32_t dstQueueFamilyIndex ,
2246 VkCommandBuffer cmdBuffer
2251 RenderBehaveBuilder::ReleaseBarriers(
2257 srcQueueFamilyIndex ,
2258 dstQueueFamilyIndex ,
2259 cmdBuffer ? cmdBuffer : m_CommandBuffer
2265 VkAccessFlags srcAccessMask ,
2266 VkAccessFlags dstAccessMask ,
2267 VkPipelineStageFlags srcStageMask ,
2268 VkPipelineStageFlags dstStageMask ,
2269 uint32_t srcQueueFamilyIndex ,
2270 uint32_t dstQueueFamilyIndex ,
2271 VkCommandBuffer cmdBuffer
2276 RenderBehaveBuilder::AddBarriers(
2282 srcQueueFamilyIndex ,
2283 dstQueueFamilyIndex ,
2284 cmdBuffer ? cmdBuffer : m_CommandBuffer
2290 VkAccessFlags srcAccessMask ,
2291 VkAccessFlags dstAccessMask ,
2292 VkPipelineStageFlags srcStageMask ,
2293 VkPipelineStageFlags dstStageMask ,
2294 uint32_t srcQueueFamilyIndex ,
2295 uint32_t dstQueueFamilyIndex ,
2296 VkCommandBuffer cmdBuffer
2301 RenderBehaveBuilder::ReleaseBarriers(
2307 srcQueueFamilyIndex ,
2308 dstQueueFamilyIndex ,
2309 cmdBuffer ? cmdBuffer : m_CommandBuffer
2314 const std::string& subPassName ,
2327 m_Renderer->m_DGCData[subPassName]->ResetCommandsLayout();
2328 m_HandledDGCData = m_Renderer->m_DGCData[subPassName];
2336
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;
2342 input.stream =
static_cast<uint32_t>(m_InputInfos.size());
2345 input.pIndexTypes =
nullptr;
2346 input.pIndexTypeValues =
nullptr;
2349
2350
2351 m_InputInfos.push_back(input);
2352 m_HandledDGCData->AddInputStride(
sizeof(VkBindShaderGroupIndirectCommandNV));
2362
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;
2368 input.vertexBindingUnit = 0;
2369 input.vertexDynamicStride = VK_FALSE;
2371 input.stream =
static_cast<uint32_t>(m_InputInfos.size());
2374 input.pIndexTypes =
nullptr;
2375 input.pIndexTypeValues =
nullptr;
2378
2379
2380 m_InputInfos.push_back(input);
2381 m_HandledDGCData->AddInputStride(
sizeof(VkBindVertexBufferIndirectCommandNV));
2391
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;
2397 input.stream =
static_cast<uint32_t>(m_InputInfos.size());
2400 input.pIndexTypes =
nullptr;
2401 input.pIndexTypeValues =
nullptr;
2404
2405
2406 m_InputInfos.push_back(input);
2407 m_HandledDGCData->AddInputStride(
sizeof(VkBindIndexBufferIndirectCommandNV));
2416 std::stringstream ss;
2420
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;
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);
2431 input.stream =
static_cast<uint32_t>(m_InputInfos.size());
2434 input.pIndexTypes =
nullptr;
2435 input.pIndexTypeValues =
nullptr;
2438
2439
2440 m_InputInfos.push_back(input);
2441 m_HandledDGCData->AddInputStride(
sizeof(VkDeviceAddress));
2451
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;
2457 input.stream =
static_cast<uint32_t>(m_InputInfos.size());
2460 input.pIndexTypes =
nullptr;
2461 input.pIndexTypeValues =
nullptr;
2464
2465
2466 m_InputInfos.push_back(input);
2467 m_HandledDGCData->AddInputStride(
sizeof(VkDrawIndexedIndirectCommand));
2477
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;
2483 input.stream =
static_cast<uint32_t>(m_InputInfos.size());
2486 input.pIndexTypes =
nullptr;
2487 input.pIndexTypeValues =
nullptr;
2490
2491
2492 m_InputInfos.push_back(input);
2493 m_HandledDGCData->AddInputStride(
sizeof(VkDrawMeshTasksIndirectCommandNV));
2503
2504
2505 m_HandledDGCData->BuildCommandLayout(m_InputInfos);
2510 std::shared_ptr<
Material> material,
2524
2525
2526 VulkanPipeline::DefaultPipelineConfigInfo(m_pipelineConfig);
2535 m_pipelineConfig.bindingDescriptions = {};
2544 m_pipelineConfig.attributeDescriptions = {};
2550 const std::vector<VkVertexInputBindingDescription>& inputs
2555 m_pipelineConfig.bindingDescriptions = inputs;
2561 const std::vector<VkVertexInputAttributeDescription>& inputs
2566 m_pipelineConfig.attributeDescriptions = inputs;
2575 m_pipelineConfig.renderPass = m_Renderer->m_Pass;
2584 m_pipelineConfig.subpass = m_HandledSubPass->GetIndex();
2593 m_pipelineConfig.pipelineLayout = layout;
2602 m_pipelineConfig.rasterizationInfo.cullMode = cullMode;
2611 m_pipelineConfig.colorBlendInfo.attachmentCount =
static_cast<uint32_t>(m_HandledSubPass->GetColorBlend().size());
2612 m_pipelineConfig.colorBlendInfo.pAttachments = m_HandledSubPass->GetColorBlend().data();
2621 const auto pipeline = std::make_shared<VulkanPipeline>(
2622 m_Renderer->m_VulkanState ,
2623 m_Material->GetName() ,
2624 m_Material->GetShaderPath() ,
2628 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2630 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2633 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2640 const auto pipeline = std::make_shared<VulkanMeshPipeline>(
2641 m_Renderer->m_VulkanState ,
2642 m_Material->GetName() ,
2643 m_Material->GetShaderPath() ,
2647 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2649 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2652 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2659 const auto pipeline = std::make_shared<VulkanComputePipeline>(
2660 m_Renderer->m_VulkanState ,
2661 m_Material->GetName() ,
2662 m_Material->GetShaderPath() ,
2666 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2668 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2671 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2678 std::unordered_map<std::string, std::vector<std::string>> stages(m_Material->GetShaderPath());
2679 for (
auto& pair : hitGroups)
2681 stages[
"rchit"].push_back(pair.first);
2684 const auto pipeline = std::make_shared<VulkanRayTracingPipeline>(
2685 m_Renderer->m_VulkanState ,
2686 m_Material->GetName() ,
2691 if (m_Renderer->m_Pipelines.HasKey(m_Material->GetName()))
2693 m_Renderer->m_RenderCache->PushToCaches(m_Renderer->m_Pipelines.Find(m_Material->GetName()));
2696 m_Renderer->m_Pipelines.Insert(m_Material->GetName(), pipeline);
2703 indirectPtr->CreateMeshPipeline(pipelineName, materialName, m_pipelineConfig);
static constexpr uint32_t MAX_DIRECTIONALLIGHT_NUM
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
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.
Material Class. This class contains a branch of parameter and shader, also descriptor.
const SpicesShader::PointLight & GetLight() const
Get the PointLight variable.
PointLightComponent Class. This class defines the specific behaves of PointLightComponent.
Basic interface of Queries.
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.
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.
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.
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....
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
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.
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...
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.
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.
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...
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.
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(...
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....
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.
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.
void BeginNextSubPassAsync(const std::string &subPassName)
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_GRAPHICS)
Bind the pipeline created by CreatePipeline(). Called on RenderBehaveBuilder instanced.
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.
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.
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.
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.
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.
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.
void Recording(const std::string &caption) const
Recording all this behaves does.
void RunDGC(VkCommandBuffer cmdBuffer=VK_NULL_HANDLE) const
Run DGC Buffer.
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
virtual void BeginRenderPass()
Begin this Renderer's RenderPass.
void Await(std::function< void(const VkCommandBuffer &cmdBuffer)> func) const
Await Async Commands.
void Wait(std::future< VkCommandBuffer > &futureCmdBuffer) const
Wait for merge secondary commandBuffers.
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.
void ExecuteDGCAsync_NV() const
Execute Device Generated CommandsBuffer Async.
std::future< VkCommandBuffer > Async(std::function< void(const VkCommandBuffer &cmdBuffer)> func) const
Async Commands.
void BeginRenderPassAsync()
Begin this Renderer's RenderPass Async.
void SetViewPort(const VkCommandBuffer &cmdBuffer=VK_NULL_HANDLE) const
DynamicState Set Viewport and Scissor.
virtual void EndRenderPass()
End this Renderer's RenderPass.
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.
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().
RendererPassBuilder & EndSubPass()
End recording a sub pass.
void Build() const
Build the RendererPass.
Renderer * m_Renderer
Specific Renderer pointer. Passed while this class instanced.
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.
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().
std::string m_RendererName
Specific renderer name, Passed by instanced.
void RegistryDGCPipeline(const std::string &materialName, const std::string &subPassName, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Registry dgc pipeline to Specific Renderer.
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.
void RegistryMaterial(const std::string &materialName, const std::string &subPassName)
Registry material to Specific Renderer.
bool m_IsActive
Whether this renderer is active(submit commands in RendererBehaveBuilder).
virtual void OnSlateResize()
virtual void OnMeshAddedWorld()
std::shared_ptr< Material > GetDefaultMaterial(const std::string &subPassName) const
Get default material using sub pass Name.
void GetDirectionalLightMatrix(FrameInfo &frameInfo, std::array< glm::mat4, MAX_DIRECTIONALLIGHT_NUM > &directionalLight)
void CreateDefaultMaterial()
Create Specific Renderer Default Material.
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.
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.
bool m_IsLoadDefaultMaterial
Whether should load a default renderer material.
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.
DescriptorSetManager::DescriptorSetCombineFlags m_DescriptorSetCombine
Combination of DescriptorSet.
std::tuple< glm::mat4, glm::mat4, unsigned int, float > GetActiveCameraMatrix(FrameInfo &frameInfo)
Get The activated camera entity's view matrix and projection matrix.
virtual void OnSystemInitialize()
This interface is called on render system is registered. Initialize the specific renderer's pipeline,...
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
void GetDirectionalLight(FrameInfo &frameInfo, std::array< SpicesShader::DirectionalLight, SpicesShader::DIRECTIONALLIGHT_BUFFER_MAXNUM > &dLightBuffer)
Get DirectionalLightComponent's render data in World.
void GetPointLight(FrameInfo &frameInfo, std::array< SpicesShader::PointLight, SpicesShader::POINTLIGHT_BUFFER_MAXNUM > &pLightBuffer)
Get PointLightComponent's render data in World.
void CreateDGCMaterial(const std::string &subPass, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Create Specific Renderer DGC Material.
Renderer Class. This class defines the basic behaves of renderer. When we add an new Renderer,...
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.
uint32_t width
Texture' width.
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.
This struct contains all Vulkan object in used global.